【Qt】QMainWidget中的栏和菜单

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

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

在这里插入图片描述

菜单栏

在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.mzph.cn/news/128227.shtml

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

相关文章

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 在上一篇文章中&#xff0c;我们实现了…

day53【子序列】1143.最长公共子序列 1035.不相交的线 53.最大子序和

文章目录 1143. 最长公共子序列1035.不相交的线53. 最大子序和 1143. 最长公共子序列 题目链接&#xff1a;力扣链接 讲解链接&#xff1a;代码随想录讲解 题意&#xff1a;给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 …

微信自动回复有什么好处?怎么设置?

微信自动回复有什么好处&#xff1f; 首先&#xff0c;它可以帮助我们节省时间和精力。当我们无法立即回复消息时&#xff0c;自动回复可以及时告知对方我们的状况&#xff0c;避免对方的焦虑和不便。 其次&#xff0c;自动回复可以增强沟通效率。无论是工作还是个人生活中&a…

gtsam初探以及结合LIO-SAM算法的一些理解

概述 GTSAM&#xff08;Georgia Tech Smoothing and Mapping&#xff09;是基于因子图的C库&#xff0c;本篇基于GTSAM对因子图优化做一个简单了解和梳理&#xff0c;并以LIO-SAM为例进一步分析因子图优化在SLAM中的应用。 参考链接&#xff1a; [0]gtsam官方文档 [1]https:/…

最小化安装移动云大云操作系统--BCLinux-R8-U2-Server-x86_64-231017版

有个业务系统因为兼容性问题&#xff0c;需要安装el8.2的系统&#xff0c;因此对应安装国产环境下的BCLinuxR8U2系统来满足用户需求。BCLinux-R8-U2-Server是中国移动基于AnolisOS8.2深度定制的企业级X86服务器通用版操作系统。本文记录在DELL PowerEdge R720xd服务器上最小化安…

Redis-分布式锁

Redis-setnx实现分布式锁 Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在&#xff0c;则SET)的简写。(NX是互斥、EX是设置超时时间) 但是如上会面临一个问题&#xff0c;当业务执行时间太长&#xff0c;导致业务还没执行完锁已到期&#xf…

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

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

Azure机器学习 - 在 Azure 机器学习中上传、访问和浏览数据

目录 一、环境准备二、设置内核三、下载使用的数据四、创建工作区的句柄五、将数据上传到云存储空间六、访问笔记本中的数据七、创建新版本的数据资产八、清理资源 机器学习项目的开始阶段通常涉及到探索性数据分析 (EDA)、数据预处理&#xff08;清理、特征工程&#xff09;以…

Java语法 - 01

Java基础 Java 是一种广泛使用的高级编程语言&#xff0c;最初由Sun Microsystems于1995年发布。它被设计为具有简单、可移植和面向对象的特性&#xff0c;以满足跨平台应用程序开发的需求。以下是一些关于 Java 的简介&#xff1a; 跨平台性&#xff1a;Java 程序可以在不同…

基于QT的简易计算器(一)

目录 0 简介1.设计原理1.1界面设计1.1.1界面基本布局1.1.2 界面调整和美化1.1.2 控件重命名 1.2 连接信号和槽1.3 软件逻辑1.3.1四则运算1.3.2 连续运算&#xff08;不完全&#xff09;的原理1.3.3 清屏1.3.4 退格1.3.5 等于1.3.6 小数点 2.总结与拓展 0 简介 最近在学QT&…

Django实战项目-学习任务系统-自定义URL拦截器

接着上期代码框架&#xff0c;6个主要功能基本实现&#xff0c;剩下的就是细节点的完善优化了。 首先增加URL拦截器&#xff0c;你不会希望没有登录用户就可以进入用户主页各种功能的&#xff0c;所以增加URL拦截器可以解决这个问题。 Django框架本身也有URL拦截器&#xff0…

【Python入门二】安装第三方库(包)

安装第三方库/包 1 使用pip安装2 使用PyCharm软件安装3 离线安装&#xff0c;使用whl文件安装参考 在Python中&#xff0c;有多种安装第三方库的方法&#xff0c;下面是一些常用的方法&#xff1a; 1 使用pip安装 pip是Python中最常用的包管理工具&#xff0c;也是最常用的在线…

代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集

背包问题 说到背包问题大家都会想到使用动规的方式来求解,那么为什么用动规呢,dp数组代表什么呢?初始化是什么,遍历方式又是什么,这篇文章笔者将详细讲解背包问题的经典例题0-1背包问题和完全背包问题的解题方式,希望能帮助到大家 1.暴力方式 有人一提到背包问题就只会使用动态…

OpenGL ES入门教程(一)编写第一个OpenGL程序

OpenGL ES入门教程&#xff08;一&#xff09;编写第一个OpenGL程序 前言 从本文开始我将参考学习OpenGL ES应用开发实践指南 Android卷 [&#xff08;美&#xff09;KevinBrothaler著]&#xff08;提取码: 394m&#xff09;&#xff0c;并基于自己的理解以更加通俗易懂的方式…

近独立粒子的最概然分布

近独立粒子&#xff1a;粒子之间相互作用微弱基本粒子中&#xff0c;自旋量子数为半整数的有 电子 、 质子 、中子、中微子自旋量子数为整数的有 光子、pi介子 经典力学描述系统的微观运动状态 经典力学中&#xff0c;全同粒子可以分辨量子力学&#xff0c;全同粒子不可以分辨微…

2023-11-02 LeetCode每日一题(环和杆)

2023-11-02每日一题 一、题目编号 2103. 环和杆二、题目链接 点击跳转到题目位置 三、题目描述 总计有 n 个环&#xff0c;环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings &#xff0c;表示这 n 个环在…

BetterDisplay Pro v1.4.15(显示器管理管理软件)

BetterDisplay Pro是一款屏幕显示优化工具&#xff0c;可用于Windows和Mac操作系统。它可以帮助用户调整屏幕的亮度、对比度、色彩等参数&#xff0c;以获得更好的视觉体验。此外&#xff0c;BetterDisplay Pro还提供了一些额外的功能&#xff0c;如屏幕分割、窗口管理、快捷键…

Django3框架-(3)-[使用websocket]:使用channels实现websocket功能;简化的配置和实际使用方式

概述&#xff1a; 对于Django使用channels实现websocket的功能&#xff0c;之前就写了几篇博文了。随着在项目的使用和实际维护来说&#xff0c;重新设置了相关处理方法。 一般来说&#xff0c;前后端都只维护一个全局的连接&#xff0c;通过携带数据来判断具体的操作&#x…

Flink1.18新特性生产环境应用的重点解读!

大家好&#xff0c;我是你们的群主王知无呀。 Flink 1.18已经于近期发布了。在这个新版本中新增了很多新的功能和特性。在这些特性中&#xff0c;有一些是生产环境非常重要的能力&#xff0c;大家在使用过程中可以重点参考和了解其中的原理。 算子级别状态保留时间TTL设置 首先…

GitHub经常打不开或者访问解决办法

访问慢或无法访问的原因&#xff1a;DNS解析是最为基础的一个环节。由于Github的服务器在全球各地&#xff0c;域名解析所需的时间也会不同&#xff0c;这就导致了在特定地区可能会出现Github无法正常访问的情况。 解决&#xff1a;查询到github对应的IP&#xff0c;然后在host…