信號與槽機制


需要確定的問題:

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