Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Qt5-QtWidgets篇

Qt5-QtWidgets篇

作者头像
她的店里只卖樱花
发布于 2022-10-31 08:51:06
发布于 2022-10-31 08:51:06
1.6K00
代码可运行
举报
文章被收录于专栏:常用算法模板常用算法模板
运行总次数:0
代码可运行

什么是QT

  • QT是一个跨平台的C++图像用户界面应用程序框架
  • QT在1991年由奇趣科技开发
  • QT的优点
    • 跨平台,几乎支持所有平台
    • 接口简单,容易上手
    • 一定程度上简化了内存回收机制
    • 有很好的社区氛围
    • 可以进行嵌入式开发

QWidget

QT注意事项

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

按钮

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

QT中的对象树

  1. 当创建的对象在堆区的时候,如果指定的付钱是QObject 派生下来的类或者子类
  2. 派生下来的类,可以不需要管理释放操作,会将对象放入对象树 一定程度上简化了内存回收机制

QT的窗口坐标系

  1. 笛卡尔坐标系[左上角为0,0点]

QT信号和槽

  • connect( 信号的发送者 ,信号的具体信息, 信号的接受者,信号的处理[槽])
  • 信号槽的优点 松散耦合
    • 信号发送端 和 接收端本身是没有关联的,通过connectl连接,将两者耦合在一起
    • 信号关键字:Signals
      • chlicked(bool) 点击
      • pressed() 按下
      • released() 释放
      • toggled(bool) 切换状态
    • 槽的关键字:Slots
  • 自定义信号和槽位函数
    • 自定义信号
      • 写在类的signals下,返回值为void,可以有参数,支持重载,不需要实现
    • 自定义槽函数
      • 不能写在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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 菜单栏最多只能有一个
    + QMenuBar * bar = menuBar(); setMenuBar(bar);
    + 创建菜单
        * QMenu * fileMenu = bar->addMenu("文件");
            + 创建菜单栏目
                * QAction * newAction =  fileMenu->addAction("新建");
            + 添加分隔符 
                * fileMenu->addSeparator();

工具栏 QToolBar

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 工具栏可以有多个
    + 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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 状态栏最多只能有一个
    + QStatusBar * stBar = statusBar();
    + setStatusBar(stBar);
        * 添加标签控件
            + QLabel * label = new QLabel("左侧提示的信息",this);
            + QLabel * label1 = new QLabel("右侧提示的信息",this);
            + stBar->addWidget(label);
            + stBar->addPermanentWidget(label1);

铆接部件 QDockWidget

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 铆接部件可以有多个
    + QDockWidget * dockWidget = new QDockWidget("浮动",this);
    + addDockWidget(Qt::BottomDockWidgetArea,dockWidget); 放置位置下面 如果没有中心部件默认占满
        + 只允许上下
                * dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);  

中心部件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 中心内容也只能有一个
    + 文本窗口 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. 使用 “: + 前缀名 + 文件名”

小总结

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+ 只能有一个的是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<QMouseEvent >(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循环次数无限

打包发布

案例:翻金币

  • 收获
    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(毫秒,拉姆达表达式);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
学习 QT 过程中的一些笔记
学习 QT 时候做的一些笔记 目录 目录 按钮常用控件 API QT 窗口体系 信号和槽 点击按钮关闭窗口 自定义信号和槽 当自定义信号和槽出现重载 无参信号和有参信号与槽连接 Lambda 表达式 利用 Lambda 表达式实现点击按钮关闭窗口 QMainWindow 菜单栏 工具栏 状态栏 标签控件 浮动窗口 核心部件 资源文件 对话框 话框分类: 标准对话框 其他标准对话框 界面布局 控件 按钮组 QListWidget 列表容器 按钮常用控件 API QPushButton * btn = new
HauHau
2022/01/12
1.2K0
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
2.4默认创建有窗口类,yWidget,基类有三种选择:QWidget、QMainWindowQDialog
Arya
2024/10/31
5510
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
Qt 学习记录
[],标识一个 Lambda 的开始,这部分必须存在,不能省略。外部变量访问方式说明符只能使用定义 Lambda 为止时 Lambda 所在作用范围内可见的局部变量(包括 Lambda 所在类的 this)。外部变量访问方式说明符有以下形式:
小简
2023/01/04
7.3K0
Qt 学习记录
QT从控件部分知识点整理
2.设置可以停靠的区域,例如:只能停靠在左和右 3.设置工具栏是否可以浮动,即工具栏要么停靠在左边,要么停靠在右边,一撒手就立刻回去了 4.设置移动:如果传入一个false,则表示该工具栏无法拖拽移动
大忽悠爱学习
2021/11/15
1.1K0
Qt入门系列(三)
选装父文件—>添加文件-->Qt--->设计师界面->命名smallWidget(简称sw)
用户9831583
2022/06/16
1.2K0
Qt入门系列(三)
QT入门学习——从鼠标事件,定时器事件到绘图学习,绘图设备
Arya
2024/11/06
2350
QT入门学习——从鼠标事件,定时器事件到绘图学习,绘图设备
【QT】:QMainWindow 窗口
Qt 中的菜单栏是通过 QMenuBar 这个类来实现的。一个主窗口最多只有一个菜单栏,位于主窗口顶部、主窗口标题栏下面。
IsLand1314
2025/02/18
2140
【QT】:QMainWindow 窗口
【QT】事件系统入门——QEvent 基础与示例
事件本身是 操作系统提供的 机制,Qt 也同样把操作系统事件机制进行了封装拿到了 Qt 中,但由于 事件 对应的代码编写起来不方便,因此 Qt 对于事件机制 又进行了进一步的 封装,就得到了 信号槽
IsLand1314
2025/03/14
1430
【QT】事件系统入门——QEvent 基础与示例
【QT】Qt 窗口 (QMainWindow)
QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了一个预定义的布局。QMainWindow 包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗口(铆接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为 QMainwindow 中 各组件所处的位置:
YoungMLet
2024/07/16
4880
【QT】Qt 窗口 (QMainWindow)
Qt入门系列(二)
选中mainWindow.cpp右键->在Explor中显示->粘贴进来(显示包含的目录)
用户9831583
2022/06/16
2K0
Qt入门系列(二)
【QT】Qt事件
事件是应用程序内外部产生的事情以及动作的统称,常见的所有事件例如鼠标事件QMouseEvent,键盘事件QKeyEvent等等都是继承自QEvent
s-little-monster
2024/11/06
2520
【QT】Qt事件
Python Qt GUI设计:5种事件处理机制(提升篇—3)
之前在Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)中,我们已经简单讲到,PyQt为事件处理提供了两种机制:高级的信号与槽机制以及低级的事件处理程序,本篇博文将系统讲解Qt的事件处理机类和制。
不脱发的程序猿
2021/11/24
2.4K0
Python Qt GUI设计:5种事件处理机制(提升篇—3)
【QT】QT事件处理
QT中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等。QT中,任何QObject子类示例都可以接收和处理事件。实际编程中通常实现部件的paintEvent()、mousePressEvent()等事件处理函数来处理特定部件的特定事件。
半生瓜的blog
2023/05/13
1.6K0
【QT】QT事件处理
Python:PyQt学习
上面的代码把控件对应的变量名全部作为全局变量。如果要设计稍微复杂一些的程序,就会出现太多的控件对应的变量名。而且这样也不利于代码的模块化。所以,我们通常应该把 一个窗口和其包含的控件,对应的代码全部封装到类中,如下所示:
小简
2023/01/04
10.7K0
Python:PyQt学习
【QT】鼠标按键事件 - QMouseEvent & QKeyEvent
事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用⼀个对象来表⽰⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。当用户按下⿏标、敲下键盘,或者是窗⼝需要重新绘制的时候,都会发出⼀个相应的事件。⼀些事件是在用户操作时发出,如键盘事件、⿏标事件等,另⼀些事件则是由系统本⾝⾃动发出,如定时器事件。常见的 Qt 事件如下:
YoungMLet
2024/07/20
1.2K0
【QT】鼠标按键事件 - QMouseEvent & QKeyEvent
Qt入门系列(四)
新建一个class C++:ChoselevelScence,简称cs,继承QMainWIndow
用户9831583
2022/06/16
9750
Qt入门系列(四)
【QT】Qt窗口(上)
QMainWindow包含一个菜单栏Menu Bar②,多个工具栏Tool Bars③,多个浮动窗口Dock Widgets,一个状态栏Status Bar⑤和一个中心部件Central Widget④ ①是Window Title
s-little-monster
2024/10/29
1320
【QT】Qt窗口(上)
Qt编写自定义控件35-GIF录屏控件
在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基本上都支持gif动图,一般一个5秒左右的gif,800*600分辨率,可以很好的控制在500KB内,这样就比较完美的支持各大网站上传动图。
feiyangqingyun
2019/08/27
1.5K0
Qt编写自定义控件35-GIF录屏控件
Qt编写自定义控件24-图片轮播控件
上一篇文章写的广告轮播控件,采用的传统widget堆积设置样式表做的,这次必须要用到更高级的QPainter来绘制了,这个才是最高效的办法,本控件参考雨田哥的轮播控件,经过大规模的改造而成,相比于原来的广告轮播控件,本控件可以说完爆他,按在地上使劲摩擦。除了可以设置图片路径集合以外,还可以设置对应的提示信息,这个在众多的web轮播图片效果中最常见,比如新闻的标题等,可以更直观的显示当前图片,而且单击图片还可以支持跳转,指示器的位置也能设置左边+中间+右边,指示器的样式更加增加到椭圆条状+圆形+矩形+小圆点+长条状多种可选择,可以说涵盖了各种web轮播图片的效果,还可以设置鼠标悬停暂停轮播,以便看清说明后鼠标移开继续轮播。指示器的宽高颜色等,都是可以自由设定的,这个对于采用QPainter绘制来说,是最好自定义的,无非就是设置对应的画笔QPen和对应的画布QBrush的颜色啦。
feiyangqingyun
2019/08/27
2K0
Qt编写自定义控件24-图片轮播控件
C/C++ Qt 基础通用组件的应用
QT 是一个跨平台C++图形界面开发库,利用QT可以快速开发跨平台窗体应用程序,在QT中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率。
王瑞MVP
2022/12/28
2.8K0
C/C++ Qt 基础通用组件的应用
相关推荐
学习 QT 过程中的一些笔记
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验