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

发布于:2024-10-15 ⋅ 阅读:(198) ⋅ 点赞:(0)

如标题所示,笔者试图在子线程中使用基于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:
};


网站公告

今日签到

点亮在社区的每一天
去签到