簡體   English   中英

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();
}

test.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值。 因此,它作為QJSValue傳播到c ++中,並且您嘗試連接的信號的簽名實際上是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();
}

添加信號和插槽

#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();
};

QVariant是在Qt 5.2中用於映射var信號參數的正確類型,但它已在Qt 5.3中更改為映射到QJSValue改變用於QML聲明信號中的var參數的C ++參數類型

雖然,這已經在Qt 5.4中得到了回復,它將再次使用QVariant用於var信號參數: 將var信號參數的映射恢復為QJSValue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM