【问题标题】:QObject::connect: No such signal while connecting qml signals in c++ Qt 5.3QObject::connect:在c ++ Qt 5.3中连接qml信号时没有这样的信号
【发布时间】:2014-11-17 12:57:31
【问题描述】:

我是使用 Qt 框架的新手。我不确定我哪里出错了。看了很多相关的资料还是没搞明白。

当我在 qml 文件中声明一个信号时,我收到“QObject::connect: No such signal error..”。

代码如下:

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 ..

【问题讨论】:

    标签: c++ qt qml signals-slots


    【解决方案1】:

    问题在于您将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();
    }
    

    【讨论】:

    • 感谢您的帮助。我参考了这个文档来编写来自 QT 的初始代码,他们在示例中使用 var 而不是变体。 qt-project.org/doc/qt-5/…
    • 对使用元对象方法的建议表示赞赏
    【解决方案2】:

    QVariant 是在 Qt 5.2 中用于映射 var 信号参数的正确类型,但在 Qt 5.3 中已更改为映射到 QJSValueChange C++ parameter type used for var parameters in QML declared signals

    不过,这已在 Qt 5.4 中恢复,它将再次使用 QVariant 来处理 var 信号参数: Revert mapping of var signal parameters to QJSValue

    【讨论】:

    • 哦,好的,谢谢,这个变化对新开发人员造成了严重破坏,因为这些东西不起作用:-)
    【解决方案3】:

    添加信号和槽

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多