【问题标题】:Change label in QML when button is pressed using PyQt5 in python [duplicate]在python中使用PyQt5按下按钮时更改QML中的标签[重复]
【发布时间】:2018-10-11 11:01:11
【问题描述】:

我正在尝试使用 PyQt5 和 QML 完成一个简单的任务:有一个按钮可以在单击时更改标签。按下按钮时我已经能够执行python函数,但是我不知道如何更改标签中的文本。

这是一个最小的例子:

ma​​in.py

from PyQt5.QtWidgets import *
from PyQt5.QtQml import *
from PyQt5.QtCore import *

import sys

def onClicked():
    print('handler called')

if __name__ == '__main__':
    app = QApplication(sys.argv)

    engine = QQmlApplicationEngine()
    engine.load(QUrl('main.qml'))

    win = engine.rootObjects()[0]
    button = win.findChild(QObject, 'myButton')
    button.messageRequired.connect(onClicked)

    sys.exit(app.exec_())

ma​​in.qml

import QtQuick 2.7
import QtQuick.Controls 2.3
import QtQuick.Window 2.3

ApplicationWindow{
    title: qsTr('Quomodo')
    id: mainWindow
    width:  480
    height: 640
    visible: true

    Column {
        anchors.horizontalCenter: parent.horizontalCenter
        spacing: 8
        padding: 8

        Button {
            signal messageRequired
            objectName: "myButton"
            text: qsTr("Work")
            highlighted: true
            onClicked: messageRequired()
        }

        Label {
            text: qsTr("Time")
            anchors.horizontalCenter: parent.horizontalCenter
        }

    } 
}

例如,如何将标签的文本更改为“下一步”?

注意:这不是QML not taking ownership of object received from PyQt slot 的副本。这个问题是关于 Python 和 QML 之间数据的所有权问题,不回答这个问题。

【问题讨论】:

    标签: python qt pyqt qml pyqt5


    【解决方案1】:

    试试看:

    from PyQt5.QtGui  import QGuiApplication
    from PyQt5.QtQml  import QQmlApplicationEngine
    from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, QUrl
    
    
    class Main(QObject):
        def __init__(self):
            QObject.__init__(self)
    
        # signal sending string
        # necessarily give the name of the argument through arguments=['textLabel']
        # otherwise it will not be possible to pick it up in QML
        textResult = pyqtSignal(str, arguments=['textLabel'])
    
        @pyqtSlot(str)
        def textLabel(self, arg1):
            # do something with the text and emit a signal
            arg1 = arg1.upper()
            self.textResult.emit(arg1)
    
    
    if __name__ == "__main__":
        import sys
        app    = QGuiApplication(sys.argv)
        engine = QQmlApplicationEngine()
        main   = Main()
        engine.rootContext().setContextProperty("main", main)
        engine.load(QUrl('main.qml'))
        engine.quit.connect(app.quit)
        sys.exit(app.exec_())
    

    main.qml

    import QtQuick 2.7
    import QtQuick.Controls 2.3
    import QtQuick.Window 2.3
    
    ApplicationWindow{
        title: qsTr('Quomodo')
        id: mainWindow
        width:  480
        height: 640
        visible: true
    
        Column {
            anchors.horizontalCenter: parent.horizontalCenter
            spacing: 8
            padding: 8
    
            Button {
                objectName: "myButton"
                text: qsTr("Work")
                highlighted: true
                onClicked: {
                    // call the slot to process the text
                    main.textLabel("Next")
                }
            }
    
            Label {
                id: textResult
                text: qsTr("Time")
                anchors.horizontalCenter: parent.horizontalCenter
            }
        } 
    
        // Here we take the result of text processing
        Connections {
            target: main
    
            // Signal Handler 
            onTextResult: {
                // textLabel - was given through arguments=['textLabel']
                textResult.text = textLabel
            }
        }      
    }
    

    【讨论】:

    • 完美。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2020-10-21
    • 2016-07-02
    • 1970-01-01
    • 2017-12-28
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多