如何将我在.qml脚本中创建的按钮绑定到python PyQt5代码?
例如: 蟒:
import sys
from PyQt5.QtCore import QObject, QUrl, Qt
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQml import QQmlApplicationEngine
if __name__ == "__main__":
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
ctx = engine.rootContext()
ctx.setContextProperty("main", engine)
engine.load('test.qml')
win = engine.rootObjects()[0]
win.show()
sys.exit(app.exec_())
QML:
import QtQuick 2.2
import QtQuick.Window 2.1
import QtQuick.Controls 1.2
import QtQuick.Dialogs 1.1
ApplicationWindow {
title: qsTr("Test Invoke")
width: 200
height: 100
Button{
y : 70
text : "About"
onClicked: {
print('Hello')
}
}
}
单击按钮时,如何使用Python执行某些操作? 另外:是否有人拥有良好的示例或文档资源。关于pyqt + qml(qt quick)?
答案 0 :(得分:3)
如果您为该按钮命名,则可以连接到其onClick信号,或者连接到onClicked
中发出的自定义信号。示例:
ApplicationWindow {
title: qsTr("Test Invoke")
width: 200
height: 100
Button {
signal messageRequired
objectName: "myButton"
y : 70
text : "About"
onClicked: messageRequired()
}
}
注意Button中的信号和objectName属性。然后,exec
之前的Python代码可以是例如:
def myFunction():
print 'handler called'
button = win.findChild(QObject, "myButton")
button.messageRequired.connect(myFunction)
button.clicked.connect(myFunction) # works too
请注意,在上面的按钮中,onClicked
只会发出messageRequired
信号,因此最好放弃自定义信号并直接连接到clicked
。当您单击按钮时,onClicked()
和连接到clicked
的任何插槽都会被调用。
答案 1 :(得分:0)
还有另一种使用 QML 中的 Python 模型 (QObject) 的解决方案。
蟒蛇
engine = QQmlApplicationEngine()
engine.load("main.qml")
class Greeter(QObject):
@pyqtSlot(str)
def sayHello(self, name):
print("Hello, " + name)
ctx = engine.rootContext()
ctx.setContextProperty("greeter", Greeter())
QML
Button {
onCliked: {
greeter.sayHello("Alice")
}
}
参考