Qt入门笔记

Qt入门笔记

推荐资源:

Qt教程,Qt5编程入门教程(非常详细) (biancheng.net)

QT学习教程(全面)

QT从入门到实战完整版|传智教育

文章目录

  • Qt入门笔记
    • 第一章 安装和配置
      • 一、Qt安装
        • 1、Qt简介
        • 2、下载
        • 3、安装
      • 二、VS2019环境配置
        • 1、为什么用VS写Qt程序
        • 2、打开VS安装Qt插件
        • 3、安装VSIX(即上面下载的那个插件)
        • 4、设置插件
        • 5、VS创建Qt项目
    • 第二章 Qt入门
      • 一、创建项目
        • 1、启动Qt
        • 2、新建/打开项目
        • 3、创建完成
        • 4、运行
      • 二、Qt第一个项目分析
        • 1、main.cpp
        • 2、widget.h和widget.cpp
        • 3、项目管理文件qt_learn.pro
      • 三、Qt基本框架
        • 1、创建空项目
        • 2、编写pro文件
        • 3、添加并编写main.cpp
        • 4、添加按钮
    • 第三章 Qt
      • QWidget
        • QT注意事项
        • 按钮
        • QT中的对象树
        • QT的窗口坐标系
        • QT信号和槽
        • Lambda表达式
      • MainWindow
        • 菜单栏 QMenuBar
        • 工具栏 QToolBar
        • 状态栏 QStatusBar
        • 铆接部件 QDockWidget
        • 中心部件
        • 资源文件
        • 小总结
        • 对话框
        • 列表控件 listWidget
        • ui窗口自布局
        • 自定义组件
        • QT事件 QEvent
        • 绘图 QPainter
        • 绘图设备
        • 文件读写 QFile
        • 文件信息 QFileInfo
        • Qss
        • 动画 QPropertyAnimation
        • 背景音乐 QSound
        • 打包发布
      • 案例:翻金币

第一章 安装和配置

一、Qt安装

1、Qt简介

Qt 是一个跨平台的 C++ 开库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序。
Qt 是纯 C++ 开发的。

Qt入门笔记_第1张图片

2、下载

这里咱们安装 Qt 5.14.2 (不要问为什么不装更新版本的,从 Qt 5.15.0 起,对于开源用户,Qt官方不再提供独立安装文件,所以源码安装太麻烦,以后再研究_)

官网下载链接:

Index of /archive/qt/5.14/5.14.2

Qt入门笔记_第2张图片

3、安装

下载完之后,直接双击打开安装包,进行安装即可

Qt入门笔记_第3张图片

如果有Qt账号,直接登录就可以了,如果没有可以在下面注册一个,然后点Next(如果不想填写,请先断网,然后重新打开安装程序)(5.14之前的版本断网安装可以,5.15之后必须在线安装了)

img

现在你可以选择安装路径,建议大家自行修改一下(注意:路径中不能有空格,也不能有中文),确保自己能找到位置,后续可能会有一些配置,需要找到路径

Qt入门笔记_第4张图片

路径设置完之后,到了选择组件的界面,如图:第二个组件不需要管,点开第一个组件Qt 5.14.2。

img

点开之后,把这些都选上,OK,下一步~(如果没有用VS开发Qt项目的需求可以不点 MSVC 2017)

我只选择了MSVC 2017 64-bitMinGW 7.3.0 64-bit

Qt入门笔记_第5张图片

进行安装

Qt入门笔记_第6张图片**


二、VS2019环境配置

1、为什么用VS写Qt程序

很多人在Qt上写代码时,感觉不是很舒服,所以想在Vs上写Qt程序,而且Vs具有强大的调试能力,所以咱们可以通过一些配置实现此目的。

Qt入门笔记_第7张图片

2、打开VS安装Qt插件

选择菜单栏的 扩展->管理扩展,输入Qt搜索,然后下载Qt Visual Studio Tools

Qt入门笔记_第8张图片

如果VS里面下载太慢,可以先到Qt官网下载对于版本的插件:https://download.qt.io/official_releases/vsaddin/2.4.1/

Qt入门笔记_第9张图片

如果跳到如下页面,选择清华大学镜像源下载即可。

Qt入门笔记_第10张图片

3、安装VSIX(即上面下载的那个插件)

如果是通过Vs下载的,会自动安装。

如果是手动下载的,需要双击自己安装。

打开安装包之后,点击Install等待安装完成即可

Qt入门笔记_第11张图片

安装之前,请先关掉Vs(关闭Vs之后,一秒安装完成)

Qt入门笔记_第12张图片

4、设置插件

再次打开VS,扩展->Qt VS Tools

新版的qt vsaddin插件,不再是用Qt Options设置Qt路径,而是Qt Version,如下图:

Qt入门笔记_第13张图片

点击之后

Qt入门笔记_第14张图片

注意qt路径,一直选择到qmake.exe


旧版教程

再次打开VS,扩展->Qt VS Tools->Qt Options

Qt入门笔记_第15张图片

点击Qt Options之后会弹出如下界面

Qt入门笔记_第16张图片

如果在弹出上述界面的同时,还弹出如下这个错误界面,不要担心,这是由于安装插件的时候,会自动配置,但是自动配置的路径和实际的Qt安装路径不一致,我们自己再配置一下就ok了

Qt入门笔记_第17张图片

首先删掉自动配置好的路径,然后点击Add自己添加一个,如下是具体的路径选项,选择msvc2017_64文件夹,点击确定即可

Qt入门笔记_第18张图片

然后点击OK(Name是自己取的)

Qt入门笔记_第19张图片

5、VS创建Qt项目

在Vs中点击新建项目,搜索Qt找到 Qt GUI Application 然后点击下一步。

Qt入门笔记_第20张图片

然后从Debug和Release模式里选择一个即可(默认即可)

Qt入门笔记_第21张图片

点击Next,选择模块(以默认选好)继续Next,然后选择GUI的基类为QWidget,选择小写字体

Qt入门笔记_第22张图片

点击Finish完成创建!最后,Ctrl+F5(运行),大功告成

Qt入门笔记_第23张图片

新版步骤

选择Qt版本与编译方式,选择debug即可,创建后,如果想用release发布,就在vs中换成release.

Qt入门笔记_第24张图片

项目解决方案如下:

Qt入门笔记_第25张图片

打开ui文件就可以拖拽控件了,如果你想手写ui也可以,新建Qt类即可,其它的编译调试和C++项目一样。

第二章 Qt入门

一、创建项目

1、启动Qt

安装好之后,可能桌面没有快捷方式,那么我们可以去开始菜单栏找到快捷方式。

Qt入门笔记_第26张图片

打开之后,界面如下所示

Qt入门笔记_第27张图片

2、新建/打开项目

点击左上角的,文件->新建文件或项目

Qt入门笔记_第28张图片

点击之后,进入了项目模板选择界面,选择Application->Qt Widgets Application点击Choose即可

Qt入门笔记_第29张图片

选择项目位置。默认是下面这样,请自行修改(重要提醒:名称和路径中都不允许存在空格和中文,注意桌面文档也是中文)

如果含有中文,编译时会出现如下错误:

Qt入门笔记_第30张图片

Qt入门笔记_第31张图片

一直点击下一步,之后来到这个界面,选择类信息。父类默认是QMainWindow,可以修改为QWidget(主要用来测试改不改都可以)

Qt入门笔记_第32张图片

一直点击下一步,直到到达如下界面。构建套件选择。选择MinGW任意一个版本即可,然后点击下一步,点击完成即可

Qt入门笔记_第33张图片

Qt入门笔记_第34张图片

3、创建完成

完成之后是这个界面

Qt入门笔记_第35张图片

4、运行

点击运行按钮,等待源码编译并执行。当你的桌面出现这个窗口是说明,你的Qt环境已经没问题了,而且也会创建一个Qt项目了

Qt入门笔记_第36张图片

二、Qt第一个项目分析

Qt入门笔记_第37张图片

1、main.cpp

打开sources里面的main.cpp,可以看到以下代码

Qt入门笔记_第38张图片

注意:

  • 每个Qt程序有且只能有一个QApplication对象,没有会报错,如下:

    图片

  • Qt里面的头文件和类名是一致的,知道头文件就知道类名,反之亦然

  • Qt头文件不同于C语言,是没有.h后缀的,基本都是以大写的Q开头

  • 根据以上的分析,可以得出Qt的程序框架代码:

#include       
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);  
     /*
       在这里写你的代码
     */     
    return a.exec();      
}

2、widget.h和widget.cpp

打开sources里面的widget.h,可以看到以下代码

Qt入门笔记_第39张图片

打开sources里面的widget.cpp,可以看到以下代码

Qt入门笔记_第40张图片

代码基本上都是在这两个文件中编写

3、项目管理文件qt_learn.pro

qt_learn.pro是管理项目的文件,用来存储项目设置。

Qt入门笔记_第41张图片

  • QT += core gui 表示项目中加入 core gui 模块。core gui 是 Qt 用于 GUI 设计的类库模块,如果创建的是控制台(Console)应用程序,就不需要添加 core gui

  • greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 这是条件执行语句,表示当 Qt 主版本大于 4 时,才加入 widgets 模块(Qt4没有这个模块)

  • DEFINES += QT_DEPRECATED_WARNINGS 使用被标记为弃用的Qt特性,会产生警告

    # qt_learn项目拥有的源文件、头文件、窗体
    SOURCES += \
        main.cpp \
        mainwindow.cpp
    
    HEADERS += \
        mainwindow.h
    
    FORMS += \
        mainwindow.ui
    
  • 以上文件列表是 Qt Creator 自动添加到项目管理文件里面的,用户无需手动修改。当添加一个文件到项目,或从项目里删除一个文件时,项目管理文件里的条目会自动修改

三、Qt基本框架

1、创建空项目

进入项目选择界面->其他项目->空项目->choose

Qt入门笔记_第42张图片

填写项目名和选择路径

——注意:不能有空格和中文

Qt入门笔记_第43张图片

选择编译套件

注意:一定要选择MinGW。不选的话,项目创建之后会有问题

Qt入门笔记_第44张图片

后面一步,直接点击完成即可进入编码界面

但是如果你看到的是这个界面(不是这个可以继续往下看),项目名称前面有的黄色的感叹号,说明项目没有配置成功——这是刚刚在选择编译套件时,选择错了

Qt入门笔记_第45张图片

解决方法:

——点击左侧项目->重新选择编译套件->点击配置项目,ok~

Qt入门笔记_第46张图片

当界面显示如下时,即表示配置成功了

Qt入门笔记_第47张图片

2、编写pro文件

打开.pro文件,添加如下配置

#加载三个核心模块
QT += core gui widgets
#添加对C++11的支持
CONFIG += c++11

3、添加并编写main.cpp

右击项目名称->选择Add New…->选择C++模板->添加C++源文件

Qt入门笔记_第48张图片

Qt入门笔记_第49张图片

给文件取个名字

——点击下一步,然后点击完成

Qt入门笔记_第50张图片

看到main.cpp之后就开始写代码吧

Qt入门笔记_第51张图片

ps:pro文件会自动添加创建好的头文件和源文件

Qt入门笔记_第52张图片

先写main函数框架

Qt入门笔记_第53张图片

然后再Code下面添加自己写的代码:

——首先添加QWidget 和 Qicon头文件,然后用QWidget类创建一个窗口对象,并对窗口的一些属性进行设置

Qt入门笔记_第54张图片

Qt入门笔记_第55张图片

烦人的警告:libpng warning: iCCP: known incorrect sRGB profile

[产生的原因]:

使用Photoshop CS5编辑过的PNG文件,颜色设置采用了默认的sRGB IEC61966-2.1

就是这个sRGB IEC61966-2.1格式不标准,新的Qt库会提示警告。

[解决的方法]:

修改Photoshop CS5颜色设置,具体为编辑->颜色设置,工作空间RGB改为“ColorMatch RGB”,色彩方案RGB改为“转换为工作中的RGB”。

重新打开有问题的文件,保存一遍即可。

4、添加按钮

QPushButton是Qt中最基本的按钮类,使用方法也很简单

首先,包含QPushButton头文件

然后,在窗口show之前,创建按钮,并调用show

图片

运行之后发现,按钮和widget分为了两个窗口,这不是我们想要的,我们需要把按钮嵌入到widget窗口上

Qt入门笔记_第56张图片

要解决这个问题,需要把widget设为按钮的父亲窗口

给按钮设置父窗口

设置父窗口有两种方式:

1,通过构造函数设置,先看一下QPushButton的构造函数

图片

2,通过成员函数setParent设置

图片

值得注意的是,如果指定了父窗口,那么就可以不用手动调用show方法了,会跟着父窗口一起显示,一起销毁

代码:

Qt入门笔记_第57张图片

Qt入门笔记_第58张图片

Qt Creater快捷键:Qt Creator 快捷键 (qq.com)

第三章 Qt

Qt入门笔记_第59张图片

QWidget

QT注意事项

  • 命名规范
    • 类名 首字母大写,单词和单词之间首字母大写
    • 函数名 变量名称 首字母小写,单词和单词之间首字母大写
  • 快捷键
    • 注释 ctrl + /
    • 运行 ctrl + r
    • 编译 ctrl + b
    • 查找 ctrl + f
    • 帮助文档 F1
    • 自动对齐 ctrl + i
    • 同名的.h和.cpp切换 F4

按钮

  • 按钮常用API
  1. show() 以顶层方式弹出窗口控件
  2. setParent() 选择依赖方式,参数是指针或引用,如setParent(this)
  3. setText() 设置文本
  4. resize() 重置窗口大小
  5. move() 移动
  6. setWindowTitle() 设置窗口大小
  7. setFixedSize() 设置固定窗口大小

QT中的对象树

  1. 当创建的对象在堆区的时候(new出来的),如果指定的父对象是 基类QObject 派生下来的类或者子类,该对象就会被放到对象树上,对象树上的对象无需由程序员负责释放。
  2. 派生下来的类,可以不需要管理释放操作,会将对象放入对象树。当关闭窗口时,自动按照创建的逆序执行析构函数,一定程度上简化了内存回收机制。
  3. 建议在创建对象时,显式指定其父对象,避免产生问题。
  4. 创建类时,可以让类继承基类QObject,这样就不用自己手动delete释放了

Qt入门笔记_第60张图片

QT的窗口坐标系

父窗口的左上角为0,0点,X向右增加,Y向下增加

Qt入门笔记_第61张图片

QT信号和槽

当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。

信号和槽有点类似Java中的接口,信号是接口,槽是接口的实现类。

  • 连接函数

    //connect(信号的发送者,信号的具体信息,信号的接受者,信号的处理[槽])
    connect(sender, signal, receiver, slot);
    

    参数解释:

    • sender:发出信号的对象

    • signal:发送对象发出的信号(函数地址)

    • receiver:接收信号的对象

    • slot:接收对象在接收到信号之后所需要调用的函数(槽函数)(函数地址)

  • 信号槽的优点:松散耦合

    • 信号发送端接收端本身是没有关联的,通过connect()连接函数连接,将两者耦合在一起
    • 信号关键字:Signals
      • chlicked(bool) 点击
      • pressed() 按下
      • released() 释放
      • toggled(bool) 切换状态
    • 槽的关键字:Slots
  • 自定义信号和槽位函数

    • 自定义信号

      • 写在类的signals:下,返回值为void,可以有参数,支持重载,不需要实现

        signals:
               void hungury();
        
    • 自定义槽函数

      • 不能写在signals:下,要写在public slots:下 【5.4版本以后写成全局函数或者写在public:下都行.】
      • 返回值也是void,需要声明,需要实现,可以有参数,支持重载
    • 然后用connect连接信号和槽

    • 触发信号 emit

    • 信号和槽重载,需要函数指针,明确指向函数的地址

    • QString 转char * 使用.toUtf8().data()

    • 信号和槽连接:触发这个信号才能触发槽

      • 一个信号可以连接多个槽
      • 多个信号也可以连接同一个槽函数
      • 信号和槽的参数和类型必须对应
      • 信号的参数个数可以多于槽的参数个数
    • 信号和信号连接 触发一个信号也能触发另外一个信号

    • 断开信号 disconnect(参数一样)

Lambda表达式

  • C++11版本特性 [CONFIG += c++11] 匿名函数对象

    • Lambda表达式函数声明

      • [=] 允许使用局部变量
      • [&] 允许使用引用传递变量
      • [变量] 允许变量使用值传递
      • mutable 可修改值传递进来的参数[虽然还是局部变量]
        • mmutable{m+=100;打印}; 不加mutable会报错
      • ->类型 带返回值
        • int ret = ->int{return 1000}();
    • Lambda表达式函数调用 {}()

    • 最常见的[=](){}

MainWindow

菜单栏 QMenuBar

* 菜单栏最多只能有一个
    + QMenuBar * bar = menuBar(); setMenuBar(bar);
    + 创建菜单
        * QMenu * fileMenu = bar->addMenu("文件");
            + 创建菜单栏目
                * QAction * newAction =  fileMenu->addAction("新建");
            + 添加分隔符 
                * fileMenu->addSeparator();

工具栏 QToolBar

* 工具栏可以有多个
    + QToolBar * toolBar = new QToolBar(this);  
    + addToolBar(toolBar);
        * 可选参数 默认停靠范围
            + addToolBar(Qt::BottomToolBarArea,toolBar);
        * 只允许左右停靠
            + toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
        * 取消浮动
            + toolBar->setFloatable(false);
        * 设置禁止移动
            + toolBar->setMovable(false);
        * 给工具栏设置栏目
            + toolBar->addAction("绝了"或者QAction);
        * 给工具栏添加控件
            + toolBar->addWidget(QPushButton按钮);

状态栏 QStatusBar

* 状态栏最多只能有一个
    + QStatusBar * stBar = statusBar();
    + setStatusBar(stBar);
        * 添加标签控件
            + QLabel * label = new QLabel("左侧提示的信息",this);
            + QLabel * label1 = new QLabel("右侧提示的信息",this);
            + stBar->addWidget(label);
            + stBar->addPermanentWidget(label1);

铆接部件 QDockWidget

* 铆接部件可以有多个
    + QDockWidget * dockWidget = new QDockWidget("浮动",this);
    + addDockWidget(Qt::BottomDockWidgetArea,dockWidget); 放置位置下面 如果没有中心部件默认占满
        + 只允许上下
                * dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);  

中心部件

* 中心内容也只能有一个
    + 文本窗口 QTextEdit
        + QTextEdit * edit = new QTextEdit(this);
        + setCentralWidget(edit); //设置中心部件

资源文件

  1. 将图片文件文件夹拷贝到项目下
  2. 右键项目->添加新文件->Qt->Qt recourse File
  3. res 生成 res.qrc
  4. 右键res.qrc->open in editor 编辑资源
  5. 添加前缀 添加文件
  6. 使用 “: + 前缀名 + 文件名”

小总结

+ 只能有一个的是set 可以允许多个是add

对话框

  • 模态对话框 不可以对其他窗口进行操作
    • QDialog dlg(this);
    • dlg.exec();
    • 消息对话框
      • 错误对话框 QMessageBox::critical(this,“critical”,“错误”);
      • 信息对话框 information
      • 提问对话框 question
      • 警告对话框warning
      • 颜色对话框
        • QColor a = QColorDialog::getColor(QColor(255,0,0));
      • 文件对话框 最后一个是过滤
        • QString str = QFileDialog::getOpenFileName(this,“打开文件”,“./”,“(*.cpp)”);
      • 字体对话框
        • bool flag;
        • QFont font = QFontDialog::getFont(&flag,QFont(“华文彩云”,12));
        • setFont(font);//设置字体
  • 非模态对话框 可以对其他窗口进行操作
    • QDialog *dlg2 = new QDialog(this); //为了确保不释放,开在堆上
    • dlg2->show();
    • dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号 用于按关闭键自动释放[QWidge的对象树是在关闭总的窗口才会全部释放]

列表控件 listWidget

  • QListWidgetItem * item = new QListWidgetItem(“锄禾日当午”);
  • ui->listWidget->addItem(item); //添加进去
  • item->setTextAlignment(Qt::AlignCenter); //居中

ui窗口自布局

  1. Spacers 弹簧 Widget div盒子
  2. Group Box 分组[适用于Radio Button]
  3. 主窗口设置垂直布局后可以在sizePolicy->垂直策略->Fixed来使组件高度合适
  4. 如果找不到某个组件的信号或者槽,找基类

自定义组件

  1. add new -> 设计师类
  2. 使用自定义组件
    • 查看基类[如widget] 从界面库中拖出来一个widget组件,然后点击提升为,写入类名
      • [设置全局后可以直接在右键中显示] 3 自定义组件只有同基类才能被提升

QT事件 QEvent

  • 鼠标事件
    • 事件是虚函数,可以进行重载
      //鼠标进入事件
      virtual void enterEvent(QEvent *event);
      //鼠标离开事件
      virtual void leaveEvent(QEvent *event);
      //鼠标按下
      virtual void mouseReleaseEvent(QMouseEvent *ev);
      //鼠标释放
      virtual void mousePressEvent(QMouseEvent *ev);
      //鼠标移动
      virtual void mouseMoveEvent(QMouseEvent *ev);
  • 定时器 QTimeEvent
    • 利用事件实现定时器
      • startTimer(1000); 启动定时器,单位毫秒,返回一个唯一定时器id
      • void timerEvent(QTimerEvent * ev)
        • 定时器函数,可以通过ev->timerId()== id1来判断当前是哪个id进来的
    • 定时器类QTimer +
      //通过定时器类
      QTimer * timer = new QTimer(this);
      //启动定时器 每隔500秒发一个信号
      timer->start(500);
      //连接信号
      connect(timer,&QTimer::timeout,中括号小括号{
      static int num = 1;
      ui->label_5->setText(QString::number(num++));
      });
  • event事件分发器
    • bool event(QEvent * ev)
      • 返回值是bool类型,如果返回true,代表用户要处理这个事件,不向下分发事件了[类似于钩子]
    • 事件枚举QEvent
      • ev.type();
      • 拦截后使用子类的操作可以使用静态类型转换
        • QMouseEvent *ev = static_cast(QEvent中行参);
    • 但是尽量别拦截
  • 事件过滤器
    • 在app到事件分发器前还能做个过滤
    • 使用方式
      • 给控件安装时间过滤器
        • installEventFilter(this);
      • 重写eventfilter事件

绘图 QPainter

  • 绘图事件 void paintEvent(QPaintEvent *)
  • 画家类 QPainter(构图的设备)
    • 拿起笔 .setPen(笔)
    • 拿起刷子 .setBrush(刷子)
  • 画笔类 QPen(笔的颜色)
  • 画刷类 QBrush(笔的颜色)
  • 高级操作
    • 效率降低的抗锯齿
      • painter.setRenderHint()
    • 改变画家位置
      • painter.save();保存当前位置
      • painter.restore(); 还原到保存的位置
      • painter.translate(); 移动画家
    • 画家绘制图片drawPixmap

绘图设备

  • QPixmap 专门对图像显示做了优化
  • QBitmap 色深限定为1
  • QImage 专门为图像的像素级访问做了优化
  • QPicture 可以记录和重视画家的QPainter的各类命令
    • 自定义绘图操作

文件读写 QFile

  • file.open(打开方式) QtODevice::readOnly
  • 全部读取 file.readAll() 按行读 file.readLine() 判断文件末尾atend()
  • QFile默认支持的是utf-8 指定格式 QTextCodec
    • QTextCodec *codec = QTextCodec::codecForName(“gbk”);
    • ui->textEdit->setText(codec->toUnicode(array));
  • 关闭文件对象 file.close();

文件信息 QFileInfo

  • QFileInfo info(path);
  • 后缀名 info.suffix()
  • 创建日期 info.birthTime().toString(“yyyy/MM/dd hh:mm:ss”);
  • 修改日期 info.lastModified().toString(“yyyy/MM/dd hh:mm:ss”);

Qss

  • #myButton 这里的id实际上就是objectName指定的值
  • 伪状态
    • :active 当小部件驻留在活动窗口中时,将设置此状态
    • :checked 该控件被选中时候的状态
    • :hover 鼠标在控件上方
    • :pressed 该控件被按下时的状态
    • :disabled 该控件禁用时的状态
    • :first 该控件是第一个(列表中)
    • :focus 该控件有输入焦点时

动画 QPropertyAnimation

//winLabel 你要对那个组件使用动画 geometry几何结构
QPropertyAnimation * an = new QPropertyAnimation(winLabel,“geometry”);
//动画时间
an->setDuration(1000);
//动画开始 an->setStartValue(QRect(winLabel->x(),winLabel->y(),winLabel->width(),winLabel->height()));
//动画结束
an->setEndValue(QRect(winLabel->x(),winLabel->y() + 300,winLabel->width(),winLabel->height()));
//动画方式
an->setEasingCurve(QEasingCurve::OutBounce);
an->start();

背景音乐 QSound

  • qmake: QT += multimedia
  • QSound * startSound = new QSound(“:/res/TapButtonSound.wav”,this); 载入音效
  • startSound->play(); 播放
  • startSound->setLoops(-1); -1循环次数无限

打包发布

  • debug->release
  • 运行 运行失败添加环境变量D:\QT\5.12.3\mingw73_64\lib
  • 把 Goldreverse.exe 单独丢到一个文件夹下
  • cmd中路径后windeployqt .\Goldreverse.exe 运行
  • 此时已经可以使用了
  • 深入打包[hm nis edit][https://www.bilibili.com/video/BV1g4411H78N?p=63&spm_id_from=pageDriver]
  • HM NIS Edit 和 NSIS

案例:翻金币

  • 收获
    1. 删除资源文件后需要删除debug文件,不然会报错
    2. 界面的切换可以使用信号和槽 即其它界面emit发送一个信号,主界面接收
      • 当然也可以选择记录父类指针,但是必须要在构造函数中多传个参数,而不是使用默认的parent
    3. 在按钮上方有其他组件,可以使用label->setAttribute(Qt::WA_TransparentForMouseEvents);让其可以点到按钮[51号属性]
    4. 界面翻转金币 本质上是个按钮
      • 人点击后
      • 金币触发翻转
      • 定时器每隔30ms发送一次信号给金币
      • 金币触发图片重新放置,到最大值或者最小值的时候关闭定时器
      • 金币中有坐标i 和 j 以及一个flag 来确定该金币在页面中的位置
    5. 锁定窗口 m_chooseScence->setGeometry(this->geometry()); 每次进入或者退出都锁定他的位置
  • 延时器 QTimer::singleShot(毫秒,拉姆达表达式);

你可能感兴趣的:(Qt,qt,开发语言,c++)