连接信号/槽中的问题,qRegisterMetaType()QList <qstring> </qstring>

时间:2014-03-14 14:04:37

标签: c++ multithreading qt signals-slots

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

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

公共部分中的

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

thread.cpp

MyThread::run()
{
   class.GetData();
   emit ShowData(class.list);
}

}

class.h:

#include<QMetaType>

class UNTITLEDSHARED_EXPORT iMag
{

  public:
  Class();

  typedef QList<QString> 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
}

我也是Qt的新手,所以我确信这是一个简单的解决方案,但我无法弄清楚......

3 个答案:

答案 0 :(得分:0)

如果这是您的实际代码,那么此行中的语法错误:qRegisterMetaType<list> list;

应该是这样的:

qRegisterMetaType<list>("list");

请参阅docs

您似乎也尝试在此处使用类型作为变量:

list.clear();
list << stringToBeWriten;

您应该做的是声明具有该类型的变量。您可以在class.h

中执行此操作
list myList;

然后你就可以使用它:

myList.clear();
myList << stringToBeWriten;

答案 1 :(得分:0)

省去麻烦并使用QStringList

为了记录你的问题来自于信号和插槽的Qt预处理器moc,它不使用完整的C ++解析器。它将使用寻找方法的签名字符串匹配 。因此以下将失败

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

因为您已注册"MyList",因此字符串不匹配&#34; QList<QString>"

使用模板我认为最好的选择是通过子类别使用特化(因此不再是模板)。它是能够制作

connect(thread, SIGNAL(ShowData(MyList)), this, SLOT(ev_ShowData(MyList)));

注意:我看到你正在继承QThread。 It is likely you dont need to do that.

答案 2 :(得分:0)

  1. 您没有声明&lt;&lt; MyList类型
  2. 的运算符
  3. 您忘了拨打qRegisterMetaTypeStreamOperators
  4. 我建议你接下来帮助解决这些问题:

    template < typename T >
    class MetaTypeRegistration
    {
    public:
        inline MetaTypeRegistration()
        {
            qRegisterMetaType< T >();
            qRegisterMetaTypeStreamOperators< T >();
        }
    };
    

    但是在你的情况下,使用QStringList是可以忍受的:)