2014-03-19 25 views
0

我用一些按鈕設計了基本的用戶界面,textareas使用QtQuick應用程序。我需要用C++編寫事件處理程序來處理按鈕單擊事件。我如何從C++文件訪問qml元素?[已解決]來自C++類的qtquick應用程序事件處理

+0

可能的重複http://stackoverflow.com/questions/21437841/how-to-connect-a-qt-quick-button-click-to-ac-method/21438337#21438337 –

+0

我試過了.. 「main.obj:-1:error:LNK2019:無法解析的外部符號」public:__cdecl SomeClass :: SomeClass(class QObject *)「(?? 0SomeClass @@ QEAA @ PEAVQObject @@@ Z )在函數main中引用「 –

+0

您是否將SomeClass的.h和.cpp文件添加到您的項目中,並且.cpp文件包含SomeClass :: SomeClass(QObject *)的實現? –

回答

1

從C++訪問QML元素不是一個好習慣。我將以一個簡單的例子向你展示一種更受青睞的方法。

  • 寫一個繼承自QObject C++類(該類將實現你想要當事件發生時調用的方法) (EG)

[或者Controller.h]

#ifndef CONTROLLER_H 
#define CONTROLLER_H 

#include <QObject> 

class Controller : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Controller(QObject *parent = 0); 
    Q_INVOKABLE void onItemClicked(); 
}; 

#endif // CONTROLLER_H 

[controller.cpp]

#include "controller.h" 
#include <QDebug> 

Controller::Controller(QObject *parent) : QObject(parent) 
{ 
} 

void Controller::onItemClicked() 
{ 
    qDebug() << "The item was clicked"; 
} 
  • 創建該類的一個實例,並將其設置爲運行QML UI的QQmlEngine中的上下文屬性。遵循Qt Quick應用程序的典型「main.cpp」。

[main.cpp中]

#include <QtGui/QGuiApplication> 
#include <QQmlEngine> 
#include <QQmlContext> 
#include "qtquick2applicationviewer.h" 
#include "controller.h" 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 
    QtQuick2ApplicationViewer viewer; 
    Controller c; 
    viewer.engine()->rootContext()->setContextProperty("Controller", &c); 
    viewer.setMainQmlFile(QStringLiteral("qml/quicktest/main.qml")); 
    viewer.showExpanded(); 
    return app.exec(); 
} 
  • 現在可以自由地調用從QML代碼的方法(或多個)。

[main.qml]

import QtQuick 2.0 

Rectangle { 
    width: 360 
    height: 360 
    Text { 
     text: qsTr("Hello World") 
     anchors.centerIn: parent 
    } 
    MouseArea { 
     anchors.fill: parent 
     onClicked: { 
      Controller.onItemClicked(); 
     } 
    } 
} 

我希望這有助於。

+0

它的工作原理..非常感謝.. !! –

+0

你歡迎,@尼克希爾帕蒂爾! – mhcuervo