2017-08-25 5 views
0

はここに私のコードです(と言って、コンパイルしない:main.cppにに接続しマーキングしながら、「『』の前にトークンプライマリ表現を期待」)QT - CPPコンストラクタへの接続QML]ボタンをクリックして

main.cppに

QObject *myButton = engine.rootObjects().first() -> findChild<QObject*>("btn"); 
QObject::connect(myButton, SIGNAL(clicked()), MyClass, SLOT(MyClass())); 

main.qml

ApplicationWindow { 
    id: appWindow 
    visible: true 
    width: 850; height: 500 
Button 
{ 
objectName: btn 
anchors.centerIn: parent 
} 
} 

ボタンをクリックするたびにcppクラスのMyClassをインスタンス化したい。

以前は別のことをしましたが、アプリケーションが実行されているときにMyClassをインスタンス化するという問題がありました。ボタンがクリックされたときではありませんでした。さらに、コンストラクタを呼び出すことはできませんでしたが、Q_INVOKABLEパブリックメソッドのみを呼び出すことができました。

main.cppに

MyClass myClass; 
engine.rootContext() -> setContextProperty("_btn", &myClass); 

main.qml

ApplicationWindow { 
    id: appWindow 
    visible: true 
    width: 850; height: 500 
Button 
{ 
objectName: btn 
anchors.centerIn: parent 
onClicked: _btn.myMethod() //where myMethod is a Q_INVOKABLE public method belonging to MyClass. 
} 
} 

答えて

2

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection) 

パラメータ1と3は、インスタンス(nはQObject::connect定義を見てください。あなたのスニペットで述べたように定義することができます)、QObjectベースのクラスのインスタンスであるため、シグナルスロットメカニズムを使用するには、クラスのインスタンスが必要です。それがあなたのコンパイル失敗の理由です。

タスクをフルフィルにするには、「プロキシ」クラスを作成してスロットに接続し、MyClassを動的に作成する必要があります。

関連する問題