- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下情况,我想使用几个Qml:“welcome.qml”,“create.qml”,“dashboard.qml”
什么情况下使用QQuickview或QqmlApplicationEngine?
我使用“QQmlAplicatiobEngine”并使用findChild在对象中搜索以获取信号,并处理逻辑,如果信号完成一个条件,我使用engine.load加载另一个QML。
python :
class guiBackend(QObject):
def __init__(self):
self.engine = QQmlApplicationEngine()
self.context = self.engine.rootContext()
self.context.setContextProperty("main", self.engine)
self.welcome()
def welcome(self):
self.engine.load("welcome.qml")
self.engine.rootObjects()[0].show()
ob = self.engine.rootObjects()[0]
next = ob.findChild(QObject, "timer")
print(dir(next))
if path.exists('data.some'):
next.change.connect(self.open_account)
else:
next.change.connect(self.create_account)
def create(self):
self.engine.rootObjects()[0].close()
self.engine.load("create.qml")
self.engine.rootObjects()[1].show()
add = ob.findChild(QObject, "addWallet")
recovery = ob.findChild(QObject, "recovery")
add.change.connect(self.add_account)
recovery.change.connect(self.recovery)
#self.open_account load dashboard.qml and self.account load form.qml
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
gui = guiBackend()
sys.exit(app.exec_())
Qml:
ApplicationWindow {
id: welcome
width: 650; height: 390
opacity: 1
visible: true
minimumHeight: 232
minimumWidth:226
title: "open account"
flags: Qt.SplashScreen
Item {
id: element
x: 9
y: 88
width: 560
height: 300
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
Timer {
signal change
objectName: "timer"
interval: 5000; running: true; repeat: false
onTriggered: change()
}
Image {
id: image
x: 130
y: 60
width: 342
height: 188
anchors.verticalCenterOffset: -56
anchors.horizontalCenterOffset: 0
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
source: "neirons_logo.png"
fillMode: Image.PreserveAspectFit
}
AnimatedImage {
id: animatedImage
x: 236
y: 200
width: 100
height: 100
source: "loading.gif"
}
}
}
创建.qml:
ApplicationWindow {
id: create
width: 210; height: 210
Rectangle {
id: rectangle
x: 70
y: 132
width: 200
height: 200
color: "#72ded8"
anchors.verticalCenterOffset: 0
anchors.horizontalCenterOffset: 0
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
ColumnLayout {
x: 60
y: 73
width: 109
height: 128
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
TextInput {
id: nameAccount
objectName: textAccount
text: qsTr("nameAccount")
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.preferredHeight: 20
Layout.preferredWidth: 80
verticalAlignment: Text.AlignVCenter
font.pixelSize: 12
}
TextInput {
id: nameAccount
objectName: textAccount
text: qsTr("Name Account")
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.preferredHeight: 20
Layout.preferredWidth: 80
font.pixelSize: 12
}
}
Button {
signal addinfo
id: submitNameAccount
objectName: submit
x: 50
y: 134
width: 81
height: 23
text: qsTr("Add")
font.bold: true
font.pointSize: 12
anchors.horizontalCenter: parent.horizontalCenter
onClicked: addinfo()
}
}
使用 QQuickview 或 QQmlAplicationEngine 效果更好。
最佳答案
根据OP提供的内容,我将指出以下几个方面:
什么时候应该使用QQmlAplicationEngine
或QQuickview
? QQmlAplicationEngine
还是 QQuickview
更好?
其中之一的使用取决于 QML 的根元素,如果根元素是 Window 或 ApplicationWindow 那么您必须使用 QQmlAplicationEngine,如果它是一个 Item 或其衍生物,您可以使用 QQuickView。所以对于上面的一个并不比另一个更好。如果我使用根窗口加载 QML 或使用 QQuickView 加载 ApplicationWindow 会发生什么?然后它将显示 2 个窗口:一个来自 QQuickView,另一个来自 Window 或 ApplicationWindow。如果我使用 QQmlApplicationEngine 加载带有 Item 的 QML 会怎样?那么您需要将其放置在窗口内,如 the docs 所示。 :
Unlike QQuickView, QQmlApplicationEngine does not automatically create a root window. If you are using visual items from Qt Quick, you will need to place them inside of a Window.
不要从 python/C++ 访问 QML 元素
QML 有自己的变量处理方式,因此您可以随时删除或创建它,没有任何确定的内容,因此访问这些对象可能很危险,因为它们可能没有分配内存。正确的做法是做相反的事情,将 QObject 导出到 QML 并在 QML 中建立连接。
我们将把上述概念应用到OP提供的代码中(有些类型我已经更正了)。
首先,既然根是ApplicationWindow,那么就应该使用QQmlApplicationEngine。
您可以使用 setContextProperty 将后端导出到 QML,然后直接调用插槽,而不是在每个元素中创建“更改”信号。使用 rootObjects() 获取对象是危险的,因为存在异步加载的 qml,而应使用 objectCreated 信号。
main.py
import os
from PyQt5 import QtCore, QtGui, QtQml
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
class Backend(QtCore.QObject):
def __init__(self, parent=None):
super().__init__(parent)
self._engine = QtQml.QQmlApplicationEngine()
self._welcome = None
self._wallet = None
self.engine.objectCreated.connect(self.on_object_created)
self.engine.rootContext().setContextProperty("backend", self)
self.load_welcome()
@property
def engine(self):
return self._engine
@property
def welcome(self):
return self._welcome
@property
def wallet(self):
return self._wallet
@staticmethod
def create_url(qml):
return QtCore.QUrl.fromLocalFile(os.path.join(CURRENT_DIR, qml))
def load_welcome(self):
self.engine.load(self.create_url("welcome.qml"))
@QtCore.pyqtSlot(QtCore.QObject, QtCore.QUrl)
def on_object_created(self, obj, url):
if url == self.create_url("welcome.qml"):
self._welcome = obj
elif url == self.create_url("wallet.qml"):
self._wallet = obj
@QtCore.pyqtSlot()
def create_wallet(self):
self.welcome.close()
self.engine.load(self.create_url("wallet.qml"))
@QtCore.pyqtSlot()
def add_info(self):
print("add_info")
if __name__ == "__main__":
import sys
app = QtGui.QGuiApplication(sys.argv)
backend = Backend()
sys.exit(app.exec_())
欢迎.qml
import QtQuick 2.14
import QtQuick.Controls 2.14
ApplicationWindow {
id: root
width: 650; height: 390
opacity: 1
visible: true
minimumHeight: 232
minimumWidth:226
title: "open account"
flags: Qt.SplashScreen
Item {
id: element
x: 9
y: 88
width: 560
height: 300
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
Timer {
interval: 5000; running: true; repeat: false
onTriggered: backend.create_wallet()
}
Image {
id: image
x: 130
y: 60
width: 342
height: 188
anchors.verticalCenterOffset: -56
anchors.horizontalCenterOffset: 0
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
source: "neirons_logo.png"
fillMode: Image.PreserveAspectFit
}
AnimatedImage {
id: animatedImage
x: 236
y: 200
width: 100
height: 100
source: "loading.gif"
}
}
}
钱包.qml
import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14
ApplicationWindow {
id: root
visible: true
width: 210; height: 210
Rectangle {
id: rectangle
x: 70
y: 132
width: 200
height: 200
color: "#72ded8"
anchors.verticalCenterOffset: 0
anchors.horizontalCenterOffset: 0
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
ColumnLayout {
x: 60
y: 73
width: 109
height: 128
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
TextInput {
id: nameAccount1
text: qsTr("nameAccount")
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.preferredHeight: 20
Layout.preferredWidth: 80
verticalAlignment: Text.AlignVCenter
font.pixelSize: 12
}
TextInput {
id: nameAccount2
text: qsTr("Name Account")
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.preferredHeight: 20
Layout.preferredWidth: 80
font.pixelSize: 12
}
}
Button {
id: submitNameAccount
x: 50
y: 134
width: 81
height: 23
text: qsTr("Add")
font.bold: true
font.pointSize: 12
anchors.horizontalCenter: parent.horizontalCenter
onClicked: backend.add_info()
}
}
}
关于python - 关于QML和PySide2的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60395623/
如果下一个元素的宽度超过指定布局的宽度,是否有 QML 布局或某些配置会自动将 QML 项目包装到下一行? 当我使用 QML GridLayout ,项目刚好离开窗口的边缘并被剪裁: GridLayo
如果下一个元素的宽度超过指定布局的宽度,是否有 QML 布局或某些配置会自动将 QML 项目包装到下一行? 当我使用 QML GridLayout ,项目刚好离开窗口的边缘并被剪裁: GridLayo
如何在 qml 文件之间发送变量或信号? http://i.stack.imgur.com/MChCG.png Mainwindow -> 创建组件Item2.qml MainWindow -> 创建
我正在做一些事情,我有一个名为“FloatingMenu”的类(它应该在 C++ 中管理菜单)及其在文件 FloatingMenu.qml 中用于 GUI 的 QML alter-ego。我有一个文件
我正在尝试做一些看似简单的事情,但失败了:定义一个简单的内联文本格式组件,然后用不同的文本多次实例化它。这是代码 Item { . . . Component { id: favButtonL
我可以在页面中使用 InvokeActionItem 轻松共享项目,但我需要能够在 ListView 项目中调用它。我设法触发了一个调用,但我不知道如何在触发它时添加数据。我不断收到错误消息 Invo
我如何在 QML 中检测 Window {} 之外的点击? Rectangle { id: topLevel height: 400; width: 400 Window {
我试过 : var child = grid.children[slot1]; grid.children[slot1] = grid.children[slot2]; grid.children[s
例如,我希望创建一个包含 100 个文本编辑器的 qml 窗口,如何在循环中创建它?那可能吗? 最佳答案 循环是命令式代码,所以它不是 QML,而是 Javascript 或 C++。所以当然,你可以
这是我的 QML 文件,其中包含一个文本组件: import QtQuick 2.0 Item { id: idItmWrapText Text { id: idTxt
我正在寻找一种方法来显示一个文本提示,说明预期的输入作为对用户的建议。以谷歌搜索栏为例: 是否有我缺少的属性,或者这是必须通过脚本来实现的? 最佳答案 Qt Quick 输入项上不存在该属性。您可以为
为 qml 项设置背景的最简单方法是让子矩形的 anchor 完全填满父项: Item { width: 320 height: 240 Rectangle {
我想将属性动态添加到 QML 元素: Item { id: dynamicProperty; property int first; Component.onCompleted: { /*
我用 PySide 和 QML 编写了某种安装程序。按照设计,它必须是多页的。而且我想将要从 QML 表单调用的插槽划分为不同的对象(理想情况下,划分为模块,但据我了解,带有插槽的对象必须继承 QOb
QML 中有没有办法用 opacity: 0 创建一个矩形?仍然有可见的边界?如果没有,有关如何解决它的任何建议? 谢谢 最佳答案 不,不透明度适用于项目的完整视觉方面(并且不透明度:0 使项目完全不
属性变体 a:{}似乎不起作用。 a 最终未定义,而不是一个空字典。 我对 Javascript 不是很有经验...初始化属性以保存空字典的正确方法是什么? 以下 qml 在控制台上打印“qrc:/m
我在 SO 上查看了大量关于 QML 内容边距的问题,但所有答案都指向缺少 spacing: 0 属性。我已经完成了所有这些,但仍然有一些我无法消除的奇怪空间。任何人都可以解释为什么这个 QML 代码
我有一个用于样式定义的 QML 单例,定义如下: pragma Singleton import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQu
这是以下代码的结果: 主.qml import QtQuick 2.8 Item { Reusable { index: 1234 // reusable with
属性变体 a:{}似乎不起作用。 a 最终未定义,而不是一个空字典。 我对 Javascript 不是很有经验...初始化属性以保存空字典的正确方法是什么? 以下 qml 在控制台上打印“qrc:/m
我是一名优秀的程序员,十分优秀!