信号与槽机制


需要确定的问题:

1、哪个窗口的哪个控件被操作——在哪个.cpp文件中定义槽函数

2、控件的操作类型(鼠标单击、鼠标滑过、双击鼠标...)——信号

3、控件被操作之后,需要执行哪个类的哪个函数 ——槽函数

例如:点击MainWindow窗体中的登录按钮,然后使得"QQ登录"标签改变内容。

1、找到指定的控件名称

2、connect调用

在哪里调用?——这里控件是在Mainwindow对象中,那就在Mainwindow.cpp中去写

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3 
 4 MainWindow::MainWindow(QWidget *parent) :
 5     QMainWindow(parent),
 6     ui(new Ui::MainWindow)
 7 {
 8     ui->setupUi(this);
 9     //哪个控件、什么操作、哪个对象接收、槽函数
10     connect(this->ui->pushButton,SIGNAL(clicked()),this,SLOT(login()));
11     /*
12      * MainWindow对象中的pushButton,在mainwindow.ui中设计的
13      * 信号:点击事件
14      * 接收的对象:这里定义的就是MainWindow本身
15      * 槽函数:login()
16      *
17      * 为什么这里的connect方法在发出信号的类构造函数中调用,因为在MainWindow对象构建出来之后,
18      * 能够建立起发生信号的类对象和接收信号的类对象的关系。
19      */
20 }
21 
22 MainWindow::~MainWindow()
23 {
24     delete ui;
25 }
26 
27 //定义槽函数
28 /*
29  * 声明槽函数,需要 private slots,凡是在其范围内声明的函数都被视为槽函数
30  */
31 void MainWindow::login(){
32     //定义操作逻辑
33 }

3、在Mainwindow.h中声明槽函数,定义函数操作逻辑

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 
 6 namespace Ui {
 7 class MainWindow;
 8 }
 9 
10 class MainWindow : public QMainWindow
11 {
12     Q_OBJECT
13 
14 public:
15     explicit MainWindow(QWidget *parent = nullptr);
16     ~MainWindow();
17 
18 //声明槽函数
19 private slots:
20     void login();
21 
22 private:
23     Ui::MainWindow *ui;  //ui指向的空间就是MainWindow对象,其中定义的控件在mainwindow.ui中设计
24 };
25 
26 #endif // MAINWINDOW_H

 

连接信号与槽的另外一种方式:

通过UI控件,右键转到槽函数的方式,QT会自动生成相应的槽函数,只需要自己定义逻辑就好,但是不需要生成相应的connect方法来绑定,虽然都能实现信号与槽的绑定,但是这种方式的缺点就是不易阅读。 

 

disconnect方法:

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3 #include <QDebug>
 4 #include <QString>
 5 
 6 MainWindow::MainWindow(QWidget *parent) :
 7     QMainWindow(parent),
 8     ui(new Ui::MainWindow)
 9 {
10     ui->setupUi(this);
11     //哪个控件、什么操作、哪个对象接收、槽函数
12     connect(this->ui->pushButton,SIGNAL(clicked()),this,SLOT(login()));
13     connect(this->ui->pbt_cancel,SIGNAL(clicked()),this,SLOT(Close()));
14 }
15 
16 MainWindow::~MainWindow()
17 {
18     delete ui;
19 }
20 
21 void MainWindow::login(){
22     //定义操作逻辑
23     static int count = 0;
24     QString name = this->ui->login_id->text();
25     QString passward = this->ui->pwd->text();
26     if(name == "jack" && passward == "123456"){
27         qDebug()<<"登录成功";
28     }else {
29         qDebug()<<"登录失败";
30         count ++;
31         if (count == 3){
32             /*
33              * 失败登录三次之后,断开connect关系
34              * 设计目的:避免暴力破解
35              */
36             disconnect(this->ui->pushButton,SIGNAL(clicked()),this,SLOT(login()));
37         }
38     }
39 }
40 
41 void MainWindow::Close(){
42     this->close();
43 }

当出现三次登录点击失败之后,将断开connect绑定,所以,再点击登录按钮,都不会再去相应槽函数了。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM