首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QObject::connect:在c++ QT5.3中连接qml信号时没有这样的信号

QObject::connect:在c++ QT5.3中连接qml信号时没有这样的信号
EN

Stack Overflow用户
提问于 2014-11-17 12:57:31
回答 3查看 3.5K关注 0票数 6

我是一个使用Qt框架的新手。我不知道我哪里出了问题。我试着看了很多相关的材料,但还是搞不清楚。

我得到了"QObject::connect:没有这样的信号错误.“而我在qml文件中声明了一个信号。

以下是代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
Item {
    width: 800
    height: 500
    signal dsa(var obj)
    SystemPalette { id: palette }
}

测试类testclass.cpp

代码语言:javascript
复制
#include <QObject>

class testclass: public QObject
{
Q_OBJECT
public:
explicit testclass(QObject *parent = 0);

signals:
void dummysignal(QVariant);


public slots:


void testslot(QVariant);

};

我得到了这个错误:

代码语言:javascript
复制
QObject::connect: No such signal test_QMLTYPE_0::dsa(QVariant) in ..
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-18 07:22:37

问题是,您将dsa信号参数声明为'var‘类型,它被qml引擎认为是一个javascript值。因此,这会以QJSValue的形式传播到QJSValue中,您试图连接的信号的签名实际上是dsa(QJSValue)

如果希望签名为dsa(QVariant),请按以下方式更改test.qml中的信号声明:

代码语言:javascript
复制
// test.qml

Item {
  signal dsa(variant obj)

  width: 800
  height: 500

  SystemPalette { id: palette }
}

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

代码语言:javascript
复制
QObject::connect(item,SIGNAL(dsa(QVariant)),&dsc,SLOT(testslot(QVariant)));

(但首先,您应该将您的插槽的签名更新为void testslot(QVariant);...otherwise,您只会遇到同样的问题,即没有这样的插槽错误)。

FWIW,这是调试“没有这样的信号/插槽”错误的一个有用的技巧:

代码语言:javascript
复制
// 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();
}
票数 10
EN

Stack Overflow用户

发布于 2014-11-26 10:38:08

QVariant是QT5.2中用于映射var信号参数的合适类型,但QT5.3中将其改为QJSValue更改QML声明信号中用于无功参数的C++参数类型

不过,QT5.4中已经恢复了这一点,它将再次将QVariant用于var信号参数:无功信号参数到QJSValue的恢复映射

票数 2
EN

Stack Overflow用户

发布于 2014-11-17 13:11:47

加信号和插槽

代码语言:javascript
复制
#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();
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26973247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档