【问题标题】:How to bind buttons in Qt Quick to Python PyQt 5如何将 Qt Quick 中的按钮绑定到 Python PyQt 5
【发布时间】:2014-07-29 11:42:45
【问题描述】:

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

【问题讨论】:

  • 您展示的代码是打印hello的python代码,您还想具体做什么不能放在那里的?
  • 这个应用很简单,我就是想把qml按钮和pyqt连接起来。我的真实应用程序将使用按钮开始与 Web 服务的通信。
  • 您要求提供 PyQt + QML 的示例。这是一个数独游戏的链接,其中所有逻辑都使用 Python,UI 使用 QML:github.com/pkobrien/sudoku-qml

标签: python qt pyqt qml qt-quick


【解决方案1】:

如果为按钮命名,则可以连接到它的 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

请注意,在上面的 Button 中,onClicked 只是发出 messageRequired 信号,因此最好放弃自定义信号并直接连接到 clicked。当您单击按钮时,onClicked() 和连接到clicked 的任何插槽都将被调用。

【讨论】:

  • 旧示例不起作用。 PyQt5 没有 QDeclarativeView 类,如here 所说;最后,我找不到与我在演示中尝试做的类似的事情。
  • 我得到的只是:回溯(最近一次调用最后一次):文件“.\main.py”,第 29 行,在 win.myButton.messageRequired.connect(myFunction) AttributeError: ' QWindow'对象没有属性'myButton'
  • 哦!稍微改变一下结果就可以了!如果我将“信号 messageRequired”作为 ApplicationWindow 的直接子属性,我可以在 python 中捕获信号。你知道如何从按钮指定的信号中捕获信号吗? @Schollii
  • @Daivid 我已更新:要找到您必须使用 objectName 属性的按钮(id 不会这样做),并且 Button 中的信号有效。
  • 这可能是一个糟糕的架构。 QML 可能是 Python 中模型或业务逻辑层之上的 UI 层。模型层不应该知道按钮正在控制它,因为那时您可以轻松地将控件更改为手势或其他控件。 UI 层应该知道它控制和查看一些模型。为此,您需要在 Python 中实现一些模型类并将其注册到 QML。然后在 QML 中,您可以将按钮的单击信号连接到模型实例的某个插槽。我也为此苦苦挣扎:github.com/bootchk/demoQMLPyQt.git
【解决方案2】:

还有另一种在 QML 中使用 Python 模型 (QObject) 的解决方案。

Python

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

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2012-10-30
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2021-05-15
    相关资源
    最近更新 更多