QT基础 - QMainWindow主窗口

news2025/7/13 22:54:37

目录

零. 简介

一. 菜单栏

二. 工具栏

三. 状态栏

四. 可停靠区域

五. 总结


零. 简介

QMainWindow 是 Qt 中用于构建主窗口的类。

它通常包含以下几个主要部分:

  • 菜单栏:用于提供各种操作选项。
  • 工具栏:放置常用的操作按钮。
  • 中心区域:用于显示主要的内容或控件。
  • 状态栏:用于显示一些状态信息。

QMainWindow 为应用程序提供了一个标准的、功能丰富的主界面框架,方便开发者组织和管理窗口中的各种元素。它可以方便地进行布局管理,添加各种控件和功能组件,以满足不同应用程序的需求。开发者可以通过代码灵活地定制 QMainWindow 的各个部分,实现个性化的用户界面设计和功能实现。例如,可以动态添加或移除菜单项、工具栏按钮,以及在中心区域显示不同的控件或窗口。

一. 菜单栏

QMainWindow的菜单栏是位于主窗口顶部的一个菜单条,其中包含了多个菜单,每个菜单又可以包含多个菜单项。以下是关于QMainWindow菜单栏的详细介绍:

  • 菜单栏的创建:通过调用QMainWindow类的menuBar()函数可以获取主窗口的菜单栏指针。然后,可以使用QMenu类的addMenu()函数添加菜单。
  • 菜单的添加:使用QMenu类的addAction()函数可以向菜单中添加菜单项。QAction类用于表示菜单项或工具栏按钮的动作,可以设置动作的文本、图标、快捷键等属性。
  • 菜单项的点击响应:当用户点击菜单项时,会触发相应的信号。可以通过连接信号和槽函数来处理菜单项的点击事件。
  • 菜单栏的布局:菜单栏的布局可以通过设置菜单的位置和顺序来调整。可以使用QMenu类的insertMenu()函数在指定位置插入菜单,或者使用removeMenu()函数移除菜单。
  • 多级菜单:可以创建多级菜单,即在一个菜单下再添加子菜单,形成层次结构。
  • 快捷键和助记符:可以为菜单项设置快捷键和助记符,方便用户通过键盘操作。
  • 动态菜单:可以根据程序的运行状态动态地添加、修改或删除菜单项。
  • 样式设置:可以通过设置菜单栏和菜单项的样式来美化界面。

通过合理使用菜单栏,可以提供方便的用户操作入口,增强应用程序的功能和易用性。开发者可以根据具体需求创建各种菜单和菜单项,并通过信号与槽机制实现相应的功能。

属性

  • 通常没有特别突出的特定属性。

方法

  • addMenu(QString menuTitle):添加一个新的菜单。
  • addAction(QAction* action):向菜单中添加一个动作。

示例

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

class MyMainWindow : public QMainWindow {
public:
    MyMainWindow() {
        QMenuBar *menuBar = this->menuBar();

        // 文件菜单
        QMenu *fileMenu = new QMenu("文件", this);
        menuBar->addMenu(fileMenu);

        QAction *newFileAction = new QAction("新建文件", this);
        fileMenu->addAction(newFileAction);

        QAction *openFileAction = new QAction("打开文件", this);
        fileMenu->addAction(openFileAction);

        // 编辑菜单
        QMenu *editMenu = new QMenu("编辑", this);
        menuBar->addMenu(editMenu);

        QAction *cutAction = new QAction("剪切", this);
        editMenu->addAction(cutAction);

        QAction *copyAction = new QAction("复制", this);
        editMenu->addAction(copyAction);

        QAction *pasteAction = new QAction("粘贴", this);
        editMenu->addAction(pasteAction);

        // 视图菜单
        QMenu *viewMenu = new QMenu("视图", this);
        menuBar->addMenu(viewMenu);

        QAction *zoomInAction = new QAction("放大", this);
        viewMenu->addAction(zoomInAction);

        QAction *zoomOutAction = new QAction("缩小", this);
        viewMenu->addAction(zoomOutAction);

        // 连接一些信号与槽
        connect(newFileAction, &QAction::triggered, this, [this]() {
            qDebug() << "点击了新建文件";
        });

        connect(openFileAction, &QAction::triggered, this, [this]() {
            qDebug() << "点击了打开文件";
        });

        connect(cutAction, &QAction::triggered, this, [this]() {
            qDebug() << "点击了剪切";
        });

        connect(copyAction, &QAction::triggered, this, [this]() {
            qDebug() << "点击了复制";
        });

        connect(pasteAction, &QAction::triggered, this, [this]() {
            qDebug() << "点击了粘贴";
        });

        connect(zoomInAction, &QAction::triggered, this, [this]() {
            qDebug() << "点击了放大";
        });

        connect(zoomOutAction, &QAction::triggered, this, [this]() {
            qDebug() << "点击了缩小";
        });
    }
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    MyMainWindow w;
    w.show();
    return a.exec();
}

效果图

二. 工具栏

工具栏是Qt中用于提供快速访问常用操作的界面组件。它通常位于菜单栏下方或窗口的其他位置,可以包含各种按钮、图标和其他控件。

属性

  • orientation:工具栏的方向,可以是水平或垂直。
  • iconSize:工具栏上图标的大小。
  • movable:工具栏是否可移动。
  • Floatable:工具栏是否可浮动。

方法

  • addAction(QAction*):向工具栏添加一个动作。
  • insertAction(QAction*, QAction*):在指定的动作之前插入一个新的动作。
  • removeAction(QAction*):从工具栏中移除一个动作。
  • setOrientation(Qt::Orientation):设置工具栏的方向。
  • setIconSize(QSize):设置工具栏上图标的大小。

示例:

#include <QApplication>
#include <QMainWindow>
#include <QToolBar>
#include <QAction>

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

    QMainWindow w;

    // 创建工具栏
    QToolBar *toolBar = new QToolBar(&w);

    // 创建动作
    QAction *action1 = new QAction("Action 1", &w);
    QAction *action2 = new QAction("Action 2", &w);

    // 将动作添加到工具栏
    toolBar->addAction(action1);
    toolBar->addAction(action2);

    // 设置工具栏的位置
    w.addToolBar(Qt::TopToolBarArea, toolBar);

    w.show();

    return a.exec();
}

效果图:

三. 状态栏

Qt 中的状态栏是用于显示应用程序状态信息的区域,通常位于主窗口的底部。

它可以显示各种类型的信息,如实时消息、永久消息和进度条等。

常用属性

  • message():获取当前状态栏显示的消息。
  • isVisible():判断状态栏是否可见。
  • sizeGripEnabled():状态栏右下角的尺寸控制点是否可用。

常用方法

  • showMessage(QString message, int timeout = 0):在状态栏中显示指定的消息,timeout参数表示消息显示的时间(毫秒),默认为 0 表示一直显示。
  • clearMessage():清除状态栏中的消息。
  • addWidget(QWidget * widget, int stretch = 0):向状态栏中添加一个控件,stretch参数表示控件的伸缩比例。
  • removeWidget(QWidget * widget):从状态栏中移除一个控件。

代码示例

#include <QApplication>
#include <QMainWindow>
#include <QStatusBar>
#include <QLabel>

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

    QMainWindow w;

    QStatusBar *statusBar = new QStatusBar(&w);
    w.setStatusBar(statusBar);

    // 添加一个文本消息
    statusBar->showMessage("这是状态栏的消息");

    // 添加一个标签到状态栏
    QLabel *label = new QLabel("自定义信息");
    statusBar->addWidget(label);

    w.show();

    return a.exec();
}

效果图:

四. 可停靠区域

可停靠区域(QDockWidget)是 Qt 中的一个窗口部件,用于创建可停靠的窗口,通常用于构建多文档接口(MDI)或可定制的用户界面。QDockWidget 允许用户将窗口停靠在应用程序的主窗口周围,或将其拖动到独立的浮动窗口中。

以下是有关 QDockWidget 的详细介绍和使用方法:

QDockWidget 的主要特点

  • 停靠功能:QDockWidget 允许用户将窗口部件停靠在主窗口的各个位置,如左侧、右侧、上方或下方;
  • 浮动窗口:用户还可以将 QDockWidget 拖动到独立的浮动窗口中;
  • 可关闭:QDockWidget 可以关闭,允许用户根据需要隐藏或显示它;
  • 自定义部件:可以将自定义的部件放在 QDockWidget 中,以构建自定义的界面元素。

常用函数介绍

  • setWidget:设置停靠窗口中的部件;
  • setAllowedAreas:设置允许停靠的区域;
  • setFeatures:设置停靠窗口的功能特性,如关闭按钮、可浮动等;
  • setWindowTitle:设置停靠窗口的标题;
  • setVisible:设置停靠窗口的可见性;
  • isFloating:检查停靠窗口是否在浮动状态;
  • close:关闭停靠窗口;
  • toggleViewAction:获取一个 QAction 对象,用于在工具栏中切换停靠窗口的可见性;
  • topLevelChanged信号:在停靠窗口的浮动状态发生变化时触发

示例:

#include <QApplication>
#include <QMainWindow>
#include <QDockWidget>
#include <QPushButton>

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

    QMainWindow mainWindow;

    QDockWidget *dockWidget1 = new QDockWidget("Dock 1", &mainWindow);
    QPushButton *button1 = new QPushButton("Button in Dock 1");
    dockWidget1->setWidget(button1);
    mainWindow.addDockWidget(Qt::LeftDockWidgetArea, dockWidget1);

    QDockWidget *dockWidget2 = new QDockWidget("Dock 2", &mainWindow);
    QPushButton *button2 = new QPushButton("Button in Dock 2");
    dockWidget2->setWidget(button2);
    mainWindow.addDockWidget(Qt::RightDockWidgetArea, dockWidget2);

    mainWindow.show();

    return a.exec();
}

效果图:

五. 总结

菜单栏

  • 提供了应用程序的主要功能选项,以层次化的菜单结构呈现。
  • 方便用户快速访问各种操作和功能。

工具栏

  • 包含常用操作的快捷按钮,提供了一种直观、快速的交互方式。
  • 可以根据需要定制和排列各种工具按钮。

状态栏

  • 用于显示应用程序的状态信息,如提示消息、当前状态等。
  • 可以动态更新显示的内容。

可停靠区域

  • 允许创建可停靠的窗口部件,可灵活放置在主窗口的不同位置或变为浮动窗口。
  • 增强了界面布局的灵活性和可定制性,方便用户根据需求调整。

总的来说,这几个组件共同构成了 Qt 应用程序丰富多样的用户界面,使得用户交互更加便捷、高效和个性化。它们相互配合,为用户提供了良好的操作体验和功能展示。

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

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

相关文章

DAMA学习笔记(二)-数据治理

1.引言 数据治理&#xff08;Data Governance&#xff0c;DG&#xff09;的定义是在管理数据资产过程中行使权力和管控&#xff0c;包括计划、监控和实施。在所有组织中&#xff0c;无论是否有正式的数据治理职能&#xff0c;都需要对数据进行决策。建立了正式的数据治理规程及…

【STM32-ST-Link】

STM32-ST-Link ■ ST-Link简介■ ST-Link驱动的安装。■ ST-Link编程软件(MDK)配置。■ ST-Link固件升级方法 ■ ST-Link简介 由于德产 J-LINK 价格非常昂贵&#xff0c; 而国产 J-LINK 因为版权问题将在万能的淘宝销声匿迹。 所以我们有必要给大家介绍 JTAG/SWD 调试工具中另…

排序算法及源代码

堆排序&#xff1a; 在学习堆之后我们知道了大堆和小堆&#xff0c;对于大堆而言第一个节点就是对大值&#xff0c;对于小堆而言&#xff0c;第一个值就是最小的值。如果我们把第一个值与最后一个值交换再对最后一个值前面的数据重新建堆&#xff0c;如此下去就可以实现建堆排…

【Java】已解决java.util.concurrent.TimeoutException异常

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.util.concurrent.TimeoutException异常 一、问题背景 java.util.concurrent.TimeoutException是Java并发编程中常见的一个异常&#xff0c;它通常发生在使用Future或Future…

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会,爱慕向来短暂,失去才是唯一出路

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会&#xff0c;爱慕向来短暂&#xff0c;失去才是唯一出路 摘录 《把你写进诗歌里&#xff08;2020年度中国优秀诗歌&#xff09;》&#xff0c;作者上官文露。并不惊艳&#xff0c;中英文双语对照的一本诗集&…

OpenGL3.3_C++_Windows(13)

demo演示 demo演示 面剔除 当我们都以逆时针绘制三角形顶点&#xff0c;那么从三角形的背面看就是顺时针&#xff0c;面剔除正是根据这个原理&#xff0c;glEnable&#xff08;&#xff09;首先启用&#xff0c;glCullFace&#xff08;&#xff09;改变需要剔除的面类型&#…

【Java面试】二十一、JVM篇(中):垃圾回收相关

文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程&#xff08;类的生命周期&#xff09;3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full…

初阶 《数组》 1. 一维数组的创建和初始化

1. 一维数组的创建和初始化 1.1 数组的创建 数组是一组相同类型元素的集合 数组的创建方式&#xff1a; type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式&#xff0c;用来指定数组的大小数组创建的实例&#xff1a; //代码1 int ar…

计算机图形学入门16:曲线

1.曲线 曲线&#xff08;Curves&#xff09;在图形学中应用非常广泛&#xff0c;比如&#xff1a;相机的拍摄路径、物体的移动路径、动画曲线、矢量字体等。如下图所示&#xff0c;是使用曲线到矢量字体的应用&#xff0c;通过移动一些控制点来改变字体。 2.贝塞尔曲线 2.1 贝…

qt事件和连接TCP协议

QT网络聊天室服务器实现 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this))//给服务器指针实例化一个空间 {ui->setupUi(this); }Widget::~Widget() {d…

Git进阶使用(图文详解)

文章目录 Git概述Git基础指令Git进阶使用一、Git分支1.主干分支2.其他分支2.1创建分支2.2查看分支1. 查看本地分支2. 查看远程分支3. 查看本地和远程分支4. 显示分支的详细信息5. 查看已合并和未合并的分支 2.3切换分支1. 切换到已有的本地分支2. 创建并切换到新分支3. 切换到远…

MyPostMan:按照项目管理接口,基于迭代生成接口文档、执行接口自动化联合测试

MyPostMan 是一款类似 PostMan 的接口请求软件&#xff0c;不同于 PostMan 的是&#xff0c;它按照 项目&#xff08;微服务&#xff09;、目录来管理我们的接口&#xff0c;基于迭代来管理我们的接口文档&#xff0c;按照迭代编写自动化测试用例&#xff0c;在不同环境中均可运…

ASP.NET MVC企业级程序设计(增删,页面水平排列,字符串拼接,非空,添加框内默认提示)

目录 题目&#xff1a; 实现过程 控制器代码 DAL BLL Index Deile 题目&#xff1a; 实现过程 控制器代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using MvcApplication1.Models;namespac…

oracle中执行select ... for update需要什么权限?

oracle中执行select … for update需要什么权限&#xff1f; 问题 在oracle中&#xff0c;一个用户执行select … for update需要什么权限&#xff1f; 分析测试 用户1&#xff1a; test_0614 用户2&#xff1a;test 目标表&#xff1a;test.t_0614 执行语句&#xff1a;se…

机器学习课程复习

参考书目:《统计学习方法》 选择题 5道 3分/道 填空题 5道 3分/道 简答题 3道 计算题 1道 算法设计题 1道 隐马尔可夫不考计算题 很有可能考计算题的知识点:KNN、决策树、支持向量机、聚类算法 小概率会考计算题的知识点:线性回归(最小二乘法,代公式算参…

代码随想录——全排列(Leetcode LCR083)

题目链接 回溯 class Solution {List<List<Integer>> res new ArrayList<List<Integer>>();List<Integer> list new ArrayList<Integer>();boolean[] used;public List<List<Integer>> permute(int[] nums) {used new bo…

密码学及其应用——为什么选择接近的质数因子对RSA加密算法不安全?

RSA加密算法是一种广泛使用的非对称加密算法&#xff0c;它的安全性依赖于大整数分解的难度。具体来说&#xff0c;RSA算法生成的公钥包含一个大整数N&#xff0c;这是两个大质数p和q的乘积。然而&#xff0c;如果这两个质数p和q太接近&#xff0c;则可以相对容易地对N进行因式…

【Python机器学习实战】 | Lasso回归和弹性网回归详细分析研究

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

【STM32】矩阵计算器

【STM32】矩阵计算器 资料链接请在文章末尾获取~ 1.说明 使用元器件&#xff1a;stm32f103c8t6最小系统板x1&#xff0c;0.96寸OLED显示屏四角x1&#xff0c;4x4矩阵按键x1; 参考&#xff1a;正点原子有关4脚OLED驱动float型数据的驱动文件&#xff0c;CSDN有关矩阵横向扫描…

网络安全:入侵检测系统的原理与应用

文章目录 网络安全&#xff1a;入侵检测系统的原理与应用引言入侵检测系统简介IDS的工作原理IDS的重要性结语 网络安全&#xff1a;入侵检测系统的原理与应用 引言 在我们的网络安全系列文章中&#xff0c;我们已经涵盖了从SQL注入到端点保护的多个主题。本篇文章将探讨入侵检…