繁体   English   中英

使用QtCreator 5.3 for Qt Quick UI项目,如何将QML按钮资源链接到C ++函数调用

[英]Using QtCreator 5.3 for Qt Quick UI project, how to link QML button resource to C++ function call

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

我正在使用Qt Quick Controls 1.1构建Qt Quick UI项目,并且在我的QML代码中有一个简单的Button,我想将其调用到C ++ action类中。 我在早期版本的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

运行此命令时,我看到按钮,并且看到“ SEND”到控制台的日志记录,因此我知道QML操作已正确设置。 非常感谢您提供有关如何将Action调用加入我的action类的帮助!

您在这里遇到三个问题。

首先是您没有在main.cpp向QML 注册 Action类:

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类型。 它对C ++中的Action类一无所知。 如果要使用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()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM