5.信号与槽:
信号与槽机制介绍:
优点:松散耦合,信号发出短端和接受端可以毫无关联,如果要关联需要connect函数。
(2)connect函数使用:
connect(信号发出者,信号,信号接收着,槽函数)
connect(sender,signal,receiver,slot)
信号:
点击信号,按下信号,抬起信号,切换信号;
槽函数:
很多,查找qt助手
MYbutton *butten3=new MYbutton; butten3->setParent(this); butten3->setText("关闭"); butten3->move(300,100); butten3->setFixedSize(100,100); connect(butten3,&QPushButton::clicked,this,&Widget::close); butten3->show();
当butten3,发生clicked,this执行close;
(2)自定义信号与槽:
步骤一:确定场景:
天黑了-------->我想你了
有人开门--------->开门
步骤二:添加天黑类和想你类
步骤三:在天黑类声明信号,想你类中声明并实现槽函数;
tianhei.h
void tianhei(); 必须是void,可以有参数,不需要实现只声明,可以重载;
#ifndef TIANHEI_H #define TIANHEI_H #include <QObject> class Tianhei : public QObject { Q_OBJECT public: Tianhei(); signals: void tianhei(); //声明信号,不需要实现; public slots: }; #endif // TIANHEI_H
xiangni.h
void xiangni()
void xiangni()声明槽函数,
#ifndef XINGNI_H #define XINGNI_H #include <QObject> class Xingni : public QObject { Q_OBJECT public: explicit Xingni(QObject *parent = nullptr); signals: public slots: void xiangni(); //声明槽函数 }; #endif // XINGNI_H
xiangni.cpp
#include "xingni.h" #include <QDebug> Xingni::Xingni(QObject *parent) : QObject(parent) { } void Xingni::xiangni(){ //实现槽函数 qDebug()<<"想你了"; }
步骤四:穿建天黑对象和想你对象;
mainwindow.h 定义
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "xingni.h" #include "tianhei.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: Xingni *xing; Tianhei *hei; void heilai(); //函数声明 MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); this->hei =new Tianhei(); //实例化对象,注意后面括号 this->xing =new Xingni(); connect(hei,&Tianhei::tianhei,xing,&Xingni::xiangni); //天黑发出天黑信号,xing接收,调用槽函数; heilai(); //调用函数发出信号; } void MainWindow::heilai(){ qDebug()<<"天要黑了!"; emit hei->tianhei(); //发出信号; } MainWindow::~MainWindow() { delete ui; }
6,信号与信号连接;
上面我们实现了天黑想你的操作,那么我现在需要点击一个按钮让其天黑然后想你呢,有两种实现方式:
(1)两个信号与槽:
建立一个按钮,点击按钮时,this会接收信号,然后调用heilai()函数,heilai()函数会发送hei信号,xing接收,调用槽函数;
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QPushButton> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); this->setWindowTitle("love"); //设置固定大小,设置完成不可拉伸 this->setFixedSize(400,300); QPushButton *butten=new QPushButton("点我天黑",this); butten->move(150,100); //定义一个按钮实例子 this->hei =new Tianhei(); //实例化对象,注意后面括号 this->xing =new Xingni(); connect(butten,&QPushButton::clicked,this,&MainWindow::heilai); connect(hei,&Tianhei::tianhei,xing,&Xingni::xiangni); //天黑发出天黑信号,xing接收,调用槽函数; } void MainWindow::heilai(){ qDebug()<<"天要黑了!"; emit hei->tianhei(); } MainWindow::~MainWindow() { delete ui; }
每次点击天黑,都会调用一次heiilai()函数和xiangni()函数;
(2)信号与信号连接;
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QPushButton> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); this->setWindowTitle("love"); //设置固定大小,设置完成不可拉伸 this->setFixedSize(400,300); QPushButton *butten=new QPushButton("点我天黑",this); butten->move(150,100); //定义一个按钮实例子 this->hei =new Tianhei(); //实例化对象,注意后面括号 this->xing =new Xingni(); // connect(butten,&QPushButton::clicked,this,&MainWindow::heilai); connect(butten,&QPushButton::clicked,hei,&Tianhei::tianhei); //信号与信号连接,点击信号触发后触发天黑信号,不需要函数中转 connect(hei,&Tianhei::tianhei,xing,&Xingni::xiangni); //天黑发出天黑信号,xing接收,调用槽函数; } void MainWindow::heilai(){ qDebug()<<"天要黑了!"; emit hei->tianhei(); } MainWindow::~MainWindow() { delete ui; }
信号与信号连接不需要函数中转,以此不会调用heilai()函数;