繁体   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