gpt4 book ai didi

c++ - 类型注册后如何在 QML 信号处理程序中捕获 C++ 信号?

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:31 30 4
gpt4 key购买 nike

我正在开发一个基本的 qml-cpp 应用程序来了解一个人如何与另一个人互动。我有一个 MessageSetter C++ 类和一个 main.qml。由于我希望了解双向通信,因此我使用 setContextProperty 将 MessageSetter 属性公开给 qml,并且还向 qml 注册了 MessageSetter 类(可实例化注册)。暴露的属性工作正常。现在,当单击 qml 按钮时,信号 (qmlBtnClicked) 会成功捕获到 MessageSetter 插槽 (onQmlButtonClicked) 中。该插槽进一步发出另一个 MessageSetter 信号 (colorChanged)。这个新的 (C++) 信号应该在 qml 注册的 MessageSetter 的信号处理程序 (onColorChanged) 中被捕获,但它在任何情况下都不会到达这里。以下是 main.cpp 代码:

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<MessageSetter>("com.SkillLotto.MessageSetter", 1, 0, "SetMessage");

MessageSetter data;
engine.rootContext()->setContextProperty("msgSetter", &data);
QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml"));

QObject *object = component.create()->findChild<QObject*>("setTextBtn");
QObject::connect(object, SIGNAL(qmlBtnClicked()), &data, SLOT(onQmlButtonClicked()));

return app.exec();
}

这是发出另一个信号的 MessageSetter 插槽:

void MessageSetter::onQmlButtonClicked()
{
emit colorChanged("red");
}

这是 qml 代码,这个信号处理程序永远不会被调用:

SetMessage{
onColorChanged: {
rect.color = color //rect is some rectangle in this file.
}
}

正如我所说,qml 信号已成功捕获到 C++ 槽中,但我无法在 qml 信号处理程序中捕获此 C++ 信号。请提供任何帮助。

如我所见,这个问题集中在 qmlRegisterType() 上,不应与 this question 重复?我也想知道 qmlRegisterType() 和 setContextProperty() 不能同时使用吗?

最佳答案

我认为您的代码应该运行良好。

我没有完整的代码,所以我不知道您是否实现了正确的方法。

为了使用qmlRegisterType 获取信号,您需要满足一些要求。检查您是否实现了 Q_PROPERTY 宏调用。任何可写的属性都应该有一个关联的 NOTIFY 信号,只要属性值发生变化就会发出该信号。

如果是这样,当您更改 SetMessage 组件中的 color 属性时,应该触发信号 onColorChanged

这里有一个示例,其中发出两个信号:第一个信号在更新 size 属性时发出,第二个信号在使用 MouseArea 调用 C++ mouseClick 方法时发出>.

顺便说一句,您不需要setContextProperty 来将您的C++ 类与QML 集成。 qmlRegisterType 应该足够了。反之亦然,具体取决于您的需要。您可以同时使用两者,但是您将有两个不同的对象可以使用。这实际上取决于您想要实现的目标。

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "customitem.h"

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<CustomItem>("CustomItem", 1,0, "CustomItem");

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

return app.exec();
}

自定义项.h

#ifndef CUSTOMITEM_H
#define CUSTOMITEM_H

#include <QObject>

class CustomItem: public QObject
{
Q_OBJECT

/*
* Any property that is writable should have an associated NOTIFY signal.
* Ref: http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html#exposing-properties
*/

Q_PROPERTY(int size READ size WRITE setSize NOTIFY sizeChanged)

public:
CustomItem(QObject *parent = 0);

int size() const;
void setSize(int);

Q_INVOKABLE void mouseClick();

private:
int m_size;

signals:
void sizeChanged(int size);
void clicked();

public slots:
};

#endif // CUSTOMITEM_H

自定义项.cpp

#include "customitem.h"
#include <QDebug>

CustomItem::CustomItem(QObject *parent)
: QObject(parent), m_size(0)
{
}

int CustomItem::size() const
{
return m_size;
}

void CustomItem::setSize(int size)
{
m_size = size;
emit sizeChanged(m_size);
}

void CustomItem::mouseClick()
{
qDebug() << "CustomItem::mouseClick()";

emit clicked();
}

ma​​in.qml

import QtQuick 2.5
import QtQuick.Window 2.2
import CustomItem 1.0

Window {
visible: true

TextInput {
id: mySize
x: 0
y: 0
text: "100"
}

CustomItem {
id: customItem
size: mySize.text

onSizeChanged: console.log("size changed:", size)
onClicked: console.log("onClicked!")
}

Rectangle {
id: rect
x: 50
y: 50
width: customItem.size
height: customItem.size
color: "red"

MouseArea {
anchors.fill: parent
onClicked: { customItem.mouseClick() }
}
}
}

关于c++ - 类型注册后如何在 QML 信号处理程序中捕获 C++ 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34041344/

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