我想在 Ubuntu 上编写一个简单的桌面应用程序,我认为一个简单的方法是使用 Qt 和 QML 作为 GUI 和 Python 作为逻辑语言,因为我对 Python 有点熟悉。
现在我尝试了几个小时以某种方式连接 GUI 和逻辑,但它不起作用。我管理了连接 QML --> Python,但不是相反。我有代表我的数据模型的 Python 类,并添加了 JSON 编码和解码函数。因此,目前不涉及 SQL 数据库。但也许 QML 视图和某些数据库之间的直接连接会使事情变得更容易?
所以现在一些代码。
QML --> Python
QML 文件:
ApplicationWindow {
// main window
id: mainWindow
title: qsTr("Test")
width: 640
height: 480
signal tmsPrint(string text)
Page {
id: mainView
ColumnLayout {
id: mainLayout
Button {
text: qsTr("Say Hello!")
onClicked: tmsPrint("Hello!")
}
}
}
}
然后我有我的slots.py:
from PySide2.QtCore import Slot
def connect_slots(win):
win.tmsPrint.connect(say_hello)
@Slot(str)
def say_hello(text):
print(text)
最后是我的 main.py:
import sys
from controller.slots import connect_slots
from PySide2.QtWidgets import QApplication
from PySide2.QtQml import QQmlApplicationEngine
if __name__ == '__main__':
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load('view/main.qml')
win = engine.rootObjects()[0]
connect_slots(win)
# show the window
win.show()
sys.exit(app.exec_())
这工作正常,我可以打印“你好!”。但这是最好的方法,还是创建一个带有插槽的类并使用setContextProperty
能够直接调用它们而不添加额外的信号更好?
Python --> QML
我无法完成这件事。我尝试了不同的方法,但都没有奏效,我也不知道哪一种最好用。我想要做的是例如显示对象列表并提供在应用程序中操作数据的方法等。
- 包括 Javascript:我添加了一个带有函数的附加文件
application.js
,只是为了打印一些东西,但它可能用于设置文本字段的上下文等。然后我尝试使用 QMetaObject 和 invokeMethod,但只是出现错误参数等错误。
这种方法有意义吗?其实我不知道任何javascript,所以如果没有必要,我宁愿不使用它。
ViewModel 方法我创建了一个文件 viewmodel.py
from PySide2.QtCore import QStringListModel class ListModel(QStringListModel): def __init__(self): self.textlines = ['hi', 'ho'] super().__init__()
在 main.py 我添加了:
model = ListModel()
engine.rootContext().setContextProperty('myModel', model)
ListView 看起来像这样:
ListView {
width: 180; height: 200
model: myModel
delegate: Text {
text: model.textlines
}
}
我收到一个错误“myModel is not defined”,但我想它无论如何都不能工作,因为代表只接受一个元素而不是一个列表。这种方法是一个好方法吗?如果是,我该如何让它工作?
- 在 QML 视图中操作数据是否有完全不同的方法?
我感谢您的帮助!我知道 Qt 文档,但我对它不满意。所以也许我错过了一些东西。但是 PyQt 似乎比 PySide2 更受欢迎(至少谷歌搜索似乎表明这一点)并且 PySide 引用经常使用 PySide1 或不使用 QML QtQuick 的做事方式......