QObject::connect:在 c++ Qt 5.3 中连接 qml 信号时没有这样的信号

QObject::connect: No such signal while connecting qml signals in c++ Qt 5.3

本文关键字:信号 qml c++ connect Qt QObject 连接      更新时间:2023-10-16

我是使用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中已恢复,它将再次使用QVariantvar信号参数:将 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();
};