- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想恢复主控“main.qml”的位置和大小。但我不知道如何声明新窗口的父窗口。如果我直接从 javascript 中的窗口 main.qml 打开窗口,我没有问题,但通过 python 我不知道如何打开。
我想我必须使用“self.win”,但如何声明它?
感谢您的回复。
测试.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot
import sys
class Main2(QObject):
def __init__(self, engine, what_send_for_send_the_parent):
QObject.__init__(self)
"""
How can I say to the new windows who is the parent ?
"""
context = engine.rootContext()
context.setContextProperty("py_Page2", self)
engine.load('test2.qml')
self.win = engine.rootObjects()[0]
class Main(QObject):
def __init__(self, engine):
QObject.__init__(self)
self.context = engine.rootContext()
self.property = self.context.setContextProperty("py_Page", self)
self.load = engine.load('test.qml')
self.win = engine.rootObjects()[0]
print("Context", self.context) # <PyQt5.QtQml.QQmlContext object at 0xb65e6f30>
print("Property", self.property)# None
print("Load", self.property) # None
print("Win", self.win) # <PyQt5.QtGui.QWindow object at 0xb65e6f80>
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
main = Main(engine)
main2 = Main2(engine, "???")
engine.quit.connect(app.quit)
sys.exit(app.exec_())
测试.qml
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
id: "main"
visible: true
width: 200; height: 240;
Text {text: qsTr("main")}
}
test2.qml
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
id: "main2"
visible: true
width: 200; height: 240;
x: main.x
y: main.y
Text {text: qsTr("main2")}
}
<小时/>
我想我已经找到了:
class Main2(QObject):
def __init__(self, engine, master):
QObject.__init__(self)
context = engine.rootContext()
context.setContextProperty("main_x", master.win.property("x"))
context.setContextProperty("main_y", master.win.property("y"))
engine.load('test2.qml')
...
main = Main(engine)
main2 = Main2(engine, main)
...
并在qml文件中
ApplicationWindow {
id: "main2"
visible: true
width: 200; height: 240;
x: main_x + 20
y: main_y + 120
Text {text: qsTr("main2")}
}
我可以这样恢复值。它是否正确?有没有更传统的方法?
最佳答案
虽然该解决方案在这种情况下有效,但在更实际的情况下可能会失败,在这种情况下,每个 QML 可以加载许多组件,因为 QML 加载是异步的,但您的过程是同步的。
解决方案是创建一个 QObject 并使用 setContextProperty() 将其导出到 QML,以便可以从通过 QQmlApplicationEngine 加载的所有 QML 访问它。该 QObject 必须具有一个属性,该属性是您想要获取的属性的镜像。
main.py
from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject, QPoint, QUrl
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
class Manager(QObject):
positionChanged = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self._position = QPoint()
@pyqtProperty(QPoint, notify=positionChanged)
def position(self):
return self._position
@position.setter
def position(self, p):
if self._position != p:
self._position = p
self.positionChanged.emit()
if __name__ == "__main__":
import os
import sys
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
manager = Manager()
engine.rootContext().setContextProperty("manager", manager)
current_dir = os.path.dirname(os.path.realpath(__file__))
engine.load(QUrl.fromLocalFile(os.path.join("test.qml")))
engine.load(QUrl.fromLocalFile(os.path.join("test2.qml")))
engine.quit.connect(app.quit)
sys.exit(app.exec_())
测试.qml
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
id: root
visible: true
width: 200
height: 240
Text {
text: qsTr("main")
}
Component.onCompleted: manager.position = Qt.point(root.x, root.y)
}
test2.qml
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
visible: true
width: 200
height: 240
x: manager.position.x
y: manager.position.x
Text {
text: qsTr("main2")
}
}
关于python - 如何将父级发送到新的 ApplicationWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58365066/
我想恢复主控“main.qml”的位置和大小。但我不知道如何声明新窗口的父窗口。如果我直接从 javascript 中的窗口 main.qml 打开窗口,我没有问题,但通过 python 我不知道如何
让我们考虑这个代码片段: ApplicationWindow { /**/ states: State {} /**/ } 运行应用程序时,我得到 Cannot assign
我正在编译一个开源备份应用程序。我希望不要使用 X 或任何组合键(例如 Windows 中的 Alt+F4)关闭应用程序。在这种情况下,我更喜欢将应用程序最小化到系统托盘。 我是 Java 新手,到目
我正在使用 Python 3.6,我正尝试从 glade xml 文件创建一个应用程序窗口,如下所示: builder = Gtk.Builder() builder.add_from_file("u
我在尝试从一个 ApplicationWindow 切换到另一个时遇到了这个问题。 我有一个名为 login.qml 的第一个窗口,它通过以下信号打开 main.qml: onIdAutenticad
我使用 JFace 的 ApplicationWindow 创建了一个简单的窗口,并尝试添加菜单栏。 public MainWindow() { super(null); this.a
有没有人在使用 ApplicationWindow 时能够热重载所有 QML 文件? ?我发现了一些例子,如 https://qml.guide/live-reloading-hot-reloadin
我想创建一个 Popup modal覆盖整个根 ApplicationWindow , 但我想在我正在构建的小部件容器中实例化此 Popup ,它将深度嵌套在 QML 层次结构中。不幸的是,实例化一个
我想创建一个 Popup modal覆盖整个根 ApplicationWindow , 但我想在我正在构建的小部件容器中实例化此 Popup ,它将深度嵌套在 QML 层次结构中。不幸的是,实例化一个
我用一个 main.qml 创建了一个简单的 Qt 快速应用程序,就像下面的代码。问题是窗口的背景颜色没有设置为 #ffffff ,而是设置为浅灰色(我认为是 Windows 上窗口的默认颜色)。矩形
我有一个名为 main.qml 的文件,它实例化了 ApplicationWindow . 我想在其他 qml 文件中访问这个对象(应用程序)。 ApplicationWindow { id:
我想默认将我的应用程序设置为 180 度方向。在 ApplicationWindow 级别旋转屏幕的 API 是什么?我的应用程序中有工具栏和状态栏,因此我需要旋转 ApplicationWindow
我想默认将我的应用程序设置为 180 度方向。在 ApplicationWindow 级别旋转屏幕的 API 是什么?我的应用程序中有工具栏和状态栏,因此我需要旋转 ApplicationWindow
如何在 C++ 中获取 QML ApplicationWindow 的大小? QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral
如何正确扩展 QML ApplicationWindow 类型?根据文档,ApplicationWindow 实例化了一个 QQuickWindow。所以我尝试从 QQuickWindow 进行子类化
我在为用 QtQuick 编写的应用程序绑定(bind)“关闭时”事件时遇到问题。我想做的是执行标准的“确认退出”方法,也许我的做法是错误的。 据我了解,我想要类似的东西 void MainDrive
我像这样测试一个简单的 QML(Qt sdk 版本 5.3.2)程序 import QtQuick 2.3 import QtQuick.Controls 1.2 ApplicationWindow
默认情况下,Qml 控件带有一个很好的类似原生的主题。当我通过解释器将我的程序作为 qml 文件运行时,它看起来很棒,但是,一旦我将我的代码复制到 C++ 后端并构建它,它看起来完全没有主题而且非常平
我想使用 ApplicationWindow 作为主文件,并能够使用 从 C++ 切换到其他 QML 文件>QQuickView::setSource(const QUrl & url)。基本上它会这
我是 Qt quick control 2 开发的新手。我正在为 android 开发一个跨平台应用程序。我正在从 C++ 代码加载新屏幕,如下所示 int main(int argc, char *
我是一名优秀的程序员,十分优秀!