2013-10-02 12 views
8

एक पाइथन विधि/स्लॉट एक क्यूएमएल सिग्नल से कैसे जोड़ा जा सकता है? ऐसा लगता है कि QQObject.connect() को PyQt4 में काम करने के लिए उपयोग किया जाता है लेकिन यह no longer available in PyQt5 है।PyQt5 QML सिग्नल पाइथन स्लॉट के लिए?

#Sample QML File (stack.qml) 

import QtQuick 2.0 

Rectangle { 
    MouseArea { 
     anchors.fill: parent 
     onClicked: { 
      // relay this to python 
     } 
    } 
} 

-

#Sample Python File 
from PyQt5.QtCore import QUrl 
from PyQt5.QtGui import QGuiApplication 
from PyQt5.QtQuick import QQuickView 

if __name__ == '__main__': 
    import os 
    import sys 

    app = QGuiApplication(sys.argv) 

    view = QQuickView() 
    view.setWidth(500) 
    view.setHeight(500) 
    view.setTitle('Hello PyQt') 
    view.setResizeMode(QQuickView.SizeRootObjectToView) 
    view.setSource(QUrl.fromLocalFile(os.path.join(os.path.dirname(__file__),'stack.qml'))) 

    def on_qml_mouse_clicked(mouse_event): 
     print 'mouse clicked' 

    view.show() 
    qml_rectangle = view.rootObject() 

    # this technique doesn't work ############################# 
    qml_rectangle.mousePressEvent.connect(on_qml_mouse_clicked) 

    sys.exit(app.exec_()) 

PyQT उदाहरणों में से कुछ "setContextProperty" के माध्यम से QML संदर्भ में एक वस्तु पारित और उसके बाद उस वस्तु पर स्लॉट के लिए QML घटनाओं रिले लेकिन यह दृष्टिकोण गोल चक्कर लगता है। क्या कोई बेहतर तरीका है?

उत्तर

13

qml_rectangle.mousePressEvent, एक संकेत नहीं है, यह एक ईवेंट हैंडलर है कि माउस की घटनाओं पर कहा जाता है, ताकि आप इसे कनेक्ट नहीं कर सकता। तुम बस अपने हैंडलर समारोह (qml_rectangle.mousePressEvent = on_qml_mouse_clicked) से बदलने सकता है, लेकिन है कि क्यूटी साथ काम करने का एक बहुत साफ तरीका नहीं है।

... 
def on_qml_mouse_clicked(): 
    print('mouse clicked') 

qml_rectangle.clicked.connect(on_qml_mouse_clicked) 
... 
:

import QtQuick 2.0 

Rectangle { 
    signal clicked() 
    MouseArea { 
     anchors.fill: parent 
     onClicked: { 
      parent.clicked() // emit the parent's signal 
     } 
    } 
} 

तो फिर तुम सिर्फ अपने अजगर कोड से यह करने के लिए कनेक्ट कर सकते हैं:

बेहतर तरीका है अपने qml फ़ाइल में एक संकेत को परिभाषित करने और आयत के onClicked हैंडलर से फेंकना होगा

+0

अच्छा काम करता है में अधिक जानकारी प्राप्त कर सकते हैं! धन्यवाद! – berg

1

मैं उप वर्गीकरण QQuickView और रूट संदर्भ पर एक संपत्ति सेट करने की अनुशंसा करता हूं, उदाहरण के लिए मेनविंडो। अब तुम सब करने की जरूरत है ('QString') सजावट के साथ उस वर्ग में कार्य जोड़ने जैसे @pyqtSlot है, और फिर आप onClicked साथ ईवेंट हैंडलर सेट कर सकते हैं: फिर MainWindow.FunctionName (Arguments_According_To_Decoration)

अपने main.py इस

#!/bin/env python3 
# -*- coding: utf-8 -*- 
from PyQt5.QtCore import pyqtSlot 
from PyQt5.QtCore import QUrl 
from PyQt5.QtQuick import QQuickView 
from PyQt5.QtWidgets import QApplication 
import sys 

class MainWindow(QQuickView): 
    def __init__(self): 
     super().__init__() 
     self.setSource(QUrl('sample.qml')) 
     self.rootContext().setContextProperty("MainWindow", self) 
     self.show() 

    @pyqtSlot('QString') 
    def Print(self, value): 
     print(value) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    w = MainWindow() 
    sys.exit(app.exec_()) 

और sample.qml कैसा लगेगा तो

import QtQuick   2.0 
import QtQuick.Controls 2.2 

Rectangle { 
    width: 200; height: 200 

    Button { 
     text: "print Hello World" 
     onClicked: MainWindow.Print('hello world') 
    } 
} 
तरह

आप डॉक्स

http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html

संबंधित मुद्दे