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