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

ati*_*tin 5 c++ qt signals-slots qml

我是使用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();
}
Run Code Online (Sandbox Code Playgroud)

qml文件:test.qml

Item {
    width: 800
    height: 500
    signal dsa(var obj)
    SystemPalette { id: palette }
}
Run Code Online (Sandbox Code Playgroud)

测试类: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);

};
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

QObject::connect: No such signal test_QMLTYPE_0::dsa(QVariant) in ..
Run Code Online (Sandbox Code Playgroud)

dbr*_*anj 10

问题是你将dsasignal参数声明为'var'类型,它被qml引擎视为javascript值.因此,这会作为a传播到c ++中QJSValue,并且您尝试连接的信号的签名实际上是dsa(QJSValue).

如果您想要签名dsa(QVariant),请在test.qml中更改您的信号声明,如下所示:

// test.qml

Item {
  signal dsa(variant obj)

  width: 800
  height: 500

  SystemPalette { id: palette }
}
Run Code Online (Sandbox Code Playgroud)

这应该允许您在尝试使用语句时进行连接

QObject::connect(item,SIGNAL(dsa(QVariant)),&dsc,SLOT(testslot(QVariant)));
Run Code Online (Sandbox Code Playgroud)

(但首先你应该更新你的插槽的签名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();
}
Run Code Online (Sandbox Code Playgroud)