• QT基础功能,信号、槽


    创建QT项目名不能有空格和中文,项目路径不能有中文路径!!!

    基本控件介绍

    QT基本控件
    QLabel: 标签,可以显示文本信息,只读;
    QPushButton: 普通按钮;
    QRadioButton: 单选按钮,多个单选按钮中只能选择一个,但是必须放入
    groupbox 中,类似单选题;
    QCheckBox: 多选复选按钮,可以选择同时选择多个,类似多选题;
    QLineEdit: 单行文本编辑框,可以输入单行文本;
    QTextEdit: 多行文本输入框,可以输入显示多行文本和图片;
    QComboBox: 下拉文本输入框,在输入框的最右边有个三角下拉按钮,可以
    选择输入,也可以手动输入;
    QTextBrowser: 多行文本显示框,只读;
    QGroupBox: 可以在里面放入特点的东西,统一管理;
    QSlider: 模拟显示滑动条;
    QSpinBox: 数值显示滑动条;
    QDateEdit: 日期编辑框
    QTimeEdit: 时间编辑框
    QDateTimeEdit: 日期时间编辑框
    QLCDNumber: LCD 数字控件

    在这里插入图片描述
    a5ae2540ca85feaef581fb323bbfa55d.png

    //基本对象的模板创建
    
    //.h文件
    #ifndef BUTTON_H
    #define BUTTON_H
    
    #include    //初始创建是继承的为QWidget类,因没有可选QPushButton作为父类
    #include   //继承的父类头文件添加
    
    //class button : public QWidget
    class button : public QPushButton  //public QWidget->继承的修改:public QPushButton
    {
        Q_OBJECT        //决定了可以用信号槽机制,可以生成moc文件
            
    public:
        explicit button(QWidget *parent = nullptr);   //explicit
                button();
        ~button();
    signals:
    
    };
    
    #endif // BUTTON_H
    
    //.c文件
    #include "button.h"
    #include 
    
    //button::button(QWidget *parent) : QWidget(parent) //:QWidget(parent) ->修改继承类 : QPushButton(parent) 
    button::button(QWidget *parent) : QPushButton(parent) // 传一个parent指针,交给QPushButton(parent)父类去构造
    {
    
    }
    button::~button()
    {
        qDebug()<<"MyButton的析构";
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    对象树

    对象树(子对象动态分配空间不需要释放)
    Qt 提供了一种机制,能够自动、有效的组织和管理继承自QObject 的Qt 对象,这种机制就是对象树。所有从QObject 或其子类(例如Qwidget)派生的类都能够包含信号和槽。
    Qt 对象树在用户界面编程上是非常有用的。它能够帮助程序员减轻内存泄露的压力。比如说当应用程序创建了一个具有父窗口部件的对象时,该对象将被加入父窗口部件的孩子列表。当应用程序销毁父窗口部件时,其下的孩子列表中的对象将被一一删除。这在编程时,能够将主要精力放在系统的业务上,提高编程效率,同时也保证了系统的稳健性。
    在这里插入图片描述

    信号槽

    槽可以有参数,但槽的参数不能有缺省值。
    槽函数分为三种类型,即public slots、private slots 和protected slots。

    • public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。
    • protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。
    • private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。
    • 发射信号时,接收者的槽函数将被调用。
      1)一个信号可以连接到多个槽。
      2)一个槽可以被多个信号连接。
      3)信号也可以连接到信号,此时前者的发射信号将导致后者的发射。
      4)信号的参数类型可以与槽的参数类型对应,信号的参数可以比槽的参数多,但不可以少,否则连接将失败。

    QT4写法:
    connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
    注意到connect()函数的signal 和slot 都是接受字符串,一旦出现连接不成功的情况,Qt4 是没有编译错误的(因为一切都是字符串,编译期是不检查字符串是否匹配),而是在运行时给出错误。这无疑会增加程序的不稳定性。
    在这里插入图片描述

    程序运行时,connect 借助两个字符串,即可将信号与槽的关联建立起来,那么,它是如果
    做到的呢?C++的经验可以告诉我们:

    1. 类中应该保存有信号和槽的字符串信息
    2. 字符串和信号槽函数要关联
      而这,就是通过神奇的元对象系统所实现的(Qt 的元对象系统预处理器叫做moc,对文件预处理之后生成一个moc_xxx.cpp 文件,然后和其他文件一块编译即可)
      (下图来自网络)
      在这里插入图片描述

    基本使用方法

    //头文件加入
     Q_OBJECT        //决定了可以用信号槽机制,可以生成moc文件
         
    //基本使用方式
    QApplication app(argc, argv);
    QPushButton button("Quit");
    QObject::connect(&button, &QPushButton::clicked, &app, &QApplication::quit);
    
    // 基本的程序基础
    #include "widget.h"
    #include 
    int main(int argc, char *argv[])
    {
        //应用程序, a,QT中,有且仅有一个,应用程序对象
        QApplication a(argc, argv);
        Widget w;
        w.show();  //窗口默认是不会弹出的,如果想弹出 ,需要调用show方法
        return a.exec();  //消息循环机制,pause机制,等同于while已经其中判断break;exec:execute
    }
    
    // 信号和槽
    QPushButton * quitBtn = new QPushButton("关闭窗口",this);
         // 信号和槽  connect(sender, signal, receiver, slot); 
         // !注意的是,sender和receiver都是指针对象,最好用new出来的对象!,或者采用&进行对象地址获取
        connect(quitBtn,&QPushButton::clicked,this,&MyWidget::close);
    
    //自定义信号与槽
    private signals:
        void hungury();
    public slots:
        void treat();
    // 信号槽连接
    connect(teacher,&Teacher::hungury,student,&Student::treat);
    //发送信号
        emit teacher->hungury();
    
    /*带参数的信号、槽*/    
    void hungury(QString name);  自定义信号
    void treat(QString name );    自定义槽
    //但是由于有两个重名的自定义信号和自定义的槽,直接连接会报错,
    //所以需要利用函数指针来指向函数地址, 然后再做连接
    void (Teacher:: * teacherSingal)(QString) = &Teacher::hungury;
    void (Student:: * studentSlot)(QString) = &Student::treat;
    connect(teacher,teacherSingal,student,studentSlot);
    // 也可以如此操作:
    QObject::connect(this,  //哪个对象发出
            SIGNAL(ViewImage1(cv::Mat)),  //发出的信号。
            ui.cameraShow,
            SLOT(SetImage(cv::Mat))
        );
    
    //例子1
    connect(ui.tests, SIGNAL(clicked()), this, SLOT(TestSlot()));
    //例子2
    testwidgetRect w;
    QObject::connect(&xt, SIGNAL(Move(int, int)), &w, SLOT(move(int, int)));  //采用取地址的方式
    //Lambda表达式:
    connect(ui->checkBox,&QCheckBox::stateChanged,[=](int state){
           qDebug()<<state; //未选中:0   选中:2   半选中:1 -->用于总选项,总选项里面的选项有一些选中的情况。
        });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
  • 相关阅读:
    设计模式13、模版方法模式 Template Method
    【Spring事务的实现原理】
    内存寻址方式
    MySQL-数据库优化策略概述
    Lesson 2 Breakfast or lunch?
    计算机行业已经进入寒冬?云计算帮你解决就业难题!
    【AWS实验】 使用 Lake Formation 设置数据湖
    [附源码]Python计算机毕业设计Django宁财二手物品交易网站
    Java 最常见的 200+ 面试题:面试必备
    架构的演进
  • 原文地址:https://blog.csdn.net/qq_20467929/article/details/126078805