自定义信号和槽
自定义槽
槽可以是任何成员函数、普通全局函数、静态函数
槽函数和信号的参数和返回值要一致
由于信号是没有返回值的, 槽函数也一定没有返回值
示例:在点击按钮的时候执行自定义的槽函数,自定义的槽函数为弹出一个弹框
.h文件:
#pragma once #include <QtWidgets/QWidget> #include "ui_qtwidgetsapplication1.h" #include <QPushButton> #include <QFile> #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif #include <QString> #include <QMessageBox> class QtWidgetsApplication1 : public QWidget { Q_OBJECT public: QtWidgetsApplication1(QWidget* parent = nullptr); ~QtWidgetsApplication1(); QString ReadQssFile(const QString& filePath); private: Ui::QtWidgetsApplication1Class* ui; public slots: void messagebox();// 自定义槽函数 };
.cpp文件:
#include "qtwidgetsapplication1.h" QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent) : QWidget(parent) { ui->setupUi(this); // 设置窗口标题 setWindowTitle("测试窗口"); // 重设大小 resize(400, 500); // x轴向右移动500,y轴向下移动200 move(500, 200); // 设置背景色 setStyleSheet("QWidget{background-color:beige}"); QPushButton* closeButton = new QPushButton(tr("测试"), this); // 创建指定父对象的QPushButton对象,使用this作为父对象 closeButton->setFixedSize(100, 30); // 大小设置 closeButton->move(220, 0); // 右上角 // 样式设置 closeButton->setStyleSheet(ReadQssFile(":/QtWidgetsApplication1/QPushButton.qss")); // 点击时关闭 /* connect(closeButton, &QPushButton::clicked, this, &QtWidgetsApplication1::close);*/ connect(closeButton, &QPushButton::clicked, this, &QtWidgetsApplication1::messagebox); } /// <summary> /// 自定义槽函数,当按钮发送点击信号的时候触发 /// </summary> void QtWidgetsApplication1::messagebox() { //提问对话框 利用返回值判断用户按键类型 if (QMessageBox::Save == QMessageBox::question(this, "提问", "要保存吗?", QMessageBox::Save | QMessageBox::No, QMessageBox::No)) { //信息对话框 QMessageBox::information(this, "提示", "保存成功"); } else { //警告对话框 QMessageBox::warning(this, "警告", "未保存"); } } QtWidgetsApplication1::~QtWidgetsApplication1() { delete ui; ui = nullptr; } QString QtWidgetsApplication1::ReadQssFile(const QString& filePath) { QString strStyleSheet = ""; QFile file(filePath); file.open(QFile::ReadOnly); if (file.isOpen()) { strStyleSheet = QLatin1String(file.readAll()); } return strStyleSheet; }
效果:
自定义槽和信号
下面的例子是通过点击按钮来调用自定义槽函数和信号
.h文件:
#pragma once #include <QtWidgets/QWidget> #include "ui_qtwidgetsapplication1.h" #include <QPushButton> #include <QFile> #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif #include <QString> #include <QMessageBox> class QtWidgetsApplication1 : public QWidget { Q_OBJECT public: QtWidgetsApplication1(QWidget* parent = nullptr); ~QtWidgetsApplication1(); QString ReadQssFile(const QString& filePath); private: Ui::QtWidgetsApplication1Class* ui; public slots: void messagebox();// 自定义槽函数 void custom_signal(const QString& message);// 自定义个带参数的槽函数,对应的信号也应该是带同类型的参数 signals: void custom_clicked(const QString& num); };
.cpp文件
#include "qtwidgetsapplication1.h" QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent) : QWidget(parent) { ui->setupUi(this); // 设置窗口标题 setWindowTitle("测试窗口"); // 重设大小 resize(400, 500); // x轴向右移动500,y轴向下移动200 move(500, 200); // 设置背景色 setStyleSheet("QWidget{background-color:beige}"); QPushButton* closeButton = new QPushButton(tr("测试"), this); // 创建指定父对象的QPushButton对象,使用this作为父对象 closeButton->setFixedSize(100, 30); // 大小设置 closeButton->move(220, 0); // 右上角 // 样式设置 closeButton->setStyleSheet(ReadQssFile(":/QtWidgetsApplication1/QPushButton.qss")); // 点击时关闭 /* connect(closeButton, &QPushButton::clicked, this, &QtWidgetsApplication1::close);*/ connect(closeButton, &QPushButton::clicked, this, &QtWidgetsApplication1::messagebox); // 接收到点击信号时做出反应 connect(this, SIGNAL(custom_clicked(const QString&)), this, SLOT(custom_signal(const QString&))); } /// <summary> /// 自定义槽函数,当按钮发送点击信号的时候触发 /// </summary> void QtWidgetsApplication1::messagebox() { // 在点击按钮的时候触发自定义的信号, emit custom_clicked("触发自定义的信号"); } /// <summary> /// 自定义的槽函数,主要是接受来自自定义的信号:custom_clicked /// </summary> /// <param name="message"></param> void QtWidgetsApplication1::custom_signal(const QString& message) { QMessageBox::information(this, "提示", message); } QtWidgetsApplication1::~QtWidgetsApplication1() { delete ui; ui = nullptr; } QString QtWidgetsApplication1::ReadQssFile(const QString& filePath) { QString strStyleSheet = ""; QFile file(filePath); file.open(QFile::ReadOnly); if (file.isOpen()) { strStyleSheet = QLatin1String(file.readAll()); } return strStyleSheet; }
效果: