• 信号与槽机制


    需要确定的问题:

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

    内在的趣味,表面的繁琐
  • 相关阅读:
    Visual C++2005的IntelliSense问题
    R调用数据库的方式汇总
    Loading local data is disabled; this must be enabled on both the client and server sides 
    R的transform函数
    R连接mysql数据库(ODBC)
    mysql实例代码
    随笔20130105
    开端
    MeteoInfo
    火车软硬卧铺分布图
  • 原文地址:https://www.cnblogs.com/data1213/p/10799282.html
Copyright © 2020-2023  润新知