QObject::connect:在 c++ Qt 5.3 中连接 qml 信号时没有这样的信号
QObject::connect: No such signal while connecting qml signals in c++ Qt 5.3
我是使用Qt框架的新手。我不确定我哪里出错了。我尝试查看许多相关材料,但仍然无法弄清楚。
当我在qml文件中声明信号时,我收到"QObject::connect:没有这样的信号错误.."。
这是代码:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
//QDeclarativeView view;
QQmlApplicationEngine engine;
testclass dsc;
QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///test.qml")));
while(component.isLoading());
if (component.isError()) {
qWarning() << component.errors();
}
QObject *object = component.create();
QQuickItem *item = qobject_cast<QQuickItem*>(object);
QObject::connect(item,SIGNAL(dsa(QVariant)),&dsc,SLOT(testslot(QVariant)));
QObject::connect(&dsc,SIGNAL(dummysignal(QVariant)),&dsc,SLOT(testslot(QVariant)));
dsc.dummysignal(&dsc);
qDebug("Entered :");
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}
QML 文件:test.qml
Item {
width: 800
height: 500
signal dsa(var obj)
SystemPalette { id: palette }
}
测试等级:testclass.cpp
#include <QObject>
class testclass: public QObject
{
Q_OBJECT
public:
explicit testclass(QObject *parent = 0);
signals:
void dummysignal(QVariant);
public slots:
void testslot(QVariant);
};
我收到此错误:
QObject::connect: No such signal test_QMLTYPE_0::dsa(QVariant) in ..
问题是您将dsa
信号参数声明为"var"类型,qml 引擎将其视为 javascript 值。所以这被传播到c ++作为一个QJSValue
,你尝试连接的信号的签名实际上是dsa(QJSValue)
。
如果您希望dsa(QVariant)
签名,请在test.qml中更改信号声明,如下所示:
// test.qml
Item {
signal dsa(variant obj)
width: 800
height: 500
SystemPalette { id: palette }
}
这应该允许您在尝试使用该语句时进行连接
QObject::connect(item,SIGNAL(dsa(QVariant)),&dsc,SLOT(testslot(QVariant)));
(但首先您应该将插槽的签名更新为 void testslot(QVariant);
...否则,您只会在另一面遇到同样的问题,并出现"没有这样的插槽"错误)
FWIW,这是调试"没有此类信号/插槽"错误的有用技巧:
// Assuming you've instantiated QQuickItem* item
// This will print out the signature for every signal/slot on the object
// Make sure you include <QMetaObject>, <QMetaMethod>
const QMetaObject* metaObj = item->metaObject();
for (int i = 0; i < metaObj->methodCount(); ++i) {
QMetaMethod method = metaObj->method(i);
qDebug() << method.methodSignature();
}
QVariant
是Qt 5.2中用于映射var
信号参数的正确类型,但在Qt 5.3中已更改为映射到QJSValue
:更改 QML 声明信号中用于 var 参数C++参数类型
不过,这在Qt 5.4中已恢复,它将再次使用QVariant
来var
信号参数:将 var 信号参数的映射恢复为 QJSValue
添加信号和插槽
#include <QObject>
class testclass: public QObject
{
Q_OBJECT
public:
explicit testclass(QObject *parent = 0);
signals:
void dsa(QVariant parameter) {
//some code
}
public slots:
void testslot(QVariant parameter) {
//some code here
}
void testslot();
};
相关文章:
- 如何在没有信号的情况下从C++执行QML插槽
- 控制带有信号/插槽的Qt QML滑动视图
- C++发出信号稍后在 QML 中调用
- 无法将 Qml 信号连接到C++插槽
- 可以在 QObject::connect() C++中连接 QML 对象现有信号?
- 使用 enum 参数将 C++ 对象信号连接到 QML 信号处理程序
- 销毁 qml 对象后的信号槽连接
- 当通过引用传递 QObject 时,C++信号的参数在 QML 中显示为"未定义"
- QML:收到C 信号从C 传递时刷新问题
- QT5 C 信号到QML插槽不起作用
- C++和 QML:将 QML 信号连接到C++插槽
- QML和C 连接到信号
- 如何使用C 插槽连接QML信号
- QT:C 信号到QML连接
- 连接从 QML 到 Qt 的信号:var 到 QList<QString>
- QML组件与信号连接
- Qt-Qml连接到上下文属性的QObject属性的信号
- 无法从Qt C++捕获发射到QML的信号
- C++ 注册类型上的信号 QML 插槽
- 连接信号QML到c++ (Qt5)