可以在 QWidget
的子类中定义一个槽函数,并通过信号与槽机制来给线程发送信号。下面是一个示例程序:
MyThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread {
Q_OBJECT
signals:
void mySignal(int value);
protected:
void run() override;
};
#endif // MYTHREAD_H
MyThread.cpp
#include "MyThread.h"
void MyThread::run() {
// 线程执行任务的代码...
}
MyWidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include "MyThread.h"
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget {
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
~MyWidget();
private slots:
void on_myButton_clicked();
private:
Ui::MyWidget *ui;
};
#endif // MYWIDGET_H
MyWidget.cpp
#include "MyWidget.h"
#include "ui_MyWidget.h"
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget) {
ui->setupUi(this);
MyThread *thread = new MyThread(this);
// 将 widget 的信号连接到线程的槽函数上
connect(this, SIGNAL(mySignal(int)), thread, SLOT(onMySignal(int)));
}
void MyWidget::on_myButton_clicked() {
int value = 123;
// 发射 widget 的信号,将数据传递给线程进行处理
emit mySignal(value);
}
在这个例子中,我们在 MyWidget
类中定义了一个名为 mySignal
的信号,并在主窗口类的槽函数 on_myButton_clicked()
中发射该信号,将数据传递给线程进行处理。然后在 MyWidget
类中连接该信号和线程的槽函数 onMySignal
,当信号被发射时,会自动触发该槽函数并进行相应的处理。
注意:为了保证线程安全,我们使用了默认的连接模式(即 Qt::AutoConnection),这样可以让 Qt 根据当前执行环境来选择最合适的连接方式。另外需要注意,在信号和槽之间传递参数时要保证类型一致性。