需要確定的問題:
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綁定,所以,再點擊登錄按鈕,都不會再去相應槽函數了。