C++ 连接信号/插槽中的问题,qRegisterMetaType()QList<;QString>;

C++ 连接信号/插槽中的问题,qRegisterMetaType()QList<;QString>;,c++,multithreading,qt,signals-slots,C++,Multithreading,Qt,Signals Slots,我有一个工作线程,它收集数据并在小部件上显示它们。我试图将这些数据放在QList列表中。它首先给我一个错误,我需要注册元类型,但在我注册后,它给我一个新的错误,它没有在这个范围内注册 有很多代码,所以我将给出一个简短的版本 公共部分的widget.h有MyThread*线程 widget.cpp Widget::Widget(QWidget *parent) : QMainWindow(parent), ui(new Ui::Widget) { ui->setupUi(this);

我有一个工作线程,它收集数据并在小部件上显示它们。我试图将这些数据放在QList列表中。它首先给我一个错误,我需要注册元类型,但在我注册后,它给我一个新的错误,它没有在这个范围内注册

有很多代码,所以我将给出一个简短的版本

公共部分的widget.h有MyThread*线程

widget.cpp

Widget::Widget(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Widget)
{
    ui->setupUi(this);

    thread = new MyThread(this);

    connect(thread, SIGNAL(ShowData(QList<QString>)), this, SLOT(ev_ShowData(QList<QString>)));

    thread.start();
}
}

h类:

#include<QMetaType>

class UNTITLEDSHARED_EXPORT iMag
{

  public:
  Class();

  typedef QList<QString> MyList;
  void GetData();

};
#包括
类未共享的导出图像
{
公众:
类();
typedef-QList-MyList;
void GetData();
};
class.cpp:

#include class.h

Class::Class()
{
   qRegisterMetaType<MyList>("MyList");
}

Class::GetData()
{
  // A lot of code and then a error part

  MyList.clear();
  MyList << stringToBeWriten;

  // it gives me error in these two lines of cdoe
}
#包括class.h
类::类()
{
qRegisterMetaType(“MyList”);
}
类::GetData()
{
//大量代码,然后是错误部分
MyList.clear();

MyList如果这是您的实际代码,那么这一行的语法是错误的:
qRegisterMetaType列表;

应该是这样的:

qRegisterMetaType<list>("list");
然后你可以像这样使用它:

myList.clear();
myList << stringToBeWriten;
myList.clear();

MyList

保存你自己的麻烦和用法。
BR>记录中,你的问题来自于QT预处理器的信号和时隙,MOC,不使用完整的C++解析器。它将寻找使用强->字符串匹配< /强>的方法的签名。

connect(thread, SIGNAL(ShowData(QList<QString>)), this, SLOT(ev_ShowData(QList<QString>)));
注意:我看到您正在子类化QThread

  • 你没有申报 类元类型注册 { 公众: 内联MetaTypeRegistration() { qRegisterMetaType(); qRegisterMetaTypeStreamOperators(); } };

  • 但在你的情况下,最好使用
    QStringList
    :)

    我的代码实际上就像你说的,我现在编辑了ti,只是输入错误。这不是我的问题……”“Qt在处理模板方面非常糟糕”QT需要的是,在信号/时隙中使用的类型总是被命名为相同的。其根本原因很简单:实现-解析<代码>信号< /C> >和<代码>槽< /Cord>宏,<代码> MOC < /C>工具> -不使用完整的C++解析器。Qt的类型语义是字符串的语义。如果字符串不同,则类型不匹配。就这么简单。只要名称空间和模板在任何地方都与字符串相同,您就可以自由使用它们。随着认识到Qt需要对类型进行运行时解析,不可避免的结果是:如果您不想让Qt“变坏”此时,您需要将llvm的叮当声与每个Qt应用程序捆绑在一起。然后,坦率地说,我们不会抱怨“不擅长模板”,而是会听到关于“Qt就是bloatz”的抱怨你不能吃你的蛋糕,你也知道。好的,我需要重新表述一下。我不讨厌有一个最好的C++库。我能从你的评论中借点什么吗?QT新手和QT的人所犯的最大错误是不知道那些已经可用和完全记录的奇妙的类和机制。
    list myList;
    
    myList.clear();
    myList << stringToBeWriten;
    
    connect(thread, SIGNAL(ShowData(QList<QString>)), this, SLOT(ev_ShowData(QList<QString>)));
    
    connect(thread, SIGNAL(ShowData(MyList)), this, SLOT(ev_ShowData(MyList)));
    
    template < typename T >
    class MetaTypeRegistration
    {
    public:
        inline MetaTypeRegistration()
        {
            qRegisterMetaType< T >();
            qRegisterMetaTypeStreamOperators< T >();
        }
    };