[英]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.