0
点赞
收藏
分享

微信扫一扫

Qt子线程运行报错error: undefined reference to `excelThread::conversionFinished()‘

yongxinz 2024-10-11 阅读 15

如标题所示,笔者试图在子线程中使用基于GUI的对话框,而基于GUI的对话框需要在主线程(也称为GUI线程)中运行,在子线程中不能直接用,需要使用信号与槽机制,将请求发送到主线程,然后在主线程中打开对话框。

1. 首先,笔者在子线程的类定义(thread.h文件)中声明了信号,如下所示:

signals:
void conversionFinished();

2. 然后,在子线程的run函数中,需要使用对话框的地方,发送了信号

void excelThread::run()
{ ...
emit conversionFinished();
}

3. 在主线程中连接工作线程的信号到一个槽,该槽将打开对话框。具体实现步骤是先在主线程的头文件中声明槽函数

public slots:
void onConversionFinished();

然后在主线程的cpp文件中实现该槽函数,也就是创建对话框

void Widget::onConversionFinished()
{
QMessageBox::information(this, "提示消息框", "转换已完成!", QMessageBox::Ok, QMessageBox::NoButton);
}

最后连接子线程的信号和该槽函数,当子线程发送信号时,主线程就会执行槽函数,创建一个对话框

//connect(&thread_xls,SIGNAL(conversionFinished()),this,SLOT(onConversionFinished()),Qt::DirectConnection);
//如果设置自动连接,程序就会报错Object::setParent: Cannot set parent, new parent is in a different thread,正确写法如下:
connect(&thread_xls,SIGNAL(conversionFinished()),this,SLOT(onConversionFinished()));

在运行中,程序在2.中发送信号那一行报错未声明:error: undefined reference to `excelThread::conversionFinished()',但明明1中已经声明了,经排查,发现是子线程在类定义时未继承QObject,也就是没有写宏语句Q_OBJECT, Q_OBJECT宏在QObject及其子类的定义中起着至关重要的作用。这个宏不仅为类提供了信号和槽机制的支持,还引入了Qt的元对象系统(Meta-Object System)的一系列功能。加上宏语句以后,就可以正常运行了,子线程的类定义的正确代码如下:

class excelThread :public QThread
{
Q_OBJECT; //本文中就是因为没加这一句所以报错未定义
private:
QMutex mutex;
bool xls_stop=true;
ArtScope_wfmInfo filewfmInfo;
public:
explicit excelThread();
void stopThread(); //结束线程
protected:
void run() Q_DECL_OVERRIDE;

signals:
void conversionFinished();
void requestSaveFileDialog();
public slots:
};

举报

相关推荐

0 条评论