multithreading - 将 QList<QString>* 传递给来自 QThread 的信号

标签 multithreading qt signals qlist slot

在我的 qt 应用程序中,我有一个类(worker),它是从在线程中运行的对象调用的。在我的 worker 类中,我创建了 QList,就像这样

QList <QString> albums;

while (i.hasNext())
{
  QRegularExpressionMatch album = i.next();
  albums.append(album.captured("album"));
}
emit SignalGotAlbums(albums);

我在另一个类中收到了这个信号,该类正在包装我的 worker ,用于线程使用。让我们称这个类为 GetAlbumsThread。在那里我成功地在一个插槽中收到了 SignalGotAlbums
void GetAlbumsThread::Reply(QList <QString> &list)
{

 emit gotAlbums(list);
 emit finished();
}

在这个插槽中,我正在触发另一个信号 gotAlbums,它假设与我的 gui 线程中的一个插槽连接,并在那里传递我的 QList。我的问题是,当我尝试将 QList 从线程传递给 gui 时,它不起作用!插槽未接收到 gotAlbums 信号;

信号是这样声明的:
void gotAlbums(QList<QString> &);

并像这样连接到我的 gui 插槽(当然在我的 gui 线程中):
private slots:
    void AlbumsReceived(QList<QString> &list)
    ...

    QThread* albumsThread = new QThread();

    GetAlbumsThread *albumsObject = new GetAlbumsThread();

    albumsObject->moveToThread(albumsThread);

    connect(albumsThread, SIGNAL(started()), albumsObject, SLOT(process()));

    connect(albumsObject, SIGNAL(gotAlbums(QList<QString> &)), this, SLOT(AlbumsReceived(QList<QString> &));

     albumsThread->start();

由于某种原因,AlbumsReceived 永远不会被调用。连接返回真。有人可以帮我弄这个吗。我认为问题在于线程之间传递 QList 。

最佳答案

您是否尝试在调用 Object::connect(...) 之前注册 QList 对象?

您可以使用以下代码声明元类型:

qRegisterMetaType< QList<QString> >( "QList<QString>" );

关于multithreading - 将 QList<QString>* 传递给来自 QThread 的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17075890/

相关文章:

c++ - 并发访问 QTcpSocket 对象

c - POSIX 线程/信号 : Portable way to determine to which thread a signal was delivered?

python - Django 自定义信号

c++ - 如何从linux中的c++中启动的信号中找出进程的pid?

Java - 非常小的图像上的多线程需要很长时间

c++ - Qt5 : How to wait for a signal in a thread?

java - 通过run方法和Start方法执行Thread

c++ - 如何获得 QDockArea 的大小?

java - 将线程优先级传递给线程池

python - 如果作为 Python 子进程调用,多线程 Perl 脚本会导致管道损坏