我有一个工作线程,它收集数据并在小部件上显示它们。我试图把这些数据放在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的新手,所以我确信这是一个简单的解决方案,但我无法弄清楚......
答案 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)
MyList
类型qRegisterMetaTypeStreamOperators
我建议你接下来帮助解决这些问题:
template < typename T >
class MetaTypeRegistration
{
public:
inline MetaTypeRegistration()
{
qRegisterMetaType< T >();
qRegisterMetaTypeStreamOperators< T >();
}
};
但是在你的情况下,使用QStringList
是可以忍受的:)