Qt 自定义信号与槽

📅 发布时间:2026/10/17 10:07:39
Qt 自定义信号与槽
目录创建自定义信号发射信号​自定义槽函数关联信号与槽使用 宏 连接使用函数指针源码Qt 笔记使用按钮点击事件发射自定义的信号响应自定义的槽函数。测试自定义信号与槽。创建自定义信号在头文件中声明自定义信号信号用 signals 关键字修饰没有返回值也没有定义实现参数可自定义。发射信号发射自定义的信号自定义槽函数声明槽函数 并在.cpp 文件中实现。关联信号与槽连接信号和槽函数使用 宏 连接使用宏SIGNAL()和SLOT()指定信号和槽函数注意如果信号和槽函数带有参数还需注明参数类型connect(this, SIGNAL(openFileSignal(QString)), this, SLOT(openFileWindow()));//方式1 使用宏SIGNAL()和SLOT()指定信号和槽函数使用SLOT 指定槽函数是必须是slots 区域的函数connect(action, SIGNAL(triggered()), this, SLOT(linePowerSpectrum())); // ↑ 字符串形式 ↑ 必须是 slots 区域的函数使用函数指针使用函数指针方式形式进行关联 注意使用这种方式需要信号名称唯一没有参数不同而同名的两个的函数。connect(this, MainWindow::openFileSignal, this, MainWindow::openFileWindow);//方式2 使用函数指针 形式进行关联源码mainwindow.h 源码#ifndef MAINWINDOW_H #define MAINWINDOW_H #include string.h #include QMainWindow QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { //Q_OBJECT 是一个宏添加它才能正常使用 Qt 的信号和槽机制 Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); signals: void openFileSignal(QString msg); //public: // void emitOpenFileSignal(); public slots: void openFileWindow();//自定义槽 void emitOpenFileSignalSlots(); private slots: void on_pushButton_importPosBtn_clicked(); private: Ui::MainWindow *ui; std::string posFileName; }; #endif // MAINWINDOW_Hmainwindow.cpp#include mainwindow.h #include ui_mainwindow.h #include QFileDialog #include string MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui-setupUi(this); connect(ui-pushButton_importBinBtn,SIGNAL(clicked()),this,SLOT(openFileWindow()));//Qt 5 新语法旧QObject::connect() connect(ui-savePosBtn, SIGNAL(clicked()), this, SLOT(emitOpenFileSignalSlots())); //connect(this, SIGNAL(openFileSignal(QString)), this, SLOT(openFileWindow()));//方式1 使用宏SIGNAL()和SLOT()指定信号和槽函数 connect(this, MainWindow::openFileSignal, this, MainWindow::openFileWindow);//方式2 使用函数指针 形式进行关联 } MainWindow::~MainWindow() { delete ui; } void MainWindow::openFileWindow(){ QString fileName QFileDialog::getOpenFileName(NULL, 导入bin文件,.,文本文件(*.txt)); ui-lineEdit_posInput-setText(fileName); } void MainWindow::on_pushButton_importPosBtn_clicked() { QString fileName QFileDialog::getOpenFileName(NULL, 导入Pos文件,.,文本文件(*.txt)); ui-lineEdit_posInput-setText(fileName); this-posFileName fileName.toStdString(); } void MainWindow::emitOpenFileSignalSlots(){ emit openFileSignal(发射信号); }效果选择文件效果