qt 自定义信号和槽举例
在Qt中,自定义信号和槽是对象间通信的一种强大机制。以下是一个简单的例子,展示了如何定义和使用自定义信号和槽。
(图片来源网络,侵删)
首先,我们定义一个简单的Worker类,它有一个自定义信号workCompleted,当某个任务完成时,这个信号将被触发。
Worker.h
#ifndef WORKER_H #define WORKER_H #include class Worker : public QObject { Q_OBJECT public: Worker(QObject *parent = nullptr); public slots: void doWork(); signals: void workCompleted(const QString &result); }; #endif // WORKER_H
Worker.cpp
#include "Worker.h" #include #include Worker::Worker(QObject *parent) : QObject(parent) {} void Worker::doWork() { // 模拟耗时工作 QThread::sleep(2); // 假设工作耗时2秒 emit workCompleted("工作完成"); }
接下来,我们创建一个MainWindow类,它将使用Worker类,并连接自定义信号workCompleted到一个槽函数,以便在工作完成时更新UI。
MainWindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "Worker.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void onWorkCompleted(const QString &result); void onStartWork(); private: Ui::MainWindow *ui; Worker *worker; }; #endif // MAINWINDOW_H
MainWindow.cpp
#include "MainWindow.h" #include "ui_MainWindow.h" #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), worker(new Worker(this)) { ui->setupUi(this); // 连接信号和槽 connect(worker, &Worker::workCompleted, this, &MainWindow::onWorkCompleted); connect(ui->startButton, &QPushButton::clicked, this, &MainWindow::onStartWork); } MainWindow::~MainWindow() { delete ui; } void MainWindow::onWorkCompleted(const QString &result) { QMessageBox::information(this, "工作完成", result); } void MainWindow::onStartWork() { worker->doWork(); }
在这个例子中,Worker类有一个doWork槽函数,它模拟了一个耗时任务,并在任务完成后发射workCompleted信号。MainWindow类创建了Worker的实例,并将workCompleted信号连接到一个槽函数onWorkCompleted,该函数显示一个消息框来通知用户工作已完成。
当用户点击MainWindow中的开始按钮时,会触发onStartWork槽函数,进而调用worker->doWork()来开始工作。工作完成后,workCompleted信号被发射,从而触发onWorkCompleted槽函数并更新UI。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。