【Qt】QMainWidget中的栏和菜单

news2025/1/21 4:53:09

默认结构最复杂的标准窗口

  • 提供了菜单栏, 工具栏, 状态栏, 停靠窗口
  • 菜单栏: 只能有一个, 创建的最上方
  • 工具栏: 可以有多个, 默认提供了一个, 窗口的上下左右都可以停靠
  • 状态栏: 只能有一个, 窗口最下方
  • 停靠窗口: 可以有多个, 默认没有提供, 窗口的上下左右都可以停靠

在这里插入图片描述

菜单栏

在Qt中菜单栏类是QMenuBar,菜单栏是一个长条状窗口,可以是横向也可以是纵向的,菜单栏上可以布置菜单。

创建menubar

//方法一,获取QMainWindow提供的menubar
auto menu = menuBar();
//方法二,new一个menubar给窗口
QMenuBar* menubar = new QMenuBar;
this->setMenuBar(menubar);

添加menu

创建完菜单栏之后,就可以在菜单栏上面布置菜单,菜单类是QMenu。

auto filemenu=menu->addMenu("文件");
auto editmenu=menu->addMenu("编辑");
auto viewmenu = menu->addMenu("视图");

在这里插入图片描述

添加action和设置快捷键

以VS的界面为例,点击菜单下面会显示一堆菜单项,要实现这个就要给指定的菜单添加动作。Qt里面对应的类是QAction
在这里插入图片描述

auto filemenu=menu->addMenu("文件(&F)");//设置了快捷键alt+f
filemenu->addAction("关闭");
filemenu->addAction(QIcon(":/Resource/file_icon.png"),"新建");//给菜单项设置了图标
filemenu->addAction("保存", this,[]() {qDebug() << "保存"; });//添加动作的同时设置好槽
filemenu->addAction("打开", []()
	{
		qDebug() << "打开";
	}, QKeySequence("Ctrl+Shift+J"));

在这里插入图片描述

单击菜单项, 该对象会发出一个信号

// 点击QAction对象发出该信号
[signal] void QAction::triggered(bool checked = false);
auto action = viewMenu->addAction("显示行号");
action->setCheckable(true);
connect(action, &QAction::triggered, this, [](bool checked) {
			qDebug() << checked;
		});

在这里插入图片描述

工具栏

创建工具栏

QToolBar *toolbar =  addToolBar("toolbar");

添加action

//没有图标就显示文字 (如下图)
toolbar->addAction("工具");
//有图标就显示图标,文字作为提示(鼠标移上去会显示)
toolbar->addAction(style()->standardIcon(QStyle::StandardPixmap::SP_TitleBarMenuButton),"Qt");

在这里插入图片描述

添加Widget

可以给工具栏添加QWidget或者其子类,添加的最多的是QToolButton

auto toolbar2 = addToolBar("toolbar2");
QToolButton* btn = new QToolButton;
btn->setText("Debug");
btn->setIcon(style()->standardPixmap(QStyle::SP_ArrowLeft));
toolbar2->addWidget(btn);
//添加上toolbutton后要给按钮设置一下文本或图标,不然看不到
btn->setText("编译");
btn->setIcon(style()->standardPixmap(QStyle::SP_ArrowLeft));
//btn->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextBesideIcon);

在这里插入图片描述

VS的这个工具栏按钮点击后会弹出一个菜单,接下来用Qt实现这个效果。
在这里插入图片描述

//创建一个菜单
QMenu* menu = new QMenu;
menu->addAction("1.cpp");
menu->addAction("2.cpp");
menu->addAction("3.cpp");
menu->addAction("4.cpp");
//把菜单添加到toolButton
btn->setMenu(menu);
//设置菜单的弹出风格
btn->setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup);

在这里插入图片描述

状态栏

一般情况下, 需要在状态栏中添加某些控件, 显示某些属性, 使用最多的就是添加标签 QLabel

创建状态栏

//获取自带的
QStatusBar* sbar = statusBar();
//new一个
QStatusBar* sbar = new QStatusBar;
this->setStatusBar(statusbar);

添加Widget

//左边
sbar->addWidget(new QPushButton(style()->standardIcon(QStyle::StandardPixmap::SP_DesktopIcon), "desktop"));
sbar->addWidget(new QLabel("消息"));
//这里单独搞一个变量btn出来是因为后面要用
auto btn = new QPushButton("hello world");
//右边(Permanent永久的)
sbar->addPermanentWidget(btn);

在这里插入图片描述

接下来测试一下messageChanged这个信号和showMessage这个槽
在这里插入图片描述

connect(btn, &QPushButton::clicked, this, [=]{
	bar->showMessage("正在加载中...");
	QTimer::singleShot(2000, [=]{
		sbar->showMessage("就绪");
		QTimer::singleShot(2000, [=]{
			sbar->clearMessage();
		});
	});
});
connect(sbar, &QStatusBar::messageChanged, this, [](const QString&msg) {
			qDebug() << msg;
});	

在这里插入图片描述

浮动窗口

//添加中心窗口
setCentralWidget(new QTextEdit);

QDockWidget* gitDock = new QDockWidget("Git");
QDockWidget* solveDock = new QDockWidget("解决方案管理器");
QDockWidget* teamDock = new QDockWidget("团队资源管理器");
QDockWidget* resourceDock = new QDockWidget("资源视图");

addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, gitDock);
ddDockWidget(Qt::DockWidgetArea::BottomDockWidgetArea, solveDock);
addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, teamDock);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea, resourceDock);

在这里插入图片描述

分割浮动窗口

  • 将第一个浮动窗口所覆盖的空间分成两部分,将第一个浮动窗口移动到第一部分,并将第二个浮动窗口移动到第二部分。
splitDockWidget(teamDock, resourceDock, Qt::Vertical);

在这里插入图片描述

选项卡式停靠

  • 将第二个浮动窗口移动到第一个浮动窗口之上,在主窗口中创建一个选项卡式停靠区域。
tabifyDockWidget(gitDock, solveDock);

在这里插入图片描述

菜单

右键菜单

在桌面右击鼠标会出现菜单,那么在Qt中如何使用右键菜单?

  • 通过事件处理

    重写右键菜单弹出请求事件处理函数

void menu1() {
	m_contextMenu = new QMenu;
	QAction* copyAct =m_contextMenu->addAction("复");
	QAction* pasteAct =m_contextMenu->addAction("粘");
}
void contextMenuEven(QContextMenuEvent* event)override
{
	qDebug() << "右键菜单请求弹出";
	m_contextMenu->popu(event->globalPos());
}

在这里插入图片描述

  • 通过信号与槽处理

首先需要给控件设置上下文菜单策略setContextMenuPolic(Qt::CustomContextMenu) ;设置该策后当我们右键点击控件时qt会发送一个信号customContextMenuRequested(constQPoint &pos) ,其中参数pos用来传递右点击时的鼠标的坐标,这个坐标一般是相于控件左上角而言的

void menu2() {
  setContextMenuPolic(Qt::ContextMenuPolicy::CustomontextMenu);
  m_contextMenu = new QMenu;
  QAction* copyAct =m_contextMenu->addAction("复");
  QAction* pasteAct =m_contextMenu->addAction("粘");
  connect(this, QWidget::customContextMenuRequsted, this, [=](const QPoint&pos) {
  	auto p = this->mapToGloba(pos);
  	m_contextMenu->popup(p);
  	});
}

托盘菜单

  • 设置菜单
QMenu* menu = new QMenu;
QAction*openMainWindow = menu->addAction("打开主窗口");
menu->addSeparator();
QAction*quit = menu->addAction("退出程序");

trayIcon->setContextMenu(menu);
  • 处理菜单消息
connect(openMainWindow,&QAction::triggered,this,&QWidget::showNormal);
connect(quit,&QAction::triggered,this,&QApplication::quit);
  • 根据托盘菜单激活原因进行处理
connect(trayIcon,&QSystemTrayIcon::activated,this,&Widget::onActivated);

void Widget::onActivated(QSystemTrayIcon::ActivationReason)
{
    switch (reason)
    {
    case QSystemTrayIcon::Unknown:      //未知原因
        qDebug()<<"Unknown";
        break;
    case QSystemTrayIcon::Context:      //右键请求菜单
        qDebug()<<"Context";
        break;
    case QSystemTrayIcon::DoubleClick:  //系统托盘被双击
        this->showNormal();    
        qDebug()<<"DoubleClick";
        break;
    case QSystemTrayIcon::Trigger:      //系统托盘被点击
        bubbleMessage();
        qDebug()<<"Trigger";
        break;
    case QSystemTrayIcon::MiddleClick:  //系统托盘被鼠标中键点击
        qDebug()<<"MiddleClick";
        break;
    }
}

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

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

相关文章

C语言--分段函数

要求&#xff1a;写一个程序&#xff0c;输入x的值&#xff0c;输出y的值 思路&#xff1a;定义两个变量&#xff0c;一个y&#xff0c;一个x&#xff0c;当x<1时&#xff0c;yx&#xff0c;当x>1&&x<10&#xff0c;y2x-1&#xff0c;当x>10,y3x-11.用一个…

osg三角带

案例1 #include <osg/Geode> #include <osg/Geometry> #include <osgDB/Registry> #include <osgDB/WriteFile> #include <osg/Notify> #include <osg/PrimitiveSet> #include <osgViewer/Viewer> #include <osgUtil/Optimizer&g…

服务器经常被攻击的原因

很多中小型企业都是选择虚拟主机服务器&#xff0c;是把一个服务器分成很多个给很多企业一起共用&#xff0c;可能同一个 IP服务器上就有很多个不同企业的网站&#xff0c;这个时候如果跟你同一个IP服务器的网站遭到DDoS攻击&#xff0c;就很有可能会影响到你的网站也无法正常访…

谁还在一个个私发成绩啊, 教你如何实现学生自助查询成绩

今天我们聊聊成绩查询那些事儿 得先说说&#xff0c;成绩查询到底是个啥东西。成绩查询系统&#xff0c;顾名思义&#xff0c;就是一个可以输入用户名和密码&#xff0c;然后查看自己成绩的系统。对于咱们老师来说&#xff0c;可以省去一个个私发成绩的繁琐&#xff0c;对于学生…

69 内网安全-域横向CobaltStrikeSPNRDP

目录 演示案例:域横向移动RDP传递-Mimikatz域横向移动SPN服务-探针,请求,导出,破解,重写域横向移动测试流程一把梭哈-CobaltStrike初体验 涉及资源 SPN主要是扫描技术&#xff0c;在渗透过程中结合kerberos协议&#xff0c;可以做一些事情 演示案例: 域横向移动RDP传递-Mimik…

第三章 栈和队列【数据结构与算法】【精致版】

第三章 栈和队列【数据结构与算法】【精致版】 前言版权第 3 章 栈和队列3.1 应用实例应用实例一 迷宫求解问题应用实例二“马”踏棋盘问题 3.2栈3.2.1 栈的概念及运算3.2.2栈的顺序存储结构1. 顺序栈**1-顺序栈.h**2. 多栈共享邻接空间**2-共享栈.c** 3.2.3栈的链式存储结构1&…

【错误解决方案】ModuleNotFoundError: No module named ‘torchvision.models.utils‘

1. 错误提示 在python程序&#xff0c;尝试导入一个名为torchvision.models.utils的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named torchvision.models.utils 2. 解决方案 1&#xff09;这可能是因为你还没有安装…

SolidWorks2022安装教程(正版)

网盘资源附文末 一.简介 SolidWorks软件是世界上第一个基于Windows开发的三维CAD系统&#xff0c;由于技术创新符合CAD技术的发展潮流和趋势&#xff0c;SolidWorks公司于两年间成为CAD/CAM产业中获利最高的公司。良好的财务状况和用户支持使得SolidWorks每年都有数十乃至数百…

学习笔记二十九:K8S配置管理中心Configmap实现微服务配置管理

Configmap概述 Configmap概述Configmap能解决哪些问题&#xff1f;Configmap应用场景局限性 Configmap创建方法命令行直接创建通过文件创建指定目录创建configmap 编写configmap资源清单YAML文件使用Configmap通过环境变量引入&#xff1a;使用configMapKeyRef通过环境变量引入…

关于单片机CPU如何控制相关引脚

目录 1、相关的单片机结构 2、通过LED的实例解释 1、相关的单片机结构 在寄存器中每一块都有一根导线与引脚对应&#xff0c;通过cpu改变寄存器内的数据&#xff08;0或1&#xff09;&#xff0c;通过驱动器来控制对于的引脚。 2、通过LED的实例解释 如图所示&#xff0c;芯片…

【云备份|| 日志 day3】服务端配置信息模块

云备份day3 使用文件配置加载一些程序的运行关键信息可以让程序的运行更加灵活&#xff0c;且当需要修改部分内容时&#xff0c;不需要在代码上修改&#xff0c;只需要修改配置文件&#xff0c;然后重启服务器即可。 配置信息 热点判断时间文件下载URL前缀路径压缩包后缀名称…

项目管理-采购管理过程讲解

项目采购管理是指在项目执行过程中&#xff0c;对项目所需的产品、服务或资源进行采购的过程。它涉及确定采购需求、编制采购计划、寻找供应商、进行招标或谈判、签订合同、监督供应商履约等一系列活动。 项目采购管理的目标是确保项目能够按时、按质、按预算获取所需的产品或…

fastapi-路由

FastAPI的APIRouter是一个用于将不同功能模块的端点进行划分的工具&#xff0c;类似于Flask中的蓝图&#xff08;Blueprint&#xff09;。通过APIRouter&#xff0c;你可以将应用程序的不同部分组织成独立的路由模块&#xff0c;从而提高代码的可读性和可维护性。 APIRouter允…

【Midjourney入门教程2】Midjourney的基础操作和设置

文章目录 Midjourney的常用命令和基础设置1、 /imagine2、 /blend3、 /info4、 /subscribe5、 /settings&#xff08;Midjourney的基础设置&#xff09;6、 /shorten 有部分同学说我不想要英文界面的&#xff0c;不要慌&#xff1a; 点击左下角个人信息的设置按钮&#xff0c;找…

(2023最新版)总结 TCP 三挥四握的面试题

任 TCP 虐我千百遍&#xff0c;我仍待 TCP 如初恋。 TCP 基本认识 TCP 头格式有哪些&#xff1f; 我们先来看看 TCP 头的格式&#xff0c;标注颜色的表示与本文关联比较大的字段&#xff0c;其他字段不做详细阐述。 TCP 头格式 序列号&#xff1a;在建立连接时由计算机生成的…

C/C++苹果和虫子 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C苹果和虫子 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C苹果和虫子 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 你买了一箱n个苹果&#xff0c;很不幸的是买完时箱…

小程序day03

目标 页面导航 声明式导航 1.导航到tabBar页面 2.导航到非tabbar页面 3.后退导航 编程式导航 1.导航到tabBar页面 2.导航到非tabBar页面 3.后退导航 导航传参 1.声明式导航传参 2.编程式导航传参 3.在onLoad中接收导航参数 页面事件 下拉刷新 这个可以获取完数据之后再停止…

06、如何将对象数组里 obj 的 key 值变成动态的(即:每一个对象对应的 key 值都不同)

1、数据情况&#xff1a; 其一、从后端拿到的数据为&#xff1a; let arr [1,3,6,10,11,23,24] 其二、目标数据为&#xff1a; [{vlan_1: 1, value: 1}, {vlan_3: 3, value: 1}, {vlan_6: 6, value: 1}, {vlan_10: 10, value: 1}, {vlan_11: 11, value: 1}, {vlan_23: 23, v…

java--深刻认识面向对象

1.面向对象编程有啥好处 万物皆对象 汽车的数据&#xff0c;找汽车对象处理 手机的数据&#xff0c;找手机对象处理 学生的数据&#xff0c;找学生对象处理 符合人类思维习惯&#xff0c;编程更简单、更直观 2.程序中的对象到底是啥 对象本质上是一种特殊的数据结构(具体…