Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用QtC造作5.3为Qt快速UI项目,如何将QML按钮资源链接到C++函数调用_Qt_Qml_Qtquickcontrols - Fatal编程技术网

使用QtC造作5.3为Qt快速UI项目,如何将QML按钮资源链接到C++函数调用

使用QtC造作5.3为Qt快速UI项目,如何将QML按钮资源链接到C++函数调用,qt,qml,qtquickcontrols,Qt,Qml,Qtquickcontrols,这是我在StackOverflow上的第一篇文章,所以请原谅我可能犯的任何格式错误 我正在使用QT快速控件1.1构建Qt快速UI项目,我在QML代码中有一个简单的按钮,我想调用C++的C++类。我在Qt的早期版本中看到了许多关于这方面的示例,但它们在5.3中似乎不起作用。我在项目设置中选择了Qt Quick Controls 1.1。我知道这一定不会太复杂,但我似乎找不到使用QtCreator 5.3的示例 这是我的main.qml文件: import QtQuick 2.2 import Qt

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

我正在使用QT快速控件1.1构建Qt快速UI项目,我在QML代码中有一个简单的按钮,我想调用C++的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操作设置正确。任何关于如何在我的行动课上进行行动呼吁的帮助都将不胜感激

您在这里遇到了三个问题

首先,您没有在main.cpp中使用QML的Action类:

#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();
}
第三,你没有在任何地方调用doSend插槽。您可以在of按钮中执行此操作:

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

谢谢米奇,实际上我刚刚找到了一种更简单的方法来做我需要的事情,我会在回复中解释。我投票支持你,因为你的解决方案也是有效的,我从中吸取了教训。谢谢显然,我只需要添加一条评论。以下是我所做的,同样有效。我发现另一种实现同样的方法是让C++类对应用程序的引擎根上下文可用,比如:引擎。然后在qml文件中,我可以执行以下操作:{id:actionSend onTriggered:MyObject.doSend}对不起,米奇,我显然没有足够的声望点数来投票支持你。不用担心当您只有一个对象时,setContextProperty方法是很好的;当您希望从QML中实例化许多项时,qmlRegisterType方法是很好的。
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();
}
import StevesModule 1.0
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()
    }
}