【Qt学习】03:QMainWindow

news2024/11/15 13:32:16

QMainWindow


OVERVIEW

  • QMainWindow
      • 一、QMainWindow
        • 1.菜单栏
        • 2.工具栏
        • 3.状态栏
        • 4.铆接部件
        • 5.核心部件
        • 6.练习
      • 二、ui资源文件

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏menu bar、多个工具栏tool bars、多个锚接部件dock widgets、一个状态栏status bar及一个中心部件central widget,是许多应用程序的基础,如文本编辑器、图片编辑器等。

一、QMainWindow

1.菜单栏

一个主窗口最多只有一个菜单栏,位于主窗口顶部、主窗口标题栏下面。

  • 创建菜单栏,通过QMainWindow类的menubar()函数获取主窗口菜单栏指针

    QMenuBar* menuBar() const
    
  • 创建菜单,通过调用QMenu的成员函数addMenu()来添加菜单

    QAction* addMenu(QMenu* menu)
    QMenu* addMenu(const QString& title)
    QMenu* addMenu(const QIcon& icon, const QString& title)
    
  • 创建菜单项,调用QMenu的成员函数addAction来添加菜单项

    QAction* activeAction() const
    QAction* addAction(const QString& text)
    QAction* addAction(const QIcon& icon, const QString& text)
    QAction* addAction(const QString& text, const QObject* receiver, 
                       const char* member, const QKeySequence& shortcut = 0)
    QAction* addAction(const QIcon& icon, const QString& text, 
                       const QObject* receiver, const char* member, 
                       const QKeySequence& shortcut = 0)
    

    Qt 并没有专门的菜单项类,只是使用一个QAction类抽象出公共的动作。

    当把QAction对象添加到菜单就显示成一个菜单项,添加到工具栏就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。

2.工具栏

主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的方式,也可根据需要进行工具条的划分。

  • 直接调用QMainWindow类的 addToolBar() 函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数。
  • 插入属于工具条的动作,即在工具条上添加操作,通过QToolBar类的addAction函数添加。
  • 工具条是一个可移动的窗口,它的停靠区域由QToolBar的allowAreas决定,包括:
    • Qt::LeftToolBarArea 停靠在左侧
    • Qt::RightToolBarArea 停靠在右侧
    • Qt::TopToolBarArea 停靠在顶部
    • Qt::BottomToolBarArea 停靠在底部
    • Qt::AllToolBarAreas 以上四个位置都可停靠
    • 使用setAllowedAreas()函数指定停靠区域
    • 使用setMoveable()函数设定工具栏的可移动性

3.状态栏

状态栏派生自QWidget类,使用方法与QWidget类似且最多只能有一个,QStatusBar类常用成员函数:

void addWidget(QWidget * widget, int stretch = 0)//添加小部件
int	insertWidget(int index, QWidget * widget, int stretch = 0)//插入小部件
void removeWidget(QWidget * widget)//删除小部件

4.铆接部件

铆接部件 QDockWidget,也称浮动窗口,可以有多个。

QDockWidget *dock = new QDockWidget("title",this);
addDockWidget(Qt::LeftDockWidgetArea,dock);
dock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);//设置区域范围

5.核心部件

除了以上几个部件,中心显示的部件都可以作为核心部件,例如一个记事本文件,可以利用QTextEdit做核心部件

QTextEdit *tedit = new QTextEdit(this);
setCentralWidget(edit);

6.练习

在这里插入图片描述

#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>
#include <QDockWidget>
#include <QTextEdit>
#include <QLabel>
#include <QDebug>
#include <QPushButton>
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);
    //1.菜单栏(只能有1个)
    QMenuBar *mbar = menuBar();//系统提供的方法menuBar()创建菜单栏
    setMenuBar(mbar);
    QMenu *mfile = mbar->addMenu("file");//创建菜单
    mfile->addAction("new file");//创建菜单项
    mfile->addAction("open file");
    mfile->addAction("close file");
    mfile->addSeparator();//添加分隔符
    mfile->addAction("save");
    mfile->addAction("save as");
    QMenu *medit = mbar->addMenu("edit");
    medit->addAction("undo");
    medit->addAction("redo");
    medit->addAction("copy");
    medit->addAction("paste");
    medit->addAction("select all");
    medit->addAction("select encoding");

    //2.工具栏(可以有多个)
    QToolBar *tbar = new QToolBar(this);
    addToolBar(Qt::LeftToolBarArea, tbar);//默认工具栏停靠在左侧
    tbar->setAllowedAreas(Qt::LeftToolBarArea |Qt::RightToolBarArea);//设置工具栏只允许左右停靠
    tbar->setFloatable(false);//禁止浮动工具栏
    tbar->setMovable(false);//禁止工具栏移动
    tbar->addAction("welcome");
    tbar->addAction("projects");
    tbar->addAction("design");
    tbar->addAction("debug");
    tbar->addSeparator();
    tbar->addAction("help");
    tbar->addAction("bookmark");

    //3.状态栏(只能有1个)
    QStatusBar *sbar = statusBar();
    setStatusBar(sbar);
    QLabel *labell = new QLabel("detail info", this);
    sbar->addWidget(labell);
    QLabel *labelr = new QLabel("other info", this);
    sbar->addPermanentWidget(labelr);

    //4.铆接部件 浮动窗口(可以有多个)
    QDockWidget *dwt = new QDockWidget("float", this);
    dwt->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
    addDockWidget(Qt::BottomDockWidgetArea, dwt);
    //5.核心部件(只能有1个)
    QTextEdit *tedit = new QTextEdit(this);
    setCentralWidget(tedit);
}

MainWindow::~MainWindow() {
    delete ui;
}

二、ui资源文件

Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果程序需要加载特定的资源图标、文本等,那么将其放置在资源文件中就不需要担心文件丢失(编译到可执行文件内部)。

  1. 将资源文件拷贝到项目目录下,
  2. 右键项目添加Qt resource file,为资源文件起名如res,生成res.qrc文件
  3. 添加前缀和文件
  4. 使用资源:ui->actionopen->setIcon(QIcon(":/res/img/ParticleSmoke.png"));

这么使用资源文件可能带来的一个问题是,如果以后我们要更改文件名,比如将 ParticleSmoke.png 改成 smile.png,那么所有使用了这个名字的路径都需要修改。所以更好的办法是给该文件取一个别名,用别名来引用该文件。

这样就可以直接使用:/res/refer引用到这个资源,无需关心图片的真实文件名。

如果使用文本编辑器打开 res.qrc 文件,就会看到以下内容:

<RCC>
    <qresource prefix="/res">
        <file>img/filetransfer.png</file>
        <file alias="refer">img/ParticleSmoke.png</file>
    </qresource>
</RCC>

当编译工程之后可以在构建目录中找到 qrc_res.cpp 文件,这就是 Qt 将项目的资源编译成了 C++ 代码,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/930382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringBoot】第二篇:RocketMq使用

背景&#xff1a; 本文会介绍多种案例&#xff0c;教大家如何使用rocketmq。 一般rocketmq使用在微服务项目中&#xff0c;属于分模块使用。这里使用springboot单体项目来模拟使用。 本文以windows系统来做案例。 下载rocketmq和启动&#xff1a; RocketMQ 在 windows 上运行…

基于ssm+vue德云社票务系统源码和论文

基于ssmvue德云社票务系统源码和论文063 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1.选题的依据和意义 互联网时代&#xff0c;随着生活节奏的加快和不断上升的压力&#xff0c;人们急需寻找到情绪的宣泄…

你工作效率低,可能是因为不会Python...

前言 你是不是感觉你的工作非常无聊&#xff0c;每天有大量的重复性的工作要做&#xff0c;比如在我的工作中&#xff0c;就有很多类似的动作。每天早上要看我们DevOps流水线跑出的结果&#xff0c;查看各个微服务中的重复代码率是多少&#xff0c;有没有增加&#xff0c;Clea…

【Qt学习】06:事件与事件过滤器

OVERVIEW 事件与事件过滤器一、事件1.鼠标事件创建子类MyLabel重写鼠标事件提升Label控件为MyLabel 2.定时器事件timerEventQTimer 3.事件分发器&#xff08;event函数&#xff09;event函数重写event函数深入 二、事件过滤器1.事件过滤器2.事件处理的五个层次 事件与事件过滤器…

VMVareC++开发环境快速配置

OVERVIEW VMVareC开发环境快速配置ipgitvimgithubzshgcc&g&cmakesshifconfigmysqlnginxredisgdb VMVareC开发环境快速配置 VMVareC开发环境快速配置&#xff0c;为了省时间快速整理出文档方便以后快速配置&#xff0c; 按照这个流程直接可以快速得到一个舒适的C/C开发…

[论文阅读笔记25]A Comprehensive Survey on Graph Neural Networks

这是一篇GNN的综述, 发表于2021年的TNNLS. 这篇博客旨在对GNN的基本概念做一些记录. 论文地址: 论文 1. 引言, 背景与定义 对于图像数据来说, CNN具有平移不变性和局部连接性, 因此可以在欧氏空间上良好地学习. 然而, 对于具有图结构的数据(例如社交网络 化学分子等)就需要用…

用AI + Milvus Cloud搭建着装搭配推荐系统

在上一篇文章中,我们学习了如何利用人工智能技术(例如开源 AI 向量数据库 Milvus Cloud 和 Hugging Face 模型)寻找与自己穿搭风格相似的明星。在这篇文章中,我们将进一步介绍如何通过对上篇文章中的项目代码稍作修改,获得更详细和准确的结果,文末附赠彩蛋。 注:试用此…

Excel 打开文件提示内存或磁盘不足

Excel表格打开文件时&#xff0c;提示内存或磁盘空间不足&#xff0c;Microsoft Excel 无法再次打开或保存任何文档&#xff0c;这是很多人都会遇到的问题&#xff0c;该如何解决这个问题呢&#xff1f;如果你是用Excel表格打开某个文件时遇到提示内存或磁盘空间不足&#xff0…

学好嵌入式,未来能干啥?

很多对嵌入式行业不了解的人会以为嵌入式就是单纯搞单片机的工作。甚至有很多专业学生也抱有这种观念。 这种现象的原因在于大学专业中没有专门针对嵌入式行业的完善专业体系。嵌入式的知识体系庞大&#xff0c;不同的方向需要的知识差异很大。关于嵌入式学习路线&#xff0c;网…

Django(4)-Django 管理页面

创建一个管理员账号 python manage.py createsuperuser运行项目&#xff0c;访问http://127.0.0.1:8080/admin&#xff0c;可以看到管理员界面 管理页面加上投票应用 polls/admin.py from django.contrib import admin# Register your models here. from .models import …

npm和yarn的区别?

文章目录 前言npm和yarn的作用和特点npm和yarn的安装的机制npm安装机制yarn安装机制检测包解析包获取包链接包构建包 总结后言 前言 这一期给大家讲解npm和yarn的一些区别 npm和yarn的作用和特点 包管理&#xff1a;npm 和 yarn 可以用于安装、更新和删除 JavaScript 包。它们提…

腾讯云服务器可用区是什么?可用区怎么选择?

腾讯云服务器可用区是什么意思&#xff1f;可用区是指同一地域内电力和网络互相独立的物理数据中心&#xff0c;腾讯云每个地域下都有多个可用区供选择&#xff0c;将应用部署到不同可用区能够做到故障隔离&#xff0c;提升应用的可靠性和容灾性&#xff0c;阿腾云来详细说下什…

SpringMVC 第二天

第 1 章 ModelAttribute 和 SessionAttribute[ 应 用 ] 1.1ModelAttribute 1.1.1 使用说明 作用&#xff1a; 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。 出现在方法上&#xff0c;表示当前方法会在控制器的方法执行之前&#xff0c;先执行…

综合能源系统(9)——综合能源系统运行管控平台技术

综合能源系统关键技术与典型案例  何泽家&#xff0c;李德智主编 1、综合能源系统运行管控平台技术发展现状 在综合能源服务蓝海市场驱动下&#xff0c;作为能源和互联网跨界融合中枢产品&#xff0c;综合能源服务平台取得了较大进展。综合能源服务平台属性示意图如图3-47所…

Jvm之JIT优化详细解释

文章目录 一、JIT 产生的背景二、HotSpot虚拟机内置JIT编译器1. Client Compiler2. Server Compiler3. 查看本地编译器模式 三、常见热点探测技术1. 基于计数器的热点探测2. 基于采样的热点探测2.1 方法调用计数器2.2 回边计数器 四、常见JIT优化手段1. 公共子表达式消除2. 方法…

vue登录验证码组件,前端验证

效果图 点击可以切换验证码 自定义组件 <template><div class"s-canvas"><canvas id"s-canvas" :width"contentWidth" :height"contentHeight"></canvas></div> </template> <script> e…

左偏树\可并堆

https://www.luogu.com.cn/problem/P3377 作用&#xff1a;可并堆 形态&#xff1a;堆满二叉树 即左节点最小深度大于等于右节点最小深度 合并过程&#xff1a;

谷歌浏览器响应Failed to load response data: no resource with given identifer found

1、如下问题展示&#xff0c;这个是新版谷歌浏览器的不知道啥时候出现的问题&#xff0c;以前旧版未出现过&#xff0c;所以降版本浏览器可能可以 2、但是&#xff0c;博主的方法是换一个浏览器&#xff0c;换成edge就没问题了&#xff0c;由于用习惯了谷歌&#xff0c;所以这…

算法竞赛入门【码蹄集新手村600题】(MT1220-1240)C语言

算法竞赛入门【码蹄集新手村600题】(MT1220-1240&#xff09;C语言 目录MT1221 分数的总和MT1222 等差数列MT1223 N是什么MT1224 棋盘MT1225 复杂分数MT1226 解不等式MT1227 宝宝爬楼梯MT1228 宝宝抢糖果MT1229 搬家公司MT1230 圆周率MT1231圆周率IIMT1232 数字和MT1233 数字之…

OLED透明屏:在广告领域中的应用,为品牌注入更强的视觉冲击

OLED透明屏作为一项引人注目的技术创新&#xff0c;其独特的透明度和高清晰度为各行各业带来了全新的展示和创意空间。 本文将详细介绍其透明度、高对比度、超薄柔性设计以及强大的颜色表现力&#xff0c;并探讨其在零售、汽车和建筑等领域的应用前景。 一、透明度&#xff1a…