1

这是我在 StackOverflow 上的第一篇文章,所以请原谅我可能犯的任何格式错误。

我正在使用 Qt Quick Controls 1.1 构建一个 Qt Quick UI 项目,并且我的 QML 代码中有一个简单的按钮,我想将它调用到我的 C++ 操作类中。我在早期版本的 Qt 中看到了许多关于此的示例,但它们似乎不适用于 5.3。我在项目设置中选择了Qt Quick Controls 1.1。我知道这一定不会太复杂,但我似乎找不到使用 QtCreator 5.3 的示例

这是我的 main.qml 文件:

import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1

ApplicationWindow {
    id: parentWnd
    visible: true
    width: 640
    height: 480

    Action {
        id: actionSend
        onTriggered: console.log("SEND")
    }

    Button {
        id: send
        text: "Send Request"
        action: actionSend
        signal sendSignal()
    }
}

这是我的 main.cpp:

#include <QApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;

    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}

这是我希望 QML 按钮调用“doSend”的操作类:

#include<QDebug>
#include<QObject>

class Action : public QObject
{
    Q_OBJECT
public:
    Action();
public slots:
    void doSend();
};

最后这是我的项目文件:

TEMPLATE = app

QT += qml quick widgets

SOURCES += main.cpp \
    action.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Default rules for deployment.
include(deployment.pri)

HEADERS += \
    action.h

当我运行它时,我看到了按钮,并且看到了“发送”到控制台的日志记录,所以我知道 QML 操作设置正确。任何有关如何将 Action 调用到我的操作类中的帮助将不胜感激!

4

1 回答 1

0

您在这里遇到了三个问题。

首先是您尚未在 QML 中注册您的课程:Actionmain.cpp

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    qmlRegisterType<Action>("StevesModule", 1, 0, "Action");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}

第二个是Action是Qt Quick Controls模块中的一个QML类型。Action它对你的 C++ 类一无所知。如果你想使用你的Action类而不是 Qt Quick Controls 的Action类型,你必须在你的 QML 文件中导入它:

import StevesModule 1.0

第三是你没有在doSend()任何地方调用插槽。您可以在 Button 的onClicked 处理程序中执行此操作:

import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import StevesModule 1.0

ApplicationWindow {
    id: parentWnd
    visible: true
    width: 640
    height: 480

    Action {
        id: actionSend
    }

    Button {
        id: send
        text: "Send Request"
        onClicked: actionSend.doSend()
    }
}
于 2014-07-03T18:07:48.120 回答