[英]connect signal (Qstring) whit slot (String) of 2 different class
[英]Problems in connect signal/slot, qRegisterMetaType() QList<QString>
我有一个收集数据并将其显示在小部件上的工作线程。 我试图将这些数据放入QList列表中。 它首先给我一个我需要注册MetaType的错误,但是在我这样做之后,它给了我一个新错误,那就是它没有在此范围内注册。
有很多代码,所以我给一个简短的版本
公共部分的widget.h具有MyThread * thread;
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的新手,所以我确定这是一个简单的解决方案,但我无法弄清楚...
如果这是您的实际代码,则此行的语法错误: qRegisterMetaType<list> list;
。
应该是这样的:
qRegisterMetaType<list>("list");
请参阅文档 。
您似乎也在尝试将类型用作变量:
list.clear();
list << stringToBeWriten;
您应该做的就是声明一个具有该类型的变量。 您可以在class.h
这样做:
list myList;
然后您可以像这样使用它:
myList.clear();
myList << stringToBeWriten;
避免麻烦,并使用QStringList 。
为了记录在案,您的问题是因为信号和插槽的Qt预处理器(moc)没有使用成熟的C ++解析器,而是使用字符串比对来寻找方法的签名。 因此以下将失败
connect(thread, SIGNAL(ShowData(QList<QString>)), this, SLOT(ev_ShowData(QList<QString>)));
因为您已注册"MyList"
(它是字符串)与“ QList<QString>"
不匹配。
对于模板,我认为最好的选择是通过子类使用专业化(因此不再是模板)。 能够使
connect(thread, SIGNAL(ShowData(MyList)), this, SLOT(ev_ShowData(MyList)));
注意:我看到您在继承QThread。 您可能不需要这样做。
MyList
类型声明<<运算符 qRegisterMetaTypeStreamOperators
我为您建议此类问题的下一个助手:
template < typename T >
class MetaTypeRegistration
{
public:
inline MetaTypeRegistration()
{
qRegisterMetaType< T >();
qRegisterMetaTypeStreamOperators< T >();
}
};
但是在您的情况下,可以使用QStringList
:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.