一.标准信号与槽函数
有些信号和槽的函数模板都已经被写好了,只需要调用即可
下面是一个点击按钮关闭窗口的程序
.h文件
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> class MyWidget : public QWidget { Q_OBJECT //使用信号与槽的时候需要用到它 public: MyWidget(QWidget *parent = 0); ~MyWidget(); public: QPushButton* pBtn1; }; #endif // MYWIDGET_H
.cpp文件
#include "mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { pBtn1 = new QPushButton(this); //指定父对象,不然按钮在窗口上是无法正常显示的 pBtn1->setText("Close");//创建一个关闭窗口的按钮 pBtn1->move(100,100); //更改按钮在窗口上的位置 //标准信号与槽函数的使用 connect(pBtn1, &QPushButton::pressed, this, &MyWidget::close); /*pBtn1:信号发出者,为指针类型 *&QPushButton::pressed 信号函数; &发送者的类名:信号名字 *this:信号的接收者 *&Widget::close 槽函数,信号处理函数; &接受的类名::槽函数名称 */ } MyWidget::~MyWidget() { }
二.自定义槽函数
.h文件
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> class MyWidget : public QWidget { Q_OBJECT //使用信号与槽的时候需要用到它 public: MyWidget(QWidget *parent = 0); ~MyWidget(); public: QPushButton* pBtn1; public: //自定义的槽函数 void mySlot(); }; #endif // MYWIDGET_H
.cpp文件
#include "mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { pBtn1 = new QPushButton(this); //指定父对象,不然按钮在窗口上是无法正常显示的 pBtn1->setText("Close");//创建一个关闭窗口的按钮 pBtn1->move(100,100); //更改按钮在窗口上的位置 connect(pBtn1, &QPushButton::pressed, this, mySlot); /*自定义槽函数: * QT5:任意的成员函数,普通的全局函数,静态函数 * 由于信号函数是没有返回值的,所以槽函数一定也没有返回值 * 一般在QT5中都是使用成员函数作为槽函数 */ } //成员函数 void MyWidget::mySlot() { this->close(); } MyWidget::~MyWidget() { }
三.自定义信号与槽函数
下面是一个两个窗口相互切换的程序,点击主窗口按钮,切换到子窗口;在子窗口中点击按钮,给主窗口发送自定义信号。
mainwidget.h文件
#ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QWidget> #include <QPushButton> #include "subwidget.h" class MainWidget : public QWidget { Q_OBJECT public: MainWidget(QWidget *parent = 0); ~MainWidget(); public: QPushButton* pBtn1; SubWidget subWidget; public: void ShowSubWidget(); void DealSub(); void DealSubWin(int, QString); }; #endif // MAINWIDGET_H
mainwidget.cpp文件
#include "mainwidget.h" #include <QDebug> MainWidget::MainWidget(QWidget *parent) : QWidget(parent) { this->setWindowTitle("主窗口"); pBtn1 = new QPushButton("切换到子窗口", this); pBtn1->move(100, 100); //点击按钮,显示子窗口 connect(pBtn1, &QPushButton::pressed, this, ShowSubWidget); //处理子窗口发送的信号 //不带参数的信号 void(SubWidget::*funSignal)() = &SubWidget::mySignal; connect(&subWidget, funSignal, this, DealSub); //带有参数的信号 void(SubWidget::*TestSignal)(int, QString) = &SubWidget::mySignal; connect(&subWidget, TestSignal, this, DealSubWin); } MainWidget::~MainWidget() { } void MainWidget::ShowSubWidget() { subWidget.show(); } void MainWidget::DealSub() { subWidget.hide(); this->show(); } void MainWidget::DealSubWin(int a, QString str) { qDebug() << a; qDebug() << str.toUtf8().data(); }
subwidget.h文件
#ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushButton> class SubWidget : public QWidget { Q_OBJECT public: explicit SubWidget(QWidget *parent = 0); signals: //自定义信号 /*信号没有返回值,但可以有参数 * 信号就是函数的声明,只需要声明,无需定义 * 使用emit mySignal * 信号可以重载 */ void mySignal(); //无参数的信号 void mySignal(int, QString); //有参数的信号 public slots: public: QPushButton* pBtn; public: //自定义槽函数 void sendSlot(); }; #endif // SUBWIDGET_H
subwidget.cpp文件
#include "subwidget.h" SubWidget::SubWidget(QWidget *parent) : QWidget(parent) { this->setWindowTitle("子窗口"); pBtn = new QPushButton("切换到主窗口", this); pBtn->move(100, 100); connect(pBtn, &QPushButton::clicked, this, sendSlot); } void SubWidget::sendSlot() { //当按钮按下时,子窗口向主窗口发送信号 emit mySignal(); emit mySignal(100, "我是子窗口"); }
原文地址:https://www.cnblogs.com/QingYiShouJiuRen/p/11442060.html
时间: 2024-11-04 05:05:27