来自c ++类的qtquick应用程序事件处理

时间:2014-03-19 05:53:35

标签: qt event-handling qml

我使用QtQuick应用程序设计了基本UI和一些按钮,textareas。我需要用C ++编写事件处理程序来处理按钮单击等事件。如何从C ++文件中访问qml元素?

1 个答案:

答案 0 :(得分:1)

从C ++访问QML元素不是一个好习惯。我会用一个简单的例子向你展示一个更受青睐的方法。

  • 编写一个继承QObject的C ++类(该类将实现您在事件发生时要调用的方法) (例如)

[或者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中的上下文属性。遵循典型的&#34; main.cpp&#34;用于Qt Quick应用程序。

[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();
        }
    }
}

我希望这会有所帮助。