如何将Qt Quick中的按钮绑定到Python PyQt 5

时间:2014-06-08 22:54:27

标签: python qt pyqt qml qt-quick

如何将我在.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)?

2 个答案:

答案 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")
    }
}

参考

  1. https://wiki.qt.io/Qt_for_Python/Connecting_QML_Signals