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

news2024/9/21 2:49:08

描述

就目前的应用程序而言,一般包含菜单栏、工具栏、状态栏、中央区域等。
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;
}

在这里插入图片描述

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

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

相关文章

苹果(Apple)公司的新产品开发流程(一)

目录 简介 ANPP CSDN学院推荐 作者简介 简介 苹果这家企业给人的长期印象就是颠覆和创新。 而流程跟创新似乎是完全不搭边的两个平行线: 流程是一个做事的标准,定义了权力的边界,对应人员按章办事;而创新的主旋律是发散&am…

IDEA前端thymeleaf只显示部分数据库问题

只显示int类型的number&#xff0c;不显示string类型的price和weight 先看一下apple.html <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>User List</title> </…

游戏报错d3dcompiler_47.dll缺失怎么修复,总结多种修复方法

在使用这些软件和游戏的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是d3dcompiler_47.dll丢失的问题。这个问题可能会导致软件或游戏无法正常运行&#xff0c;给用户带来困扰。本文将详细介绍解决软件游戏d3dcompiler_47.dll丢失的方法&#xff0c;帮助您…

C语言——函数的嵌套调用

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void new_line() {printf("Hello\n"); }void three_line() {int i0;for(i0;i<3;i){new_line();} }int main() {three_line();return 0; }

Linux程序设计(上)

系列文章目录 文章目录 系列文章目录前言一、unix, linux, GNU, POSIXLinux程序 二、shellshell语法1.变量2.语句 函数命令命令的执行dialog工具-- 三、文件操作1. Linux 文件结构2. 系统调用和设备驱动程序3. 库函数4. 底层文件访问5. 标准I/O库6.格式化输入输出7. 文件和目录…

视频剪辑方法:一键批量调整色调的高效技巧

在视频剪辑的过程中&#xff0c;色调调整是一项非常重要的工作。它能够改变影片的氛围、情感和视觉效果&#xff0c;更好地沉浸在影片的情境中。然而&#xff0c;对于许多视频剪辑师来说&#xff0c;批量调整色调是一项非常繁琐的任务&#xff0c;需要耗费大量的时间和精力。色…

C++学习笔记——C++ deque和vector的区别

C中的std::deque&#xff08;双端队列&#xff09;和std::vector&#xff08;向量&#xff09;是两种不同的容器类型&#xff0c;它们有以下区别&#xff1a; 内部实现方式不同&#xff1a;std::deque使用了一种双端队列的数据结构&#xff0c;它由多个块&#xff08;chunks&am…

RFID井盖管理系统解决方案

随着我国城市基础设施建设事业的迅速发展&#xff0c;城市中的通讯、燃气、给水、排水、热力、电力等各类市政公用地下管线设施不断增加&#xff0c;相应地&#xff0c;城市路面上的井盖也越来越多。然而&#xff0c;近年来&#xff0c;由于城市井盖管理不善&#xff0c;井盖被…

Codeforces Round 908 (Div. 2)

一个教训&#xff1a;做题的时候一定要自己模拟一遍所有样例&#xff0c;这样思路出来的很快&#xff01;&#xff01;&#xff01; C. Anonymous Informant Example input Copy 6 5 3 4 3 3 2 3 3 100 7 2 1 5 5 6 1 1 1 1 1 1000000000 1 8 48 9 10 11 12 13 14 …

C++设计模式——单例模式

单例设计模式 应用场景特点设计模式分类懒汉设计模式饿汉设计模式使用编写的测试代码运行结果 应用场景 当多个类都需要调用某一个类的一些公共接口&#xff0c;同时不想创建多个该类的对象&#xff0c;可以考虑将该类封装为一个单例模式。 特点 单例模式的特点&#xff1a;…

python -opencv 边缘检测

python -opencv 边缘检测 边缘检测步骤: 第一步&#xff1a;读取图像为灰度图 第二步&#xff1a;进行二值化处理 第三步&#xff1a;使用cv2.findContours对二值化图像提取轮廓 第三步&#xff1a;将轮廓绘制到图中 代码如下&#xff1a; from ctypes.wintypes import SIZ…

基于Vue+SpringBoot的医院门诊预约挂号系统 开源项目

项目编号&#xff1a; S 033 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S033&#xff0c;文末获取源码。} 项目编号&#xff1a;S033&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

使用cli批量下载GitHub仓库中所有的release

文章目录 1\. 引言2\. 工具官网3\. 官方教程4\. 测试用的网址5\. 安装5.1. 使用winget安装5.2. 查看gh是否安装成功了 6\. 使用6.1. 进行GitHub授权6.1.1. 授权6.1.2. 授权成功6.2 查看指定仓库中的所有版本的release6.2.1. 默认的30个版本6.2.2. 自定义的100个版本6.3 下载特定…

华为数通HCIP 821BGP 知识点整理

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

《数据:挖掘价值,洞察未来

大数据&#xff1a;挖掘价值&#xff0c;洞察未来 我们正身处一个数据驱动的时代&#xff0c;大数据已经成为企业和个人决策的重要依据。本文将深入探讨大数据的魅力&#xff0c;挖掘其价值&#xff0c;并洞察未来发展趋势&#xff0c;让我们一起领略大数据的无穷奥秘。 一、大…

js-WebApi笔记之BOM

目录 window对象 定时器-延迟函数 location对象 navigator对象 histroy对象 本地存储 localStorage sessionStorage localStorage 存储复杂数据类型 window对象 BOM (Browser Object Model ) 是浏览器对象模型 window对象是一个全局对象&#xff0c;也可以说是JavaScr…

Redis字典实现

前言 字典又称符号表&#xff0c;关联数组或者映射(map)。是一种保存键值对的抽象数据结构。在字典中一个键和一个值进行关联。这些关联的值被称为键值对。 字典中每一个键都是独一无二的&#xff0c;没有重复的。我们可以通过键来查找值&#xff0c;更新值或者删除整个键值对等…

svn问题集

被锁定&#xff0c;无法拉取提交 解决方法

基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码

基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工水母优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

[OpenAirInterface-01]什么是OAI?OAI在github中源代码的存放结构

文章目录 前言&#xff1a;什么是软件无线电SDR第1章 什么是OAI&#xff08;OpenAirInterface&#xff09;1.1 来自官网的概述1.2 来自github的概述1.3 来自我的解读 第2章 什么是OSA2.1 OSA概述&#xff1a;2.2 OSA联盟职责2.3 OpenAirInterface github成员的角色 第3章 常见的…