2014-06-08 60 views
5

如何將我在.qml腳本中創建的按鈕綁定到python PyQt5代碼?如何將Qt Quick中的按鈕綁定到Python PyQt 5

例如: 蟒蛇:

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

你所顯示的代碼是打印hello的python代碼,你還想具體做什麼,你不能放在那裏呢? – Schollii

+0

這個應用程序非常簡單,我只想用pyqt連接qml按鈕。我真正的應用程序將使用按鈕開始與Web服務進行通信。 – Daivid

+0

你問過一個PyQt + QML的例子。這是一個Sudoku遊戲的鏈接,其中所有的邏輯都在Python中,並且UI在QML中:https://github.com/pkobrien/sudoku-qml –

回答

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的任何插槽都會被調用。

+0

舊的示例沒有工作。 PyQt5沒有QDeclarativeView類,如[這裏]所述(http://pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html);最後,我找不到類似於我在演示中要做的事情。 – Daivid

+0

已更新,例如 – Schollii

+0

我得到的是: 回溯(最近通話最後一個): 「\ main.py」 文件,第29行,在 win.myButton.messageRequired.connect(myFunction的) AttributeError的:「QWindow '對象沒有屬性'myButton' – Daivid