C++ 具有自定义类型的Qt信号

C++ 具有自定义类型的Qt信号,c++,qt,qml,C++,Qt,Qml,我想用Qt发送一个带有参数的信号。此参数应为自定义结构。我已经用Q_DECLARE_元类型注册了它,但是它不起作用,我得到了一些奇怪的编译错误 她是我的密码: 助手 #ifndef HELPER_H #define HELPER_H #include <QString> #include <QMetaType> struct result{ QString info; bool sugestion; }; Q_DECLARE_METATYPE(result)

我想用Qt发送一个带有参数的信号。此参数应为自定义结构。我已经用Q_DECLARE_元类型注册了它,但是它不起作用,我得到了一些奇怪的编译错误

她是我的密码:

助手

#ifndef HELPER_H
#define HELPER_H

#include <QString>
#include <QMetaType>
struct result{
    QString info;
bool sugestion;
};
Q_DECLARE_METATYPE(result)

#endif // HELPER_H
\ifndef HELPER\u H
#定义辅助对象
#包括
#包括
结构结果{
QString信息;
布尔苏格西翁;
};
Q_DECLARE_元类型(结果)
#endif//HELPER\u H
分析仪.h

#ifndef ANALYSER_H
#define ANALYSER_H
#include "helper.h"
#include <QObject>

class analyser: public QObject
{
    Q_OBJECT
public:
    void test()
    {
        result ret;
        ret.info="Hallo";
        emit show(ret);
    }
signals:
    void show(result r);
};

#endif // ANALYSER_H
#ifndef分析仪
#定义分析器
#包括“helper.h”
#包括
类分析器:公共QObject
{
Q_对象
公众:
无效测试()
{
结果ret;
ret.info=“你好”;
发射显示(ret);
}
信号:
无效显示(结果r);
};
#endif//分析器
qmlbackend.h

#ifndef QMLBACKEND_H
#define QMLBACKEND_H

#include <QObject>
#include "helper.h"
#include <QDebug>

class QmlBackend : public QObject
{
public slots:
    void hit(result res)
    {
        qDebug()<<"Working"<<res.info;
    }
 };

 #endif // QMLBACKEND_H
\ifndef QMLBACKEND\u H
#定义QMLBACKEND\u H
#包括
#包括“helper.h”
#包括
类QmlBackend:公共QObject
{
公众时段:
无效命中(结果恢复)
{

qDebug()这有点奇怪,证明您的代码生成了相同的错误,但是如果我将
result
的结构名称更改为
result
则编译并正确执行(我建议您删除构建文件夹,然后再编译)


我正在寻找Qt文档,其中指出在使用
Q_DECLARE\u METATYPE

时数据类型应大写。不,我没有这样做,但您记得我应该写这是编译时问题。因此,以这种方式注册我的类型没有帮助,或者?注册不会有助于编译器错误。对不起,我没有“不要使用qml。这有点奇怪,证明您的代码生成了相同的错误,但是如果我将
result
的结构名称更改为
result
正确编译(我建议您删除生成文件夹)是的,这同样适用于
Q_ENUM
,值必须有首字母大写才能正确工作。由于一些实现细节,这是一个一般的严格规则。但这其实没什么大不了的,因为按照命名约定,两个类/结构/ENUM至少都有首字母大写。您应该使该语句更简洁在你的答案中输入。:@BaCaRoZzo在Qt文档的哪一部分中使用了这种约定?因为这不是C++标准的一部分。:p对于枚举的外观。我猜同样的情况也适用于类型,至少这个示例表明了这一点。老实说,通过编码约定:D-我总是用大写字母来编写类型,所以我不使用h我对注册类型有直接的经验,它的首字母是小写的!也许我对类型的理解是错误的,但对枚举来说肯定是错误的。我也使用约定,但这个指示并不明确,因为在如何注册struct的示例中显示了这一点。示例在哪里?我错过了它。好吧,如果是这样的话,我很抱歉。正如我所说的id这是一个假设。:)我仍然认为这条规则必须在Enum中突出,因为即使在最近,我看到很多问题都忽略了这一点。大写:这是QML的新
clip:true
:D
#include <QDebug>
#include "qmlbackend.h"
#include "analyser.h"
#include <QGuiApplication>


int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QmlBackend b;
    analyser t;
    QObject::connect(&t,&analyser::show,&b,&QmlBackend::hit);
    t.test();

    return app.exec();
}
moc_analyser.cpp: In static member function 'static void analyser::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)':
moc_analyser.cpp:91:49: error: cannot declare pointer to 'void' member
         typedef void (analyser::*_t)(result );
                                             ^
moc_analyser.cpp:91:49: error: typedef '_t' is initialized (use decltype instead)
moc_analyser.cpp:92:35: error: '_t' does not name a type; did you mean '_o'?
         if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&analyser::show)) {
                               ^~
moc_analyser.cpp:92:38: error: expected '>' before '*' token
         if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&analyser::show)) {
                                  ^
moc_analyser.cpp:92:38: error: expected '(' before '*' token
moc_analyser.cpp:92:39: error: expected primary-expression before '>' token
         if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&analyser::show)) {
                                   ^
moc_analyser.cpp:92:62: error: '_t' does not name a type; did you mean '_o'?
         if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&analyser::show)) {
                                                          ^~
                                                          _o
moc_analyser.cpp:92:84: error: expected ')' before '{' token
         if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&analyser::show)) {
                                                                                ^
moc_analyser.cpp:96:9: error: expected primary-expression before '}' token
     }
     ^