当前位置: 首页 > news >正文

QMainWindow

文章目录

  • QMainWindow
    • 基本元素
    • QMainWindow函数介绍
    • 简单的示例
    • 效果图

QMainWindow

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

在这里插入图片描述

基本元素

  1. 菜单栏

菜单是一系列命令的列表。为了实现菜单、工具栏按钮、键盘快捷方式等命令 的一致性,Qt使用动作(Action)来表示这些命令。Qt的菜单就是由一系列的QAction 动作对象构成的列表,而菜单栏则是包容菜单的面板,它位于主窗口顶部、主窗口 标题栏的下面。一个主窗口最多只有一个菜单栏。

  1. 状态栏

状态栏通常显示GUI应用程序的一些状态信息,它位于主窗口的最底部。用户可以在状态栏上添加、使用Qt窗口部件。一个主窗口最多只有一个状态栏。

  1. 工具栏

工具栏是由一系列的类似于按钮的动作排列而成的面板,它通常由一些经常使 用的命令(动作)组成。工具栏的位于在菜单栏的下面、状态栏的上面,可以停靠 在主窗口的上、下、左、右四个方向上。一个主窗口可以包含多个工具栏。

  1. DockWidget

DockWidget作为一个容器使用,以包容其他窗口部件来实现某些功能。例如,Qt 设计器的属性编辑器、对象监视器等都是由DockWidget包容其他的Qt窗口部件来实 现的。它位于工具栏区的内部,可以作为一个窗口自由地浮动在主窗口上面,也可 以像工具栏一样停靠在主窗口的上、下、左、右四个方向上,一个主窗口可以包含 多个DockWidget。

  1. 中心部件

中心部件处在锚接部件区的内部、主窗口的中心,一个主窗口只有一个中心部件。 於注意 :主窗口 QMain Window具有自己的布局管理器,因此在QMainWindow 窗口上设置布局管理器或者创建一个父窗口部件作为QMainWindow的布局管理 器都是不允许的。但可以在主窗口的中心部件上设置管理器。

为了控制主窗口工具栏和锚接部件的显隐,在默认情况下,QMainWindow主 窗口提供了一个上下文菜单(Context Menu)。通常,通过在工具栏或锚接部件上 单击鼠标右键就可以激活该上下文菜单,也可以通过函数QMainWindow:: createPopupMenu()激活该菜单。此外,还可以重写 QMainWindow::createPopupMenu() 函数,实现自定义的上下文菜单。

QMainWindow函数介绍

QMainWindow官方文档提供了如下函数(基于5.15.2版本):

QMainWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
//构造函数 QMainWindow本身设置Qt::Window标志,因此总是作为顶层小部件创建。
virtual ~QMainWindow();
// 析构函数
void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget);
// 将给定的dockwidget添加到指定区域。
void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar);
// 将工具栏添加到此主窗口的指定区域中。工具栏位于当前工具栏块(即行)的末尾。如果主窗口已经管理工具栏,那么它只会将工具栏移动到区域。
void addToolBar(QToolBar *toolbar);
// 这是一个重载函数 
QToolBar *addToolBar(const QString &title);
// 这是一个重载函数  
void addToolBarBreak(Qt::ToolBarArea area = Qt::TopToolBarArea);
// 在所有其他对象之后的给定区域中添加工具栏分隔符。    
QWidget *QMainWindow::centralWidget() const;
// 返回主窗口的中心小部件。如果没有设置中心小部件,该函数返回零。    
Qt::DockWidgetArea QMainWindow::dockWidgetArea(QDockWidget *dockwidget) const;
// 为dockwidget返回Qt::DockWidgetArea。如果dockwidget没有被添加到主窗口,这个函数返回Qt::NoDockWidgetArea。
bool QMainWindow::event(QEvent *event);
// 重载的虚函数
void QMainWindow::insertToolBar(QToolBar *before, QToolBar *toolbar);
// 将工具栏插入到前面工具栏所占用的区域中,使其显示在前面。例如,在正常的从左到右布局操作中,这意味着在水平工具栏区域中,工具栏将出现在前面指定的工具栏的左侧。
void QMainWindow::insertToolBarBreak(QToolBar *before);
// 在before指定的工具栏之前插入工具栏中断符。
QMenuBar *QMainWindow::menuBar() const;
// 返回主窗口的菜单栏。如果菜单栏不存在,这个函数将创建并返回一个空的菜单栏。
QWidget *QMainWindow::menuWidget() const;
// 返回主窗口的菜单栏。如果还没有构建菜单栏,这个函数返回null。
void QMainWindow::removeDockWidget(QDockWidget *dockwidget);
// 从主窗口布局中删除dockwidget并隐藏它。注意,dockwidget没有被删除。
void QMainWindow::removeToolBar(QToolBar *toolbar);
// 从主窗口布局中删除工具栏并隐藏它。注意,工具栏没有被删除。
void QMainWindow::removeToolBarBreak(QToolBar *before);
// 删除先前插入的工具栏分隔符,该分隔符位于before指定的工具栏之前。
void QMainWindow::resizeDocks(const QList<QDockWidget *> &docks, const QList<int> &sizes, Qt::Orientation orientation);
// 将列表底座中的底座小部件调整为列表大小的相应像素大小。如果方向为Qt::水平,则调整宽度,否则调整dock小部件的高度。
bool QMainWindow::restoreDockWidget(QDockWidget *dockwidget);
// 如果dockwidget是在调用restoreState()之后创建的,则恢复它的状态。如果状态被恢复,则返回true;否则返回false。
bool QMainWindow::restoreState(const QByteArray &state, int version = 0);
// 恢复主窗口的工具栏和dockwidgets的状态。
QByteArray QMainWindow::saveState(int version = 0) const;
// 保存主窗口工具栏和dockwidgets的当前状态。
void QMainWindow::setCentralWidget(QWidget *widget);
// 将给定的小部件设置为主窗口的中心小部件。
void QMainWindow::setCorner(Qt::Corner corner, Qt::DockWidgetArea area);
// 将给定的dock小部件区域设置为占用指定的角落。
void QMainWindow::setMenuBar(QMenuBar *menuBar);
// 将主窗口的菜单栏设置为menuBar。
void QMainWindow::setMenuWidget(QWidget *menuBar);
// 将主窗口的菜单栏设置为menuBar。
void QMainWindow::setStatusBar(QStatusBar *statusbar);
// 将主窗口的状态栏栏设置为statusbar。
void QMainWindow::setTabPosition(Qt::DockWidgetAreas areas, QTabWidget::TabPosition tabPosition);
// 将给定dock小部件区域的选项卡位置设置为指定的tabPosition。
void QMainWindow::splitDockWidget(QDockWidget *first, QDockWidget *second, Qt::Orientation orientation);
// 将第一个DockWidget所覆盖的空间分割为两个部分,将第一个DockWidget移动到第一个部分,并将第二个DockWidget移动到第二个部分。
QStatusBar *QMainWindow::statusBar() const;
// 返回主窗口的状态栏。如果状态栏不存在,这个函数将创建并返回一个空的状态栏。
QTabWidget::TabPosition QMainWindow::tabPosition(Qt::DockWidgetArea area) const;
// 返回QTabWidget位置
QList<QDockWidget *> QMainWindow::tabifiedDockWidgets(QDockWidget *dockwidget) const
// 返回与dockwidget一起被归档的dock小部件。
void QMainWindow::tabifyDockWidget(QDockWidget *first, QDockWidget *second);
// 将第二个停靠部件移动到第一个停靠部件的顶部,在主窗口中创建一个选项卡停靠区域。
QWidget *QMainWindow::takeCentralWidget();
// 从这个主窗口中删除中心小部件。被删除的小部件的所有权被传递给调用者。
Qt::ToolBarArea QMainWindow::toolBarArea(QToolBar *toolbar) const;
// 为工具栏返回Qt::ToolBarArea。如果工具栏没有被添加到主窗口,这个函数返回Qt::NoToolBarArea。
bool QMainWindow::toolBarBreak(QToolBar *toolbar) const;
// 返回工具栏之前是否有工具栏中断。

简单的示例

接下来我们使用一个简单的例子来介绍QMainWindow的使用。

例子是打开一个文本文件,将文件内容显示在界面上,修改了之后再存回文件。

**main.cpp **

#include <QApplication>
#include "mainwindow.h"int main(int argc, char **argv)
{QApplication app(argc, argv);MainWindow mm;mm.show();return app.exec();
}

接下来我们来创建一个mainwindow类

相关代码介绍都在注释中。

mainwindow.h

#ifndef ALGOTEST_MAINWINDOW_H
#define ALGOTEST_MAINWINDOW_H
#include <QMainWindow>
class QPlainTextEdit;
class MainWindow : public QMainWindow
{Q_OBJECT
public:explicit MainWindow(QWidget *parent = 0);~MainWindow() override;protected:void initUi();void settings();void createActions();void createMenus();void createTools();protected slots:void openFile();void saveFile();private:QAction*            open_file_action_;QAction*            save_file_action_;QMenu*              open_file_menu_;QMenuBar*           menu_bar_;QStatusBar*         status_bar_;QToolBar*           tool_bar_;QPlainTextEdit*     edit_;QString             current_path_;
};
#endif //ALGOTEST_MAINWINDOW_H

**mainwindow.cpp **

#include "mainwindow.h"
#include <QToolBar>
#include <QMenuBar>
#include <QStatusBar>
#include <QMenu>
#include <QAction>
#include <QFileDialog>
#include <QPlainTextEdit>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{initUi();settings();
}
MainWindow::~MainWindow()
{}
/*** 菜单与工具栏都与QAction类密切相关,工具栏上的功能按钮与菜单中的选项 条目相对应,* 完成相同的功能,使用相同的快捷键与图标。QAction类为用户提供 了一个统一的命令接口,* 无论是从菜单触发还是从工具栏触发,或通过快捷键触发 都调用同样的操作接口,以达到同样的目的。*/
void MainWindow::initUi()
{tool_bar_ = new QToolBar(this);status_bar_ = new QStatusBar(this);menu_bar_ = new QMenuBar(this);setMenuBar(menu_bar_);setStatusBar(status_bar_);addToolBar(tool_bar_);createActions();createMenus();createTools();status_bar_->showMessage("create success!");// 给界面添加一个文本编辑器edit_ = new QPlainTextEdit(this);setCentralWidget(edit_);resize(1366, 768);
}
// connect 信号槽
void MainWindow::settings()
{connect(open_file_action_, &QAction::triggered, this, &MainWindow::openFile);connect(save_file_action_, &QAction::triggered, this, &MainWindow::saveFile);
}void MainWindow::createActions()
{open_file_action_ = new QAction(tr("打开文件"), this);save_file_action_ = new QAction(tr("保存文件"), this);
}
/*** 菜单(Menus )的实现* 在实现了各个动作之后,需要将它们通过菜单、工具栏或快捷键的方式体现出 来,以下是菜单的实现函数createMenus()代码:*/
void MainWindow::createMenus()
{open_file_menu_ = new QMenu(tr("文件"), this);open_file_menu_->addAction(open_file_action_);open_file_menu_->addAction(save_file_action_);menu_bar_->addMenu(open_file_menu_);
}
/*** 工具栏(ToolBars )的实现* 接下来实现相对应的工具栏createTools(),主窗口的工具栏上可以有多个工 具条,通常釆用一个菜单对应一个工具条的方式,也可根据需要进行工具条的划分。*/
void MainWindow::createTools()
{tool_bar_->addAction(open_file_action_);tool_bar_->addAction(save_file_action_);
}
// 打开文件槽函数
void MainWindow::openFile()
{edit_->clear();current_path_.clear();QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), "", "*.txt");if(fileName.isEmpty()){return;}current_path_ = fileName;QFile file(fileName);file.open(QIODevice::ReadOnly);edit_->insertPlainText(QString(file.readAll()));file.close();status_bar_->showMessage("打开成功");
}
// 打开文件槽函数
void MainWindow::saveFile()
{if(current_path_.isEmpty()){return;}QFile file(current_path_);file.open(QIODevice::WriteOnly);QString str = edit_->toPlainText();file.write(str.toLocal8Bit());file.close();status_bar_->showMessage("保存成功");
}

效果图

在这里插入图片描述

相关文章:

QMainWindow

文章目录 QMainWindow基本元素QMainWindow函数介绍简单的示例效果图 QMainWindow QMainWindow是一个为用户提供主窗口程序 的类&#xff0c;包含一个菜单栏(menu bar)、多个工具栏 (tool bars)、多个锚接部件(dock widgets)、―个 状态栏(status bar )及一个中心部件(central …...

PV操作解决经典进程同步问题

一.经典同步问题 在学习《操作系统》时&#xff0c;会接触到进程的概念&#xff0c;其中不可避免的接触到进程同步问题&#xff0c;今天我们用熟悉的PV操作解决一些经典的进程同步问题。 二.生产者-消费者问题 1.问题描述 问题描述&#xff1a;一组生产者进程和一组消费者进…...

一文3000字从0到1使用Selenium进行自动化测试

对于很多刚入门的测试新手来说&#xff0c;大家都将自动化测试作为自己职业发展的一个主要阶段。可是&#xff0c;在成为一名合格的自动化测试工程师之前&#xff0c;我们不仅要掌握相应的理论知识&#xff0c;还要进行大量的实践&#xff0c;积累足够的经验&#xff0c;以便快…...

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v9.0版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、标准Java平台&#xff0c;服务端基于Netty编写。 工程开源地址是&am…...

交叉编译----宿主机x86 ubuntu 64位-目标机ARMv8 aarch64

1.交叉编译是什么&#xff0c;为什么要交叉编译 编译&#xff1a;在一个平台上生成在该平台上的可执行代码交叉编译&#xff1a;在一个平台上生成在另一个平台上的可执行代码交叉编译的例子&#xff1a;如51单片机的可执行代码&#xff08;hex文件&#xff09;是在集成环境kei…...

安防监控视频汇聚平台EasyCVR修改录像计划等待时间较长是什么原因?

安防监控视频EasyCVR视频融合汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检…...

深度学习调参指南

1. 选择合适的模型架构 模型的结构(层数和宽度)&#xff0c;参数配置&#xff0c;尽量用已经有效的模型 2. 选择优化器 针对具体的问题&#xff0c;从选择常用的优化器开始&#xff0c;进行比较 3. 选择BatchSize 1). Batch Size决定训练速度&#xff0c;但是不影响验证集…...

MYSQL 优化常用方法

1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取&#xff0c;但是一般说来&#xff0c;数据库中的表越小&#xff0c;在它上面执行的查询也就会越快。因此&#xff0c;在创建表的时候&#xff0c;为了获得更好的性能&#xff0c;我们可以将表中字段的宽度设得尽可…...

isp调试工具环境搭建及其介绍!

一、isp调试环境搭建&#xff1a; 后期调试isp&#xff0c;是在rv1126提供的RKISP2.x Tuner工具上进行调试&#xff0c;所以我们大前提必须要把这个环境和一些操作先搞熟悉来&#xff0c;后面有一些专用术语&#xff0c;我们遇到了再去看&#xff0c;现在专门看一些专用术语&am…...

word显示书签并给书签添加颜色

CTRg 定位书签 在 Word 的用户界面中&#xff0c;没有直接的选项可以批量为所有书签设置颜色。但你可以使用 VBA 宏或者编写自定义的功能来实现这个需求。这里给出一个简单的 VBA 宏&#xff0c;它可以设置当前文档中所有书签内文本的颜色&#xff1a;vba Sub ColorAllBookmark…...

Rust系列(四) trait备忘录(持续更新)

上一篇&#xff1a;Rust系列(三) 类型系统与trait 基于官方文档进行简单学习记录&#xff0c;保证所有示例是可运行的基本单元。测试rust程序除了使用官方的playground之外&#xff0c;还可以通过定义[[example]]来运行程序。 文章目录 1. Deref2. DerefMut 1. Deref 用于不可…...

贪心算法总结及其leetcode题目N道

1 我为什么要写这个总结 1.1 字节笔试题 小明在玩一场通关游戏&#xff0c;初始血量为1&#xff0c;关卡有怪兽或者有血包&#xff08;正数就是血包可回血数&#xff0c;负数说明是怪兽的伤害值&#xff09;&#xff0c;当捡到血包时会加血量&#xff0c;碰到怪兽时会掉血&am…...

k8s的namespace一直处于terminating的解法

先试了强制替换&#xff0c;无法替换掉&#xff0c;强制删除&#xff0c;也删除不掉namespace [rootmaster k8s-study]# vi ns-demo.yaml [rootmaster k8s-study]# kubectl create -f ns-demo.yaml namespace/demo created [rootmaster k8s-study]# kubectl get -f ns-demo.ya…...

JAVA面试总结-Redis篇章(六)——数据过期策略

Java面试总结-Redis篇章&#xff08;六&#xff09;——数据过期策略 Redis数据删除策略——惰性删除Redis数据删除策略——定期删除 Redis数据删除策略——惰性删除 Redis数据删除策略——定期删除...

【LLM】大语言模型学习之LLAMA 2:Open Foundation and Fine-Tuned Chat Model

大语言模型学习之LLAMA 2:Open Foundation and Fine-Tuned Chat Model 快速了解预训练预训练模型评估微调有监督微调(SFT)人类反馈的强化学习(RLHF)RLHF结果局限性安全性预训练的安全性安全微调上手就干使用登记代码下载获取模型转换模型搭建Text-Generation-WebUI分发模型…...

Android是如何识别USB信号的

Android设备通过USB接口与外部设备通信时&#xff0c;会通过USB控制器&#xff08;USB Controller&#xff09;与USB设备进行通信。USB控制器是Android设备的一个硬件组件&#xff0c;它负责管理USB总线并控制所有USB设备的连接和通信。 当一个USB设备被插入Android设备的USB接…...

机器学习前言

1.机器学习和统计学关系 2.机器学习的发展 3.机器学习与深度学习的相同点与不同点 4.机器学习和深度学习优缺点 一、机器学习和统计学关系 机器学习和统计学密切相关&#xff0c;可以说机器学习是统计学在计算机科学和人工智能领域的应用。机器学习和统计学在方法论和技术上有…...

Java另一种debug方法(not remote jmv debug),类似python远程debug方式

这种Debug类似python的debug方式&#xff0c;是运行时将业务代码及依赖推送到Linux并使用Linux的java运行运行程。只要本地能运行&#xff0c;就能自动将代码推送到Linux运行&#xff0c;不需打包及设置远程debug jvm参数&#xff0c;适合一些项目Debug调试 运行时会推送一些依…...

【QT】Day4

1> 思维导图 2> 手动完成服务器的实现&#xff0c;并具体程序要注释清楚 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //…...

在CSDN学Golang云原生(Kubernetes Pod 有状态部署)

一&#xff0c;StatefulSet部署MongoDB集群 Kubernetes StatefulSet 是 Kubernetes 中的一种资源类型&#xff0c;它能够保证有状态服务&#xff08;Stateful Service&#xff09;的唯一性和顺序部署&#xff0c;适用于需要持久化存储、网络标识、状态管理等场景。MongoDB 是一…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...