2014-06-08 21 views
5

Jak powiązać przyciski, które utworzę w skrypcie .qml z pythonem kodu PyQt5?Jak wiązać przyciski w Qt Szybkie w Pythonie PyQt 5

przykład: 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') 
    } 

} 
} 

Jak można zrobić coś z Pythona przy kliknięciu przycisku? Ponadto: Czy ktoś ma dobry zasób przykładów lub dokumentów. o pyqt + qml (qt quick)?

+0

Wyświetlany kod to kod Pythona, który drukuje Witaj, co jeszcze chcesz zrobić, a czego nie możesz tam umieścić? – Schollii

+0

Ta aplikacja jest bardzo prosta, po prostu chcę podłączyć przycisk qml z pyqt. Moja prawdziwa aplikacja użyje przycisków do rozpoczęcia komunikacji z usługą sieciową. – Daivid

+0

Poprosiłeś o przykład PyQt + QML. Oto link do gry Sudoku, w której cała logika jest w języku Python, a interfejs użytkownika jest w QML: https://github.com/pkobrien/sudoku-qml –

Odpowiedz

3

Jeśli nazwiesz przycisk, możesz połączyć się z jego sygnałem onClick lub niestandardowym sygnałem emitowanym w onClicked. Przykład:

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

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

} 
} 

Zapisz sygnał w przycisku i właściwości objectName. Następnie kod Python tuż przed exec może być na przykład:

def myFunction(): 
    print 'handler called' 

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

Zauważ, że w przycisk powyżej, onClicked tylko emituje sygnał messageRequired, więc lepiej jest spaść niestandardowy sygnał i połączyć się clicked bezpośrednio. Zarówno onClicked() jak i wszelkie gniazda połączone z clicked zostaną wywołane po kliknięciu przycisku.

+0

Ten starszy przykład nie działał. PyQt5 nie ma klasy QDeclarativeView, jak powiedział [tutaj] (http://pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html); W końcu nie mogłem znaleźć niczego podobnego do tego, co próbuję zrobić w demach. – Daivid

+0

Zaktualizowano przykład – Schollii

+0

wszystko co mam to: Traceback (most recent call last): "\ main.py" Plik, linia 29, w win.myButton.messageRequired.connect (MyFunction) AttributeError: „QWindow "obiekt nie ma atrybutu" myButton " – Daivid