簡體   English   中英

qRegisterMetaType()QList連接信號/插槽中的問題<QString>

[英]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。 您可能不需要這樣做。

  1. 您沒有為MyList類型聲明<<運算符
  2. 您忘記了調用qRegisterMetaTypeStreamOperators

我為您建議此類問題的下一個助手:

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

但是在您的情況下,可以使用QStringList :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM