2014-06-08 11 views
5

Come si possono associare i pulsanti creati in uno script .qml al codice PyQt5 Python?Come associare i pulsanti in Qt Quick a Python PyQt 5

esempio: python:

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') 
    } 

} 
} 

Come posso fare qualcosa con Python quando fa clic sul pulsante? Inoltre: Qualcuno ha una buona risorsa di esempi o doc. su pyqt + qml (qt quick)?

+0

Il codice che mostri è un codice Python che stampa ciao, cos'altro vuoi fare specificamente che non puoi inserire lì? – Schollii

+0

Questa applicazione è molto semplice, voglio solo collegare il pulsante qml con pyqt. La mia vera applicazione utilizzerà i pulsanti per avviare le comunicazioni con un servizio Web. – Daivid

+0

Hai chiesto un esempio di PyQt + QML. Ecco un collegamento a un gioco Sudoku in cui tutta la logica è in Python e l'interfaccia utente è in QML: https://github.com/pkobrien/sudoku-qml –

risposta

3

Se si assegna un nome al pulsante, è possibile connettersi al segnale onClick o a un segnale personalizzato emesso in onClicked. Esempio:

ApplicationWindow { 
title: qsTr("Test Invoke") 
width: 200 
height: 100 

Button { 
    signal messageRequired 
    objectName: "myButton" 
    y : 70 
    text : "About" 
    onClicked: messageRequired() 

} 
} 

Nota il segnale in Button e la proprietà objectName. Quindi il codice Python poco prima exec potrebbe essere, ad esempio:

def myFunction(): 
    print 'handler called' 

button = win.findChild(QObject, "myButton") 
button.messageRequired.connect(myFunction) 
button.clicked.connect(myFunction) # works too 

Si noti che il pulsante di cui sopra, onClicked solo emette il segnale messageRequired, quindi è meglio far cadere il segnale personalizzato e connettersi a clicked direttamente. Sia il numero onClicked() sia gli eventuali slot collegati a clicked verranno richiamati quando si fa clic sul pulsante.

+0

L'esempio precedente non ha funzionato. PyQt5 non ha la classe QDeclarativeView, come detto [qui] (http://pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html); Infine, non ho trovato nulla di simile a quello che sto cercando di fare nelle demo. – Daivid

+0

AGGIORNATO CON esempio – Schollii

+0

Tutte le ho è: Traceback (chiamata più recente scorso): "\ main.py" File, linea 29, in win.myButton.messageRequired.connect (myFunction) AttributeError: 'QWindow 'oggetto non ha attributo' myButton ' – Daivid

Problemi correlati