需要确定的问题:
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绑定,所以,再点击登录按钮,都不会再去相应槽函数了。