【Qt开发流程】之程序主窗口

描述

就目前的应用程序而言,一般包含菜单栏、工具栏、状态栏、中央区域等。
qt窗口部件类图如下:
在这里插入图片描述
一个主窗口提供了一个构建应用程序用户界面的框架。
Qt有QMainWindow及其相关类来管理主窗口。
QMainWindow有自己的布局,可以向其中添加QToolBars、QDockWidgets、QMenuBar和QStatusBar。布局有一个中心区域,可以被任何类型的小部件占用。
可以看到以下布局的图像。
在这里插入图片描述

菜单栏

菜单栏(QMenu)是一个包含下拉菜单的列表,由QAction动作类实现。
Qt在QMenu中实现菜单,而QMainWindow将它们保留在QMenuBar中。将QActions添加到菜单中,它们会显示为菜单项。
可以通过调用menuBar()来向主窗口的菜单栏添加新菜单,该函数返回窗口的QMenuBar,然后使用QMenuBar::addMenu()添加菜单。
QMainWindow带有默认的菜单栏,但也可以使用setMenuBar()自己设置一个菜单栏。如果希望实现自定义菜单栏(即不使用QMenuBar小部件),则可以使用setMenuWidget()进行设置。
以下是创建菜单的示例:

void MainWindow::createMenus()
{
    fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(newAct);
    fileMenu->addAction(openAct);
    fileMenu->addAction(saveAct);
}

createPopupMenu()函数在主窗口接收上下文菜单事件时创建弹出菜单。默认实现会生成一个包含停靠窗口和工具栏的可选操作的菜单。可以为自定义菜单重新实现createPopupMenu()。
可以在设计师直接输入菜单
在这里插入图片描述
可以在动作区添加动作,可以添加图标,动作可以复用,在菜单栏和工具栏添加。
在这里插入图片描述

工具栏

工具栏在QToolBar类中实现。可以使用addToolBar()将工具栏添加到主窗口中。
通过将工具栏分配到特定的Qt::ToolBarArea,可以控制工具栏的初始位置。可以通过使用addToolBarBreak()或insertToolBarBreak()插入工具栏断点来分割一个区域,类似于文本编辑中的换行符。还可以使用QToolBar::setAllowedAreas()和QToolBar::setMovable()限制用户在何处放置工具栏。
可以使用iconSize()检索工具栏图标的大小。这些大小取决于平台;可以使用setIconSize()设置固定大小。可以使用setToolButtonStyle()更改工具栏中所有工具按钮的外观。
以下是创建工具栏的示例:

void MainWindow::createToolBars()
{
    fileToolBar = addToolBar(tr("File"));
    fileToolBar->addAction(newAct);
}

在这里插入图片描述

状态栏

可以使用setStatusBar()设置状态栏,但是第一次调用statusBar()(返回主窗口的状态栏)时会自动创建一个状态栏。

ui->statusBar->showMessage("helloworld");

在这里插入图片描述

中央区域

一个主窗口可以放置一个中心部件。使用setCentralWidget(QWidget *widget)方法设置。

setCentralWidget(new QTextEdit);

在这里插入图片描述

dock区域

Dock widgets是使用QDockWidget类实现的。dock widget是一个可以停靠在主窗口的窗口。可以使用addDockWidget()将dock widget添加到主窗口中。
根据Qt :: DockWidgetArea枚举,有四个dock widget区域:左、右、上和下。可以使用setCorner()指定应占用区域重叠处角落的dock widget区域。默认情况下,每个区域只能包含一个dock widget行(垂直或水平),但如果使用setDockNestingEnabled()启用嵌套,则dock widget可以沿任一方向添加。
两个dock widget也可能堆叠在一起。然后使用QTabBar选择应显示哪个窗口部件。
下面是一个创建和添加dock widget到主窗口的示例代码:

    QDockWidget *dockWidget = new QDockWidget(tr("Dock Widget"), this);
    dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
    dockWidget->setWidget(dockWidgetContents);
    addDockWidget(Qt::LeftDockWidgetArea, dockWidget);

工具栏添加弹出式菜单

    QMenu* pM = new QMenu();
    pM->addAction(new QAction("123", this));
    pM->addAction(new QAction("123", this));

    QToolButton* pT = new QToolButton;
    pT->setMenu(pM);
    pT->setPopupMode(QToolButton::MenuButtonPopup);

    ui->mainToolBar->addWidget(pT);

在这里插入图片描述

状态栏显示永久消息

ui->statusBar->addPermanentWidget(new QLabel("helloworld"));

显示在右侧,不会被左侧的临时消息覆盖。
在这里插入图片描述

自定义菜单

通过QWidgetAction类可以创建自定义菜单。
QWidgetAction类通过接口扩展了QAction,用于将自定义小部件插入到基于操作的容器(例如工具栏)中。
应用程序中的大多数操作都表示为菜单中的项目或工具栏中的按钮。但是,有时需要更复杂的小部件。例如,文字处理器中的缩放操作可以使用QToolBar中的QComboBox实现,以呈现不同缩放级别的范围。QToolBar提供了QToolBar :: insertWidget()作为方便函数,用于插入单个小部件。但是,如果想要实现使用自定义小部件在多个容器中进行可视化的操作,则必须子类化QWidgetAction。
例如,如果在将QWidgetAction添加到QToolBar中,则将调用QWidgetAction :: createWidget()。该函数的重新实现应该使用指定的父项创建一个新的自定义小部件。
如果从容器小部件中删除操作,则调用QWidgetAction :: deleteWidget(),并将先前创建的自定义小部件作为参数。默认实现隐藏小部件,并使用QObject :: deleteLater()将其删除。
如果只有一个单独的自定义小部件,则可以使用setDefaultWidget()设置为默认小部件。
如果将操作添加到QToolBar中,或者通常将其添加到支持QWidgetAction的操作容器中,则将使用该部件。
如果在同一时间将只有默认小部件的QWidgetAction添加到两个工具栏中,则默认小部件仅显示在添加操作的第一个工具栏中。
QWidgetAction接管了默认小部件的所有权。
请注意,激活操作取决于小部件,例如通过重新实现鼠标事件处理程序并调用QAction :: trigger()来激活操作。

QWidget* MyAction::createWidget(QWidget *parent)
{
    QWidget* pW = new QWidget(parent);
    QLabel* pLabel = new QLabel("哈哈");

    QLineEdit* pLE = new QLineEdit();
    QHBoxLayout* pHB = new QHBoxLayout();
    pHB->addWidget(pLabel);
    pHB->addWidget(pLE);
    pW->setLayout(pHB);

    return pW;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

测试之路,女孩子软件测试-职业规划建议,路就在脚下...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、测试岗是不是加…

Upwork 新手使用指南——如何快速在Upwork上接单

Upwork 这个自由职业平台不知道大家听说过没,在 Upwork,如果你是自由职业者,你可以接单;如果你是客户,你可以找人干活。但对于新手来说,怎么使用 Upwork 并且用好 Upwork 是一大难题。因此今天给大家分享 U…

Mistral 7B 比Llama 2更好的开源大模型 (四)

Mistral 7B在平衡高性能和保持大型语言模型高效的目标方面迈出了重要的一步。通过我们的工作,我们的目标是帮助社区创建更实惠、更高效、更高性能的语言模型,这些模型可以在广泛的现实世界应用程序中使用。 Mistral 7B在实践中,对于16K和W=4096的序列长度,对FlashAttentio…

Modbus转Profinet网关在污水处理系统中连接PLC和变频器Modbus通信案例

污水处理系统中使用Modbus转Profinet网关可以连接PLC和变频器,实现二者之间的通信。该网关的作用是将PLC与变频器之间的Modbus协议转换为Profinet协议,使两者可以相互沟通。在污水处理系统中,PLC控制污水处理的各个过程,而变频器则…

机器学习二元分类 二元交叉熵 二元分类例子

二元交叉熵损失函数 深度学习中的二元分类损失函数通常采用二元交叉熵(Binary Cross-Entropy)作为损失函数。 二元交叉熵损失函数的基本公式是: L(y, y_pred) -y * log(y_pred) - (1 - y) * log(1 - y_pred)其中,y是真实标签&…

【性能测试】稳定性测试要点-监控关键指标总结(超细整理)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、稳定性测试的要…

接口与抽象类的区别

Java中的接口(Interface)和抽象类(Abstract Class)都是实现抽象化的关键机制,但它们在用途和功能上有着明显的区别。以下是接口和抽象类之间的主要区别: 抽象类(Abstract Class) 含…

Docker之虚悬镜像(查看、删除)

虚悬镜像: 仓库名、标签都是的镜像,俗称dangling image 查看 docker image ls -f danglingtrue删除 虚悬镜像已经失去存在价值,可以删除 docker image prune

LeetCode977.有序数组的平方(双指针法、暴力法、列表推导式)

LeetCode977.有序数组的平方 1.问题描述2.解题思路3.代码4.知识点 1.问题描述 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] …

要事第一:如何通过6个步骤确定项目的优先级

当收到很多项目请求并且每个请求都是重中之重时,该怎么办?从最易完成的开始?还是先解决最大的问题? 实际上两种做法都不对。确定项目优先级的更好方法是评估以下内容,而不是关注项目规模或完成时长: ● 每…

3.8-镜像的发布

如果我们想将image push到docker hub里面,那么我们的image的名字一定要是这种格式:docker hub id/imageName,例如:lvdapiaoliang/hello-docker docker hub个人账户设置地址: 在push之前要先登录: docker l…

pycharm2023 实现鼠标点击某行,调试时代码运行至相应行

按下图取消 Breakpoints Over Line Numbers即可,然后调试时点击某行,代码就会运行至某行

AcWing 717. 简单斐波那契

原题链接 题目 以下数列 0 1 1 2 3 5 8 13 21 … 被称为斐波纳契数列。 这个数列从第 3 项开始,每一项都等于前两项之和。 输入一个整数 N ,请你输出这个序列的前 N 项。 输入格式 一个整数 N 。 输出格式 在一行中输出斐波那契数列的前 N 项&…

Nosql之redis概述及基本操作

关系数据库与非关系型数据库概述 关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型…

HTTP四种请求方式,状态码,请求和响应报文

1.get请求 一般用于获取数据请求参数在URL后面请求参数的大小有限制 2.post请求 一般用于修改数据提交的数据在请求体中提交数据的大小没有限制 3.put请求 一般用于添加数据 4.delete请求 一般用于删除数据 5.一次完整的http请求过程 域名解析:使用DNS协议…

数据结构-插入排序

插入排序 插入排序的三种常见方法: 直接插入排序、折半插入排序、希尔排序。 数据存储结构 因为我们是用的是C语言来实现算法,因此我们需要创建一个结构体,用来存放初始数据。 结构体定义如下: #define MAX 100 typedef int…

Spring Framework IOC依赖查找 - 按类型查找解析

目录 在Spring框架中,控制反转(IoC)是一种设计模式,它通过将对象的创建和管理交给容器来实现。依赖查找是IoC的一部分,它允许你从容器中查找所需的依赖项。按类型进行依赖查找是其中的一种方式,今天来讲Spr…

笔记57:双向循环神经网络

本地笔记地址:D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章:动手学深度学习~现代循环神经网络 a a a a a a a a a a a a

动态页面调研及设计方案

文章目录 vue2 动态表单、动态页面调研一、form-generator二、ng-form-element三、Variant Form四、form-create vue2 动态表单、动态页面调研 一、form-generator 预览:https://mrhj.gitee.io/form-generator/#/ Vue2 Element UI支持拖拽生成表单不支持其他组件…