QT

头像
潘佳琦
    阅读 3 分钟
    1
    老师说有项目需要用到QT,看了Qt教程,对QT进行了简单的了解

    Qt是什么

    Qt是一个跨平台的C++图形用户界面应用程序开发框架。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,比如控制台工具和服务器。

    QT环境

    搭建环境 QT的 Hello World
    #include <QApplication>
    #include <QWidget> //窗口的控件
    #include<QPushButton>
    #include<QLabel>
    
    int main (int argc, char **argv){
        QApplication app(argc, argv);
    
        //窗口
        QWidget W;
        W.setWindowTitle(QString("我是标题"));
    
        QLabel *label = new QLabel(&W);
        label->setText("Hello World");
    
        //按钮
        QPushButton B;
        B.setText("我是按钮");
        B.setParent(&W);
        B.move(100,100);
    
        W.show();
    
        return app.exec();
    }

    界面:

    clipboard.png

    在这里的“ · ”和“ -> "用法是一样的

    图形用户界面

    Qt的图形用户界面的基础是QWidget。QWidget不是一个抽象类别。Qt中所有类型的GUI组件如按钮、标签、工具栏等都派生自QWidget,而QWidget本身则为QObject的子类。Widget负责接收鼠标,键盘和来自窗口系统的其他事件,并描绘了自身显示在屏幕上。每一个GUI组件都是一个widget,widget还可以作为容器,在其内包含其他Widget。

    布局

    布局管理类别用于描述一个应用程序的用户界面中的Widget是如何放置。当视窗缩放时,布局管理器会自动调整widget的大小、位置或是字号,确保他们相对的排列和用户界面整体仍然保有可用性。

    QT有内置的布局管理类型:

    clipboard.png

    学习了布局简单的完成了界面:

    clipboard.png

    信号和槽

    Qt利用信号与槽(signals/slots)机制取代传统的callback来进行对象之间的沟通。当操作事件发生的时候,对象会发提交一个信号(signal);而槽(slot)则是一个函数接受特定信号并且运行槽本身设置的动作。信号与槽之间,则透过QObject的静态方法connect来链接。

    信号在任何运行点上皆可发射,甚至可以在槽里再发射另一个信号,信号与槽的链接不限定为一对一的链接,一个信号可以链接到多个槽或多个信号链接到同一个槽,甚至信号也可连接到信号。

    以往的callback缺乏类型安全,在调用处理函数时,无法确定是传递正确类型的参数。但信号和其接受的槽之间传递的数据类型必须要相匹配,否则编译器会提出警告。信号和槽可接受任何数量、任何类型的参数,所以信号与槽机制是完全类型安全。

    信号与槽机制也确保了低耦合性,发送信号的类别并不知道是哪个槽会接受,也就是说一个信号可以调用所有可用的槽。此机制会确保当在"连接"信号和槽时,槽会接受信号的参数并且正确运行。

    说白了,把信号和槽可以比喻为短信, 一条短信可以发给多个人,一个人也可以接受多条短信

    利用信号和槽实现窗口跳转

    clipboard.png

    实现代码:

    clipboard.png

    QT中Lambda表达式实现信号和槽

    Lambda表达式,不用定义槽函数,不用指定信号接收者;需要在头文件中添加 CONFIG += C++11

    clipboard.png

    clipboard.png

    最终实现代码,效果和上面完全一致

    clipboard.png

    = : 把外部所有局部变量,类中所有成员函数以值传递方式

    总结

    QT可视化编程,不那么抽象,但是QT编译器有点“坑”,反应慢的不行

    潘佳琦
    894 声望34 粉丝

    为 API 生,为框架死,为 debug 奋斗一辈子;