2012-02-18 14 views
12

उपयोग करने के साथ C++ कनेक्ट मैं एक क्यूटी समारोह है:QML Q_INVOKABLE

void MainWindow::button_clicked(Qstring a, Qstring b, Qstring c, Qstring d) 

मैं QML से डेटा एकत्र और मैं इस समारोह जो क्यूटी में है को डेटा पास करना चाहते हैं। तो मुझे पता है कि मुझे Q_INVOKABLE का उपयोग करने की आवश्यकता है, लेकिन वास्तव में यह नहीं पता कि इसका उपयोग कैसे किया जाए।

और एक और बात यह है कि ऊपर दिए गए कुछ को आमंत्रित करते समय किसी अन्य कार्य को आमंत्रित करना संभव है।
उदाहरण के लिए: मैं उपरोक्त फ़ंक्शन का आह्वान करता हूं लेकिन उसके शरीर में मैं refresh() फ़ंक्शन का आह्वान करता हूं। क्या यह संभव है?

उत्तर

16

क्यूएमएल से एक विधि कॉल करने में सक्षम होने के लिए, आपको या तो इसे Q_INVOKABLE या स्लॉट के रूप में चिह्नित करना होगा। मैं Q_INVOKABLE को प्राथमिकता देता हूं यदि इसका उपयोग स्लॉट के रूप में नहीं किया जाना चाहिए, क्योंकि यह अधिक न्यूनतम है।

class MainWindow : public QMainWindow { 
    Q_OBJECT 
public: 
... 
    Q_INVOKABLE void buttonClicked(const QString& a, const QString& b, const QString& c, const QString& d); 
.... 
}; 

void MainWindow::buttonClicked(const QString& a, const QString& b, const QString& c, const QString& d) { 
    ...do stuff 
    update(); //example 
} 

बटनक्लिड() के कार्यान्वयन में कोई सी ++ कोड हो सकता है।

मुख्य विंडो उदाहरण QML से सुलभ बनाने के लिए, आपको इसे पंजीकृत करना होगा, उदा।

QDeclarativeView* view = ...your view 
view->rootContext()->setContextProperty("_mainWindow", mainWindow); 

पंजीकृत होने के बाद, आप QML से buttonClicked कॉल कर सकते हैं:

_mainWindow.buttonClicked("foo", "bar", "c", "d") 
+0

हाय मैं mainwindow.cpp में यह है: 'QDeclarativeView * दृश्य = नए QDeclarativeView; ui-> setupUi (यह); setCentralWidget (देखें); QDeclarativeContext * ctxt = view-> rootContext(); ctxt-> setContextProperty ("myModel", QVariant :: fromValue (MainWindow :: dataList)); देखें-> सेटसोर्स (QUrl ("qrc: /gui.qml")); देखें-> setResizeMode (QDeclarativeView :: SizeRootObjectToView); तो अपनी लाइन को अंदर कैसे रखा जाए? Main.cpp में मैं केवल मेनविंडो और कॉल शो विधि बना देता हूं। –

+0

यह शायद ctxt-> setContextProperty ("_mainWindow", यह होगा); फिर। –

+0

जो काम किया। धन्यवाद –

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