zoukankan      html  css  js  c++  java
  • QT学习笔记

    GUI设计基础

    Qt简介

    C++是一种通用的标准编程语言,使用任何编辑器都可以编写C++源程序,然后利用C++编译器对程序进行编译,就可以生成可执行的程序。

    为了方便进行C++程序的编写和编译,有各种综合开发环境(Integrated Developing Environment,IDE),如Visual Studio就是Windows平台上常见的编写C++程序的IDE。一个IDE不仅提供程序的编辑和编译,一般还提供一套基本类库,用于提供支持平台应用程序开发的各种基本类,如Visual Studio使用MFC进行Windows平台的应用程序开发。

    Qt是一套应用程序开发类库,但与MFC不同,Qt是跨平台的开发类库。Qt支持PC和服务器的平台,包,括Windows、Linux、 macOS等,还支持移动和嵌入式操作系统,如iOS、 Embedded Linux、Android、WinRT等。跨平台意味着只需编写一次程序,在不同平台,上无需改动或只需少许改动后再编译,就可以形成在不同平台上运行的版本。这种跨平台功能为开发者提供了极大的便利。

    Qt最早是由挪威的Haavard Nord和Eirik Chambe-Eng在1991年开始开发的,在1994年发布, 并成立了一家名为Trolltech的公司。Trolltech公司在2008年被诺基亚公司收购。2012年,Qt被Digia公司收购,并在2014年成立了独立的Qt公司,专门 ]进行Qt的开发、维护和商业推广。

    经过20多年的发展,Qt已经成为最优秀的跨平台开发框架之一,在各行各业的项目开发中得到广泛应用。许多大型软件都是用Qt开发的,如Autodesk Maya、Google Earth、Skype、 WPS Office等。

    QtCreater

    Qt是C++类库,而qtcreater是一款IDE。包括:

    • Assistant是一个独立的查看Qt帮助文件的程序,集成在了Qt Creator中。
    • Designer是- 个独立的进行窗口、对话框等界面可视化设计的程序。Designer也集成在了Qt Creator中,在Qt Creator中编辑或创建界面文件时,就可以自动打开并进行界面设计。
    • Linguist是一 一个编辑语言资源文件的程序,在开发多语言界面的应用程序时会用到。

    可创建的应用

    • Qt Widgets Application,支持桌面平台的有图形用户界面(Graphic User Interface, GUI) 界面的应用程序。GUI的设计完全基于C++语言,采用Qt提供的一套C++类库。
    • Qt Console Application,控制台应用程序,无GUI界面,- -般用于学习C/C++语言,只需要简单的输入输出操作时可创建此类项目。
    • Qt Quick Application,创建可部署的Qt Quick 2应用程序。Qt Quick是Qt支持的一套GUI开发架构,其界面设计采用QML语言,程序架构采用C++语言。利用Qt Quick可以设计非常炫的用户界面,- -般用于移动设备或嵌入式设备上无边框的应用程序的设计。
    • Qt Quick Controls 2 Application,创建基于Qt Quick Controls 2组件的可部署的Qt Quick 2应用程序。
    • Qt Quick Controls 2组件只有Qt 5.7及以后版本才有。
    • Qt Canvas 3D Application,创建Qt Canvas 3D QML项目,也是基于QML语言的界面设计,支持3D画布。

    类库

    • QMainWindow是主窗口类,主窗口具有主菜单栏、工具栏和状态栏,类似于- -般的应用程序的主窗口;
    • QWidget是所有具有可视界面类的基类,选择QWidget创建的界面对各种界面组件都可以支持;
    • QDialog是对话框类,可建立一个基于对话框的界面。

    编译选项

    每个编译器又有Build和Run两个设置界面。在Build设置界面上,有一个“Shadow build"复选框。如果勾选此项,编译后将在项目的同级目录下建立一个编译后的文件目录,目录名称包含编译器信息,这种方式一般用于使用不同编译器创建不同版本的可执行文件。如果不勾选此项,编译后将在项目的目录下建立“Debug"和“Release"子目录用于存放编译后的文件。

    VS-QT

    要在Qt Creator里调试MSVC2015编译的程序,必须安装Windows软件开发工具包SDK。
    要在VS中使用QT,也需要安装插件,并进行一些设置。

    项目管理文件.pro

    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    CONFIG += c++11
    
    ## The following define makes your compiler emit warnings if you use
    ## any Qt feature that has been marked deprecated (the exact warnings
    ## depend on your compiler). Please consult the documentation of the
    ## deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    ## You can also make your code fail to compile if it uses deprecated APIs.
    ## In order to do so, uncomment the following line.
    ## You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    ## disables all the APIs deprecated before Qt 6.0.0
    
    SOURCES += 
        logindlg.cpp 
        main.cpp 
        mainwindow.cpp
    
    HEADERS += 
        logindlg.h 
        mainwindow.h
    
    FORMS += 
        logindlg.ui 
        mainwindow.ui
    
    ## Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    

    项目管理文件用于记录项目的一些设置,以及项目包含文件的组织管理。
    “Qt += core gui"表示项目中加入core gui模块。core gui是Qt用于GUI设计的类库模块,如果创建的是控制台(Console) 应用程序,就不需要添加core gui。
    Qt类库以模块的形式组织各种功能的类,根据项目涉及的功能需求,在项目中添加适当的类库模块支持。例如,如果项目中使用到了涉及数据库操作的类就需要用到sq|模块,在pro文件中需 要增加如下一-行:

    QT       += sql
    

    samp2_1.pro中的第2行是:

    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    

    这是个条件执行语句,表示当Qt主版本大于4时,才加入widgets模块。
    “TARGET = samp2_ 1"表示生成的目标可执行文件的名称,即编译后生成的可执行文件是samp2_1.exe。
    “TEMPL ATE = app"表示项目使用的模板是app,是一-般的应用程序。
    后面的SOURCES、HEADERS、FORMS 记录了项目中包含的源程序文件、头文件和窗体文件(.ui文牛)的名称。这些文件列表是Qt Creator自动添加到项目管理文件里面的,用户不需要手动修改。当添加一个文件到项目,或从项目里删除一个文件时,项目管理文件里的条目会自动修改。

    主程序

    #include "widget.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
    
        return a.exec();
    }
    

    main(函数是应用程序的入口。它的主要功能是创建应用程序,创建窗口,显示窗口,并运行应用程序,开始应用程序的消息循环和事件处理。
    QApplication是Qt的标准应用程序类,第1行代码定义了-个QApplication类的实例a,就是应用程序对象。
    然后定义了-个Widget类的变量w,Widget是本实例设计的窗口的类名,定义此窗口后再用w.show0显示此窗口。
    最后一行用a.exec0启动应用程序的执行,开始应用程序的消息循环和事件处理。

    窗体文件

    组件属性

    对象名 类名称 属性设置 备注
    txtEdit QPlainTextEdit Text="Hello, World It is my demo."Font.PointSize=20 用于显示文字内容,可编辑
    chkBoxUnder QCheckBox Text="Underline" 设置字体为下划线
    chkBoxltalic QCheckBox Text="Italic" 设置字体为斜体
    chkBoxBold QCheckBox Text= "Bold" 设置字体为粗体
    rBtnBlack QRadioButton Text="Black" 字体颜色为黑色
    rBtnRed QRadioButton Text="Red" 字体颜色为红色
    rBtnBlue QRadioButton Text="Blue" 字体颜色为蓝色
    btnOK QPushButton Text="确 定" 返回确定,并关闭窗口
    btnCancel QPushButton Text="取 消" 返回取消,并关闭窗口
    btnClose QPushButton Text="退 出" 退出程序
    QWDialog QWDialog windowTitle="Dialog by Designer" 界面窗口的类名称是QWDialog, objectName不要修改

    布局管理

    信号和槽

    信号与槽(Signal & Slot)在面向对象的编程方法中,都会创建很多的实例,每个实例都是单独的,要想每个实例能够协同合作,那么就会需要一种对象间传递消息的机制,在很多框架中都采用回调函数来进行对象间信息传递。

    回调是一个指向函数的指针,如果想要一个处理函数通知一些事件,你需要将这个指针传递给处理函数。处理函数在适当时间调用回调函数。MFC就是使用的回调函数,但回调可能是不直观的,不易于理解的,并且也不能保证是类型安全的。

    Qt为了消除回调函数等的弊端,从而Qt开发了一种新的消息传递机制,即信号和槽。

    例如,当我们要求鼠标点击某个按钮时,对应的窗口就需要关闭,那么这个按钮就会发出一个关闭信号,而窗口接收到这个信号后执行关闭窗口。那么,这个信号就是按钮被点击,而槽就是窗口执行关闭函数。

    原型1

    Qt4和Qt5都可以使用这种连接方式

    static QMetaObject::Connection connect(
        const QObject *sender, //信号发送对象指针
        const char *signal,    //信号函数字符串,使用SIGNAL()
        const QObject *receiver, //槽函数对象指针
        const char *member, //槽函数字符串,使用SLOT()
        Qt::ConnectionType = Qt::AutoConnection//连接类型,一般默认即可
    );
    
    //例如
    connect(pushButton, SIGNAL(clicked()), dialog,  SLOT(close()));
    

    原型2

    Qt5新增这种连接方式,这使得在编译期间就可以进行拼写检查,参数检查,类型检查,并且支持相容参数的兼容性转换。

    static QMetaObject::Connection connect(
        const QObject *sender, //信号发送对象指针
        const QMetaMethod &signal,//信号函数地址
        const QObject *receiver, //槽函数对象指针
        const QMetaMethod &method,//槽函数地址
        Qt::ConnectionType type = Qt::AutoConnection//连接类型,一般默认即可
    );
    
    //例如
    connect(pushButton, QPushButton::clicked, dialog,  QDialog::close);
    

    QSignalMapper

    当我们想要点击一个按钮,并且想将预先定好的参数一同发送出去时,由于按钮的点击事件clicked()并没有参数,那么按照一般的做法就会先定义一个槽与clicked()信号关联,然后获取参数,再通过自定义的信号将该参数发送出去。

    这个过程无疑是繁琐的,为此,Qt提供了QSignalMapper这个类来解决这个问题。同时,这个类可以连接多个按钮,匹配发送信号的对象对应的整数、字符串,窗口指针,继承于QObject的对象参数重新发送它们。

    获取信号发送者

    当多个信号连接一个槽时,有时需要判断是哪个对象发来的,那么可以调用sender()函数获取对象指针,返回为QObject指针。

    QObject* sender() ;
    

    解绑定信号槽

    当我们不需要信号槽连接时,可使用disconnect()进行解绑定。其写法和connect一样,只需要将connect换成disconnect即可。

    QT类库概述

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。本章将介绍Qt的这些核心特点,对于理解和编写高效的Qt C++程序是大有帮助的。

    本章还介绍头文件中Qt的一些全局定义,包括数据类型、函数和宏等,介绍Qt的容器类及其相应迭代器的使用方法。这些全局定义和容器类在程序中经常用到,了 解其原理便于理解后面遇到的一些实例程序。

    Qt类库中大量的类是以模块形式分类组织的,包括基本模块和扩展模块等,本章对这些模块做个总体的介绍。一个模块通常就是一个编程主题,如数据库、图表、网络等,本书后面的章节一般是每章介绍一个编程主题。

    HelloWorld

    main.cpp

    #include <QApplication>
    #include "myfirstwidget.h"
    
    int main(int argc, char *argv[])
    {
       QApplication a(argc, argv);
    
       MyFirstWidget w;
       w.show();
    
        return a.exec();
     }
    

    QApplication:
    如果所创建的是一个窗口应用程序,那么必须要有且只有一个这样的实例,在创建QApplication实例后,会自动将指针赋值给Qt的全局变量qApp,如果想在其它地方使用QApplication实例,则可以直接调用qApp。

    因为QApplication实例会进行大量的初始化工作,所以要在使用任何对象之前就创建QApplication实例,因此,main函数开头便创建了QApplication实例。

    如果创建的是一个非窗口的应用程序,那么可以调用QCoreApplication来创建实例。

    QApplication主要做以下事情(只需了解即可):
    1:使用用户的桌面设置,初始化应用程序,例如窗口的调色板,字体等。
    2:执行事件处理。
    3:也可根据命令行参数,设置自己的内部状态。
    4:制定窗口样式,颜色调配,文字国际化。
    5:设置剪切板,管理鼠标事件。

    a.exec():
    进入Qt的主循环事件。当调用exit()函数时,才会退出循环,退出main函数。当程序在准备退出主循环时,会发出aboutToQuit()信号,如果有某些在退出程序前要处理的事情,可链接此信号进行处理。除了主循环外,Qt还有本地循环,可以理解为子循环

    myfirstwidget.h

    #ifndef MYFIRSTWIDGET_H
    #define MYFIRSTWIDGET_H
    #include <QWidget>
    
    namespace Ui { class MyFirstWidget; }
    
    class MyFirstWidget : public QWidget
    {
        Q_OBJECT
     public:
         explicit MyFirstWidget(QWidget *parent = 0);
         ~MyFirstWidget();
     private:
         Ui::MyFirstWidget *ui;
     };
    #endif // MYFIRSTWIDGET_H
    

    Q_OBJECT:
    Q_OBJECT宏,必须在类的私有声明中声明这个宏,这样就可以使用Qt的信号槽机制,元对象系统,对象树等Qt特有的功能,否则无法使用。所以这里推荐在创建类时,最好加上此声明,这样的代码会得到很多Qt提供的便利接口。

  • 相关阅读:
    [PHP] 小数转科学计数法, 小数保留 n 位
    [Blockchain] Cosmos Starport 101
    [Blockchain] Cosmos Starport 地址前缀的变更方式
    [Blockchain] Cosmos Starport 安装的三种方式
    [ML] 机器学习的 7 步走
    [FAQ] MEMORY ALLOC FAILED: mmap with HUGETLB failed, attempting without it (you should fix your kernel)
    [FAQ] FastAdmin epay 微信公众号支付 JSAPI 支付必须传 openid ?
    [TP5] 动态绑定指定默认模块, 解决: 控制器不存在:appindexcontrollerApi
    [TP5] ThinkPHP 默认模块和单模块的设置方式
    [TP5] 浅谈 ThinkPHP 的 Hook 行为事件及监听执行
  • 原文地址:https://www.cnblogs.com/chendeqiang/p/12861668.html
Copyright © 2011-2022 走看看