2017-05-03 102 views
1

QML中的MessageDialog信號有問題。在我的MessageDialog我有兩個按鈕是的沒有。我想用信號連接每個按鈕。 這裏是我的QML文件:如何將QML信號與C++插槽連接?

import QtQuick 2.2 
import QtQuick.Dialogs 1.1 

Item{ 
    MessageDialog { 
     signal qmlYesSig(string msg) 
     signal qmlNoSig (string msg) 
     title: "Send data?" 
     icon: StandardIcon.Question 
     text: "Do you want to save your data on the online platform?" 
     detailedText: "Click Yes " 
     standardButtons: StandardButton.Yes | StandardButton.No 
     Component.onCompleted: visible = true 
     onYes: qmlYesSig("From yes") 
     onNo: qmlNoSig("From no") 
    } 
} 

這裏是我的槽:

class MyClass : public QObject 
{ 
    Q_OBJECT 
public slots: 
    void cppSlot(const QString &msg) { 
     qDebug() << "Called the C++ slot with message:" << msg; 
    } 
}; 

這裏是我如何使用這個主:

QQuickView view(QUrl::fromLocalFile("window.qml")); 
QObject *item = view.rootObject(); 
AddData myClass; 
QObject::connect(item, SIGNAL(qmlSignal(QString)), 
       &myClass, SLOT(cppSlot(QString))); 

view.show(); 

它給我的錯誤:

C2665: 'QObject::connect': none of the 3 overloads could convert all the argument types

我試了很多t imes,但我無法使QML信號和C++插槽工作。 另外我試着從這裏的例子Qt doc並給我同樣的錯誤。

有人可以給我一個想法如何連接QRL信號和C + +插槽爲MessageDialog

+0

你在哪裏定義了信號qmlSignal?不在'QObject * item = view.rootObject();' – xander

+0

這是我第一次使用來自qml的信號工作,我真的不明白我應該多做些什麼。當按下按鈕時,它會發出一個應該是趕上C++,寫? – John

+0

儘管如此,你可以調試你的'view.rootObject()',看看你的MessageDialog是不是你定義信號的地方。因此,無論是在你的根目錄中定義它,還是使用C++中的MessageDialog子對象來連接信號。 – xander

回答

1

你QML文件是:

Item{ 
    MessageDialog { 
     signal qmlYesSig(string msg) 
     signal qmlNoSig (string msg) 

     [...] 
    } 
} 

而且你的C++代碼:

QObject *item = view.rootObject(); 
AddData myClass; 
QObject::connect(item, SIGNAL(qmlSignal(QString)), 
       &myClass, SLOT(cppSlot(QString))); 

這意味着你正在尋找一個在您的QML文件的根項目名爲「qmlSignal」信號。 這根項目簡直是

Item{} 

正如你所看到的,沒有所謂的「qmlSignal」信號。

您必須在根項目中定義信號並從消息框中發出信號。

Item{ 
    signal qmlSignal(string msg) 

    MessageDialog { 
     onYes: parent.qmlSignal("From yes") 
     onNo: parent.qmlSignal("From no") 
    } 
} 
+0

謝謝你dydil。這項工作,但我有一些錯誤,當我使用「QObject * item = view.rootObject();」它說:「不能將'QQuickItem *'轉換爲'QObject *'」。你知道這是爲什麼嗎? – John

+1

@Adi QQuickItem是一個QObject,所以問題可能是你忘了'#include '。 – dydil

+0

是的,那是:)謝謝 – John

2

可以公開C++的QObject到QML引擎和連接到C++的QObject從QML側面的插槽:

在C++中的文件:

view.rootContext()->setContextProperty("object", this); // replace this with appropriate object 

在設爲Qml:

qmlYesSig.connect(object.cppSlot);