gpt4 book ai didi

c++ - 跨多个 QML 处理信号

转载 作者:太空宇宙 更新时间:2023-11-04 13:25:42 25 4
gpt4 key购买 nike

我刚开始学习 Qt 编程,发现自己在制作一个简单的测试应用程序时遇到信号和槽机制的问题。

我有两个 QML 文件:ma​​in.qmlgrocery.qml

我有一个头文件来管理应用程序的信号和槽:

applicationamanger.h

#ifndef APPLICATIONMANAGER_H
#define APPLICATIONMANAGER_H
#include <QObject>
#include <QDebug>
class ApplicationManager : public QObject
{
Q_OBJECT
public:
explicit ApplicationManager(QObject *parent = 0);

signals:
void newGroceryItem();

public slots:
void addGroceryItem();
};
#endif // APPLICATIONMANAGER_H

用户在 ma​​in.qml 上启动应用程序,当按下按钮时加载 grocery.qml

grocery.qml 上,我有一个图像可以被用户点击并发出信号 newGroceryItem()

MouseArea {
id: okBtnClkd
anchors.fill: parent
Connections {
onClicked: {
newGroceryItem()
}
}
}

并且主应用程序 ma​​in.cpp 连接了信号,但说找不到信号 newGroceryItem() 因为它不属于 ma​​in .qml。所以我的问题是,如何从辅助 qml 文件 grocery.qml 建立到插槽 addGroceryItem() 的连接?

编辑:根据要求,这里是 ma​​in.cpp

的内容
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickWindow>
#include <QQmlContext>
#include "applicationmanager.h"
int main(int argc, char *argv[]){
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

QObject *topLevel = engine.rootObjects().value(0);
QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
ApplicationManager applicationManager;
QObject::connect(window, SIGNAL(newGroceryItem()), &applicationManager, SLOT(addGroceryItem()));

return app.exec();
}

以及grocery.qml的内容

import QtQuick 2.5
import QtQuick.Controls 1.4

ApplicationWindow {
//Declaration of signals.
signal newGroceryItem()

width: 300
height: 400
visible: true
TextField {
id: product
x: 14
y: 111
width: 270
height: 22
}
Text {
id: text1
x: 14
y: 81
width: 124
height: 24
text: qsTr("Product")
font.pixelSize: 20
}
Image {
id: okBtn
x: 99
y: 290
width: 100
height: 100
source: "img/main/okBtn.png"

MouseArea {
id: okBtnClkd
anchors.fill: parent
Connections {
onClicked: {
newGroceryItem()
}
}
}
}
}

最佳答案

QObject派生类型的任何方法都可以从 QML 代码访问,如果它是:

  • Q_INVOKABLE 宏标记的公共(public)方法
  • 作为公共(public) Qt SLOT 的方法

所以有两种方法可以访问addGroceryItem()。第一种是使用 Q_INVOKABLE 宏,如下所示:

class ApplicationManager : public QObject
{
Q_OBJECT
public:
explicit ApplicationManager(QObject *parent = 0);
Q_INVOKABLE void addGroceryItem();
};

第二种方式是使用public slots如下:

class ApplicationManager : public QObject
{
Q_OBJECT
public:
explicit ApplicationManager(QObject *parent = 0);
public slots:
void addGroceryItem();
};

如果您在 C++ 中创建类对象,那么您应该将对象设置为 main.qml 的上下文数据,如下所示:

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

QQmlEngine engine;
ApplicationManager app;
engine.rootContext()->setContextProperty("applicationManager", &app);
QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml"));
component.create();

return app.exec();
}

现在您可以从 main.qml 访问在 main.cpp 中创建的 ApplicationManager 对象,如下所示:

MouseArea {
id: okBtnClkd
anchors.fill: parent
onClicked: {
applicationManager.addGroceryItem();
}
}

有关详细信息,请参阅 here .

关于c++ - 跨多个 QML 处理信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33457888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com