QT基础教学(QMainWindow)

news2024/12/24 9:22:49

文章目录

  • 前言
  • 一、QMainWindow介绍
  • 二、代码示例
  • 三、QMainWindow高级用法
  • 总结


前言

之前我们都是在QWidget中来进行学习的,那么今天我将为大家讲解一下QMainWindow。

一、QMainWindow介绍

QMainWindow是Qt框架提供的一个重要的窗口类,用于创建具有标准应用程序布局的主窗口。它提供了一些常见的功能,如菜单栏、工具栏、状态栏和中央部件区域,可以方便地进行应用程序的组织和布局。下面是QMainWindow的一些特点和常用组件:

1.主窗口特点:

QMainWindow继承自QWidget,并提供了一个预定义的布局,将窗口分成了菜单栏、工具栏、状态栏和中央部件区域。
主窗口具有一个顶级窗口的外观,可以包含其他控件和布局。

2.菜单栏和菜单:

QMainWindow具有一个预定义的菜单栏(QMenuBar),可以用于创建应用程序的多级菜单结构。
可以使用QMenuBar的addMenu()方法添加菜单(QMenu)。
在QMenu中,可以添加菜单项(QAction)和子菜单(QMenu)。

3.工具栏:

QMainWindow可以包含一个或多个工具栏(QToolBar),用于放置常用操作的快捷按钮。
可以使用addToolBar()方法将工具栏添加到主窗口。
工具栏中的按钮可以绑定特定的操作,方便用户进行快速操作。

4.状态栏:

QMainWindow具有一个预定义的状态栏(QStatusBar),用于显示应用程序的状态信息。
可以使用statusBar()方法获取状态栏对象,并通过showMessage()方法显示文本消息。

5.中央部件区域:

QMainWindow的中央部件区域(central widget)是用来放置应用程序的主要内容的部分,可以包含其他的QWidget或自定义的QWidget派生类。
可以使用setCentralWidget()方法将中央部件设置为特定的QWidget。

QMainWindow提供了一个功能丰富的主窗口,方便创建具有标准布局的应用程序。它集成了菜单栏、工具栏、状态栏和中央部件区域,使得应用程序开发更加简单和高效。可以根据应用程序的需求,灵活地使用这些组件来设计和布局主窗口的界面。

在这里插入图片描述
在这里插入图片描述

二、代码示例

当我们使用Qt编写一个简单的QMainWindow示例时,以下是一个基本的代码示例:

#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <QStatusBar>
#include <QAction>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QMainWindow mainWindow;
    mainWindow.setWindowTitle("QMainWindow Example");

    // 创建菜单栏和菜单
    QMenuBar *menuBar = mainWindow.menuBar();
    QMenu *fileMenu = menuBar->addMenu("File");

    // 创建菜单项
    QAction *openAction = fileMenu->addAction("Open");
    QAction *saveAction = fileMenu->addAction("Save");

    // 创建工具栏
    QToolBar *toolBar = mainWindow.addToolBar("Toolbar");
    toolBar->addAction(openAction);
    toolBar->addAction(saveAction);

    // 创建状态栏
    QStatusBar *statusBar = mainWindow.statusBar();
    statusBar->showMessage("Ready");

    // 创建中央部件
    QWidget *centralWidget = new QWidget(&mainWindow);
    mainWindow.setCentralWidget(centralWidget);

    mainWindow.show();

    return app.exec();
}

运行结果:

在这里插入图片描述

三、QMainWindow高级用法

1.自定义工具栏:您可以通过在工具栏上添加自定义的QAction来自定义工具栏的外观和功能。例如,您可以添加自定义按钮、分隔符和其他控件,以及定义与它们相关联的操作。

2.Dock窗口:QMainWindow支持将QDockWidget添加到其中,以创建可停靠的子窗口。Dock窗口可以在主窗口的边缘停靠,可以折叠、隐藏和重新排列。这对于创建具有可自定义布局和容器的复杂界面非常有用。

3.多文档接口(MDI):如果您的应用程序需要支持多个文档界面,QMainWindow提供了QMdiArea和QMdiSubWindow来实现多文档接口。您可以在QMdiArea中创建和管理多个子窗口,每个子窗口可以显示不同的文档内容。

4.其他布局:除了中央部件,QMainWindow还支持在其他位置添加QWidget部件,例如左侧、右侧、顶部或底部布局。您可以使用QVBoxLayout、QHBoxLayout或其他布局管理器来管理这些部件的位置和大小。

5.快捷键和动作:QMainWindow允许您为菜单项、工具栏按钮和其他控件定义快捷键和操作。您可以通过设置QAction的快捷键和信号-槽连接来实现用户与应用程序的交互。

#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>
#include <QAction>
#include <QDockWidget>
#include <QMdiArea>
#include <QMdiSubWindow>
#include <QVBoxLayout>
#include <QLabel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QMainWindow mainWindow;
    mainWindow.setWindowTitle("QMainWindow Advanced Example");

    // 创建菜单栏和菜单
    QMenuBar *menuBar = mainWindow.menuBar();
    QMenu *fileMenu = menuBar->addMenu("File");

    QAction *openAction = fileMenu->addAction("Open");
    QAction *saveAction = fileMenu->addAction("Save");

    // 创建工具栏
    QToolBar *toolBar = mainWindow.addToolBar("Toolbar");
    toolBar->addAction(openAction);
    toolBar->addAction(saveAction);

    // 创建状态栏
    QStatusBar *statusBar = mainWindow.statusBar();
    statusBar->showMessage("Ready");

    // 创建中央部件
    QWidget *centralWidget = new QWidget(&mainWindow);
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);
    QLabel *label = new QLabel("Central Widget Content");
    layout->addWidget(label);

    mainWindow.setCentralWidget(centralWidget);

    // 创建Dock窗口
    QDockWidget *dockWidget = new QDockWidget("Dock Window", &mainWindow);
    dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
    QLabel *dockLabel = new QLabel("Dock Window Content");
    dockWidget->setWidget(dockLabel);
    mainWindow.addDockWidget(Qt::LeftDockWidgetArea, dockWidget);

    // 创建MDI区域和子窗口
    QMdiArea *mdiArea = new QMdiArea(&mainWindow);
    mainWindow.setCentralWidget(mdiArea);

    QMdiSubWindow *subWindow1 = new QMdiSubWindow;
    subWindow1->setWidget(new QLabel("MDI SubWindow 1"));
    mdiArea->addSubWindow(subWindow1);

    QMdiSubWindow *subWindow2 = new QMdiSubWindow;
    subWindow2->setWidget(new QLabel("MDI SubWindow 2"));
    mdiArea->addSubWindow(subWindow2);

    mainWindow.show();

    return app.exec();
}

1.创建Dock窗口:通过创建QDockWidget并将其添加到QMainWindow,我们创建了一个可停靠的子窗口,其中包含一个QLabel部件作为内容。

2.使用多文档接口(MDI):通过创建QMdiArea作为中央部件,并创建多个QMdiSubWindow,我们实现了多文档的界面。每个QMdiSubWindow包含一个QLabel作为内容。

运行效果:

在这里插入图片描述

总结

本篇文章就讲解到这里,下篇文章我将带大家继续学习QT。

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

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

相关文章

结构体的简单介绍(4)——位段

目录 位段的概念&#xff1a; 位段的内存分配&#xff1a; 问题1&#xff1a;当开辟了内存后&#xff0c;内存中每个比特位从右向左使用?还是从左向右使用? 这个不确定。 问题2&#xff1a;当前面时候&#xff0c;剩余的空间不足下一个成员使用的时候&#xff0c;剩余的空…

1.使用turtle换一个五环2.设计这样一个程序:输入一个数字 判断它是不是一个质数

1.使用turtle换一个五环 import turtle turtle.pensize(15) turtle.penup() turtle.color(blue) turtle.goto(-150,-35) turtle.pendown() turtle.circle(60) turtle.penup() turtle.color(black) turtle.goto(0,-35) turtle.pendown() turtle.circle(60) turtle.penup() turtl…

ffplay源码解析-PacketQueue队列

包队列架构位置 对应结构体源码 MyAVPacketList typedef struct MyAVPacketList {AVPacket pkt; //解封装后的数据struct MyAVPacketList *next; //下一个节点int serial; //播放序列 } MyAVPacketList;PacketQueue typedef struct PacketQueue {MyAVPacketList …

LeetCode题解-让所有学生保持开心的分组方法数

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 亲爱的各位友友们&#xff0c;今天来给大家讲解一道力扣中等题&…

为什么要有override

多态一定会成功吗 因为逻辑是用户编写的&#xff0c;那么肯定会有遗漏的地方&#xff0c;那就要规则来限制。就比如多态&#xff0c;都知道条件之一是子类重写了父类的虚函数&#xff0c;但是如果子类没有严格遵守这个规则&#xff0c;就无法达到目的。就比如这个代码&#xf…

华清 c++ day7 9月14

#include <iostream> using namespace std;template<typename T> class myVector { private:T* arr;size_t size; //元素数量size_t max_size; //数组容量 public://构造函数myVector() :arr(nullptr), size(0), max_size(0) {}myVector(int size){if (size >…

ts 枚举类型原理及其应用详解

ts 枚举类型介绍 TypeScript的枚举类型是一种特殊的数据类型&#xff0c;它允许开发者为一组相关值定义一个共同的名称&#xff0c;使我们可以更清晰、更一致地使用这些值。 枚举类型在TypeScript中用enum关键字定义&#xff0c;每个枚举值默认都是数字类型&#xff0c;从0开…

Cannot access defaults field of Properties

今天打包maven项目时报错&#xff1a; 解决方案&#xff1a;在pom.xml中加入&#xff1a; <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.1…

C#---第22:Newtonsoft中json/array的解析、创建、SelectToken(获取指定values)方法

1.解析json & array (1)json解析 using Newtonsoft.Json.Linq;string json "{CPU: Intel,Drives: [DVD read/writer,500 gigabyte hard drive]}";JObject o JObject.Parse(json);Console.WriteLine(o.GetType()); Console.WriteLine(o.ToString()); Console.…

Windows配置python(anaconda+vscode方案)的主要步骤及注意事项

Windows配置python&#xff08;anacondavscode方案&#xff09;的主要步骤及注意事项 1、准备工作 anaconda&#xff0c;官网下载&#xff08;直接下载最新版&#xff09;vscode&#xff0c;官网下载 (官网直接下载有可能太慢&#xff0c;可以考虑在国内靠谱的网站上下载&…

GIS跟踪监管系统单元信息更新

GIS跟踪监管系统单元信息更新 单元信息更新。① 新增单元。② 编辑单元。③ 删除单元。物资查询&#xff08;1&#xff09;物资查询与展示。① 几何查询。• 单击查询&#xff1a;• 拉框查询&#xff1a;• 多边形查询&#xff1a;② 物资定位。• 多个物资定位&#xff1a; 单…

Python爬虫实战案例——第五例

文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff01;严禁将文中内容用于任何商业与非法用途&#xff0c;由此产生的一切后果与作者无关。若有侵权&#xff0c;请联系删除。 目标&#xff1a;采集三国杀官网的精美壁纸 地址&#xff1a;aHR0cHM6Ly93d3…

普中51-独立按键实验

独立按键实验 通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时&#xff0c;电压信号 如下图所示&#xff1a; 由于机械点的弹性作用&#xff0c;按键开关在闭合时不会马上稳定的接通&#xff0c;在断开时 也不会一下子断开&#xff0c;因而在闭合和断开的瞬间均伴…

Windows11系统C盘用户文件夹下用户文件夹为中文,解决方案

说明&#xff1a; 1. 博主电脑为Windows11操作系统&#xff0c;亲测有效&#xff0c;修改后无任何影响&#xff0c;软件都可以正常运行&#xff01; 2. Windows10系统还不知道可不可行&#xff0c;因为Windows11的计算机管理中没有本地用户和组&#xff0c;博主在csdn上看到很…

华为云云耀云服务器L实例评测|redis漏洞回顾 MySQL数据安全解决 搭建主从集群MySQL 相关设置

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到过MySQL数据库被攻击的情况&#xff0c;数据丢失&#xff0c;还好我有几份备份&#xff0c;没有造成太大的损失&#xff1b;后来有发现Redis数据库被攻击的情况&#xff0c;加入了redis密…

R语言绘制热图

1、初步绘图 rm(listls())#clear Global Environment setwd(D:/Desktop/0000/code-main/热图)#设置工作路径#加载R包 library (pheatmap) #读取数据 df <- read.table(file"data.txt",sep"\t",row.names 1, headerT,check.namesFALSE) #查看前3行 hea…

STM32WB55开发(5)----调整射频功率

STM32WB55开发----5.调整射频功率 概述硬件准备视频教学样品申请选择芯片型号配置时钟源配置时钟树RTC时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙开启串口调试配置蓝牙参数设置工程信息工程文件设置Keil工程配置代码配置射频功率ACI_HAL_SET_TX_POW…

【微信小程序】外卖点餐效果展示

概述 外卖点餐效果展示&#xff0c;左右布局&#xff0c;快速点餐&#xff0c;商家信息展示等...程序是模仿人家的&#xff0c;所以界面没做什么调整&#xff0c;功能是没啥问题&#xff0c;可以正常使用... 详细 直接看效果图&#xff1a; 可以把这个点餐这个功能分为5部分…

docker总结

Docker实用篇 0.学习目标 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…

SkyWalking9.5.0安装与SpringBoot性能链路监控

文章目录 1、下载安装1.1、安装Elasticsearch存储1.2、安装SkyWalking服务器端 2、监控微服务2.1、监控Spring Boot微服务2.1、监控Spring Cloud Gateway网关 Skywalking是分布式系统的应用程序性能监视工具&#xff0c;专为微服务&#xff0c;云原生架构和基于容器&#xff08…