我正在开发一个基本的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()上,并且不应该与这个问题重复吗?我还想知道qmlRegisterType()和setContextProperty()是否可以同时使用?
我认为您的代码应该运行良好。
我没有完整的代码,所以我不知道您是否实现了正确的方法。
为了获得使用信号,qmlRegisterType
您需要一些要求。检查您是否Q_PROPERTY
实现了宏调用。任何可写属性都应具有关联的NOTIFY信号,只要该属性值已更改,该信号便会发出。
如果是这样,则在更改组件中的color
属性时SetMessage
,onColorChanged
应触发信号。
在这里,您有一个示例,其中发出了两个信号:第一个信号是在更新size属性时,第二个信号是在使用CmouseClick
调用C ++方法时MouseArea
。
顺便说一句,您不需要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();
}
customitem.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
customitem.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();
}
main.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() }
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句