QtCreator

概述

  • qt是一个跨平台的c++图形用户界面应用程序框架,它为应用程序开发者提供建立艺术级图形界面所需的所有功能
  • qt在1991年由奇趣科技公司发布,先后由诺基亚、Digla收购
  • 常见的基于c++的GUI框架
    • QT:跨平台,支持css
    • MFC:仅支持windows平台

下载和安装 QtCreator

  • Qt:基于c++的图形界面开发框架/开发工具包
  • QtCreator:集成化的qt开发编译器/编辑器,qt的桌面环境
  • 相关网址:
    • https://www.qt.io/
    • https://www.qt.io/cn
    • https://download.qt.io/
  • windows
    • 一路next
  • linux
    • 一路next
    • 安装完毕后,创建工程运行工程时,如果报错插件错误无法导入,则需要安装以下两个插件
      • apt-get install libgstreamer0-10-dev
      • apt-get install libgstreamer-pluginx-base0-10-dev
  • 解决中文乱码
    • 工具 - 选项 - 文本编辑器 - 行为 - 文件编码选择utf-8
    • 设置完毕后,新建的项目才有效
  • 新建qt项目工程
    • 新建项目 -> Application -> Qt Widgets Application -> 类信息(基类选择Widget),类名首字母大写
    • 项目名不支持中文
// .pro文件:工程文件,用于生产makfile的配置文件
QT += core gui //包含的模块
greaterThan(QT_MAJDR_VIRSIOW,4): QT += widgets //大于qt4版本才包含此模块
TARGET = demo //应用程序名,生成的.exe文件名
TEHPLATE = app //模板类型
DEFINES += QT_DEPRECATED_WARMIWGS //定义编译选项,过时的工程标记会发出警告
SOURCES += main.cpp\widget.cpp //源文件
headers += widget.h //头文件

//main.cpp入口文件
#include "widget.h"
#include <QApplication>
int main(int argc, char * argv[]){
    QApplication a(argc, argv);//引用程序类,处理应用程序的初始化和结束,事件处理调度,多窗口也只需一个即可
    Widget w;
    w.show();//显示图形界面

    return a.exec()//主事件循环,exec中接收并处理用户和系统的事件,传递给适当的窗口控件
}

//widget.cpp 窗口文件

开始入门

  • 三种窗口模式
    • QWidget
      • 干净的窗口
    • QMainWindow
      • 可以创建菜单条,工具条和状态栏
    • QDialog
      • 弹框
    • 窗口api
      • setWindowTitle()
      • resize()
      • move()
      • show()
      • hide()
      • setFixedSize()
        • 设置固定大小
      • setAutoFillBackground(bool)
        • 设置是否自动填充背景
  • 对象树(对象模型)
    • 概念:Qt对象间的父子关系
    • 每个对象在其析构函数中都会释放所有的子类空间,在一定程度上解决了内存问题,简化内存回收
    • 父对象必须在子对象之前创建,否则会导致子对象空间的二次释放,导致程序崩溃。所以在qt中建议在构造对象的时候就指定父对象,并且在堆区动态创建(使用new)
  • 坐标体系
    • 左上角(0,0)为原点
    • 横向为x
    • 竖向为y
  • 信号和槽机制
    • 所谓信号槽就是观察者模式,当某个事件发生之后,他就会发出一个信号类似广播,如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,将想要处理的信号和自己的一个函数(称为槽slot)绑定来处理这个信号
    • 槽函数:public slots
    • 信号:Signals
    • 多页面之间的通信也需要用到信号槽
    • 宏函数
      • SIGNAL
      • SLOT
    • api
      • connect 连接槽
      • disconnect 断开槽
      • 当对象被delete时会取消这个对象上的槽

常用控件

  • QDebug
    • 调试打印输出
    • qDebug() << "aa";
  • QObject
    • QObject是QT框架的核心,在该对象内可以使用QT框架的信号和槽机制
    • Qt中,以QObject为基础形成了一棵“对象树”,当使用另一个对象作为父对象创建QObject时,该对象将自动将自己添加到父对象的children()列表中
  • QPushButton
    • 按钮
  • QMainWindow
    • 创建包含菜单栏、工具栏、状态栏、链接部件的窗口
  • QMenuBar
    • 菜单栏,一个窗口只能有一个
    • 推荐使用QMainWindow中menuBar成员函数,以单例模式创建菜单栏
  • QMenu
    • 菜单项
  • QAction
    • 子菜单项(菜单下拉选项)、工具栏项
  • QTooBar
    • 工具栏
  • QStatusBar
    • 状态栏,一个窗口只能有一个
    • 推荐使用QMainWindow中statusBar成员函数,以单例模式创建菜单栏
    • 方法
      • showMessage //添加临时信息
      • addWidget //添加永久信息
  • QLabel
    • 标签/文字/超链接文本
    • 也可以在QLabel中写html标签语法
    • api
      • setText
      • setPixmap 显示图片
      • setMovie 设置/显示动画(如:.gif动图)
  • QDockWidget
    • 铆接部件-创建浮动窗口
  • QtTextEdit
    • 文本编辑器,相当于富文本编辑器
  • QLineEdit
    • 单行文本输入框
    • 模式:显示、不显示、密码...
  • QSpinBox
    • 整数步长计数器控件
  • QSlider
    • 滑动条
  • 自定义控件
    • 自定义控件一般是重复性使用的窗口或者窗口中的模块
    • 解决问题:将许多重复性使用的窗口或者窗口中的模块封装成自定义控件,减少创建次数,仅创建一次,使用时提升

加载资源文件

  • qt资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储与可执行文件内部类,静态资源需放在资源文件中以资源文件的形式存储,它会编译到可执行文件内部
  • QPixmap 图片控件
  • 设置窗口背景图片
//widget.cpp中
this->autoFillBackground(true);
QPalette palette;
// palette.setColor(QPalette::Background,QColor(192,253,123));背景色
palette.setBrush(QPalette::Background,QBrush(QPixmap(":/background.png")));
this->setPalette(palette);

UI组件

  • 当使用Qt Creator新建项目时,如果在第五步,选中了创建界面的选项,这样的项目会自带一个.ui界面文件,里面内置了各种ui组件。之后就可以通过拖拽的方式来构建页面

对话框

  • QDialog::exec()
    • 阻塞页面
    • 应用程序级别的模态对话框
  • QDialog::open()
    • 阻塞页面
    • 窗口级别的模态对话框
  • QDialog::show()
    • 不阻塞页面
    • 非模态对话框
QWidget *qui = new QWidget;
qui->setTitle("新窗体测试");
qui->setAttribute(Qt::WA_DeleteOnClose, true);//通过设置窗体属性来进行销毁设置,设置该属性后,窗体如果关闭,窗体申请的内存会立即销毁
qui->show();
  • qt内置对话框
    1. QColorDialog: 选择颜色;
    2. QFileDialog: 选择文件或者目录;
    3. QFontDialog: 选择字体;
    4. QInputDialog: 允许用户输入一个值,并将其值返回;
    5. QMessageBox: 模态对话框,用于显示信息、询问问题等;
    6. QPageSetupDialog: 为打印机提供纸张相关的选项;
    7. QPrintDialog: 打印机配置;
    8. QPrintPreviewDialog:打印预览;
    9. QProgressDialog: 显示操作过程

布局管理器

  • qt提供了两种组件定位机制:
    • 绝对定位
      • 需要提供组件的长高,坐标
      • 不能随着窗口的变化,而变化
    • 布局定位,需要指定使用哪种布局格式
      • 垂直、水平、网状、表格
      • 系统有自带的布局可选
      • 也可以widget中的自主使用布局定位

容器组件

  • QT中有九种容器组件
    • 组合框 QGroupBox
    • 滚动区 QScrollArea
    • 工具箱 QToolBox
    • 选项卡 QTabWidget
    • 栈容器 QWidgetStack
      • 类似于导航菜单切换
    • 框架 QFrame
    • 组件 QWidget
    • 多文档界面 QMdiArea
    • 停靠/漂浮窗口 QDockWidget。

消息机制和事件

  • 事件过程:事件派发 - 事件过滤(QCoreApplication::instance) - 事件分发 - 事件处理/派发(QCoreApplication::notify)
  • 键盘事件
    • keyPressEvent
      • 判断某个键按下
      • 组合键操作
  • 鼠标事件
    • 鼠标单击事件
    • 鼠标释放事件
    • 鼠标双击事件
    • 鼠标移动事件
    • 滚轮事件
    • 鼠标移动事件追踪:
      • 鼠标移动事件 mouseMoveEvent 默认需要点击之后移动才触发事件,设置setMouseTracking(true)之后才可以直接移动就触发事件
  • 定时器
    • QTimerEvent定时器实现
    • QTimer定时器实现
  • 随机数种子
  • 拖拽事件
//键盘事件
void Widget::keyPressEvent(QKeyEvent *event){    
    if(event->key()==Qt::Key_X)   {        
        qDebug()<<"X按下";   
    }
}
//鼠标事件
void Widget::mousePressEvent(QMouseEvent *event){    
    if(event->button()==Qt::LeftButton)   {        
        qDebug()<<"左键按下";   
    }
}
  • 重写事件分发函数
    • 返回值类型 bool,返回true表示表示已经已经对此事件进行了处理,返回false就相当于阻止事件冒泡
    • 对应我们不关心的事件,需要调用父类的event()函数继续转发,否则这个组件就只能处理我们定义的事件了
// - 步骤:
// 1. .h声明event
bool event(QEvent *event);
// 2. .cpp实现event
bool Widget::event(QEvent *event){
    if(event->type() == QEvent::KeyPress){
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        if(keyEvent->key() == Qt::Key_Tab){
            qDebug() << "tab键被按下";
            return true;
        }
    }
    return QWidget::event(event);
    // return false;
}
  • 重写事件过滤器
//1 .h声明
virtual bool QObject::eventFilter(QObject * obj, QEvent * event);
//2 .cpp实现
bool MainWindow::eventFilter(QObject * obj, QEvent * event){
    if(obj === textEdit){//判断是否是要过滤的组件
        if(event->type() == QEvent::KeyPress){
            QKeyEvent * keyEvent = static_cast<QKeyEvent>(event);
            qDebug() << "key press" << keyEvent->key();
            return true
        } else {
            return false;
        }
    } else {
        return QMainWindow::eventFilter(obj, event);
    }
}
//3 安装
// void QObject::installEventFilter(QObject * filterobj);
//移除
// void QObject::removeEventFilter(QObject * filterobj);

画笔和绘图/绘图设备

  • QPainter(画笔) - QPaintEngine(纸张) -> QPaintDevice(设备)
  • QT的绘图系统实际上就是使用QPainter在QPaintDevice上进行绘制,它们之间使用QPaintEngine进行通讯/翻译指令
  • 常见的绘图设备
    • QPixmap 专门为图像在屏幕上的显示做了优化
    • QBitmap 是QPixmap的一个字了,它的色深限定为1
    • QImage 专门为图像的像素级访问做了优化
    • QPicture 则可以记录和重现QPainter的各条命令
void Widget::paintEvent(QPaintEvent * p){
    QPainter painter(this);
    painter.drawLine(80, 100, 500, 500);
    painter.setPen(Qt::red);
}

推荐文章