Qt学习10:MainWindow浅析

news2024/10/6 10:31:35

文章目录

  • QMainWindow的基本结构
    • QMenuBar
    • QToolBar
    • QStatusBar
    • QDockWidget
  • QSystemTrayIcon

文章首发于我的个人博客:欢迎大佬们来逛逛

QMainWindow的基本结构

  • QMenuBar:菜单栏
  • QToolBar:工具栏
  • QDockWidget:浮动窗口
  • QStatusBar:状态栏

在这里插入图片描述


QMenuBar

菜单栏:只能有唯一一个。
在这里插入图片描述

通过 **menuBar()** 来获得MainWindow唯一的菜单栏

继承自:QWidget

基本操作函数:

  1. addAction:添加行为QAction
  2. addMenu:添加菜单
  3. addSeparator:添加分割线

我们在添加Menu后还可以接着对Menu进行**嵌套操作。**比如对一个菜单项添加项目:addAction

我们可以指定很多对此菜单项的行为的操作:

例如直接对这个菜单项行为添加快捷键

// QMenu的addAction
QAction *addAction(const QIcon &icon, const QString &text)
QAction *addAction(const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0)

对于菜单条的addMenu可以直接使用 “文本(&E)” 的方式设置快捷键

信号:

  1. hovered:鼠标悬停
  2. triggered:鼠标点击

槽函数:

  1. setVisible:设置是否可见
void MainWindow::testMenuBar()
{
    auto mainMenuBar=menuBar();
    QMenu* fileMenu=mainMenuBar->addMenu("文件");
    QMenu* pro=fileMenu->addMenu("项目");
    pro->addAction("打开");
    pro->addAction("保存",this,&MainWindow::on_Ctrl_S,QKeySequence("Ctrl+S"));
    pro->addAction("新建");
    fileMenu->addSeparator();
    fileMenu->addAction("关闭");
    fileMenu->addAction("视图");

    QMenu* editMenu=mainMenuBar->addMenu("编辑(&E)");

    connect(mainMenuBar,&QMenuBar::hovered,this,[=](QAction* act){
        qInfo()<<act->text();
    });
}

QToolBar

工具栏:可以有多个。

在这里插入图片描述

在一个工具栏上面可以添加很多控件

它继承自:QWidget

通过 addToolBar() 来获得工具栏。

基本操作函数:

  1. addAction:添加行为
  2. addWidget添加控件。通过这个函数可以添加很多继承自QWidget的控件,例如按钮,文本框等。
  3. setFloatable:设置是否浮动
  4. setMoveable:设置是否能够移动

在工具栏上添加很多控件以实现工具栏的效果:

void MainWindow::testToolBar()
{
    auto mainToolBar=addToolBar("ToolBar1");
    mainToolBar->addAction(style()->standardPixmap(QStyle::StandardPixmap::SP_ArrowRight),"前进");
    mainToolBar->addAction(style()->standardPixmap(QStyle::StandardPixmap::SP_ArrowLeft),"后退");
    mainToolBar->addSeparator();

    auto chx=new QCheckBox("自动保存",this);
    mainToolBar->addWidget(chx);
    
    auto edit=new QLineEdit(this);
    edit->setPlaceholderText("搜索内容");
    mainToolBar->addWidget(edit);

    auto btn=new QPushButton("搜索",this);
    mainToolBar->addWidget(btn);

    auto toolbtn=new QToolButton(this);
    toolbtn->resize(150,150);
    toolbtn->setText("返回桌面");
    toolbtn->setIcon(style()->standardPixmap(QStyle::StandardPixmap::SP_DesktopIcon));
    toolbtn->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextUnderIcon);
    mainToolBar->addWidget(toolbtn);
}

QStatusBar

状态栏:只能有唯一一个

在这里插入图片描述

表示这个窗口的状态。

它继承自:QWidget

使用 statusBar() 来获得窗口中唯一的状态栏控件。

基本操作函数:

  1. addAction:添加行为
  2. addWidget:添加控件
  3. addPermanentWidget:在右侧添加控件与行为(默认在左边)

信号:

  1. messageChanged:状态信息改变时

槽函数:

  1. showMessage:显示信息
  2. clearMessage:清除信息

我们可以使用 showMessage 来对状态栏显示某种信息:

void MainWindow::testStatusBar()
{
    auto sBar=statusBar();
    sBar->addWidget(new QLabel("准备就绪",this));
    sBar->addWidget(new QPushButton("发射",this));
    sBar->addPermanentWidget(new QLabel("完成",this));
}
...
void MainWindow::on_Ctrl_S()
{
		//显示信息,持续两秒
    statusBar()->showMessage("保存成功",2000);
}

QDockWidget

浮动(可停靠)窗口:可以有多个

在这里插入图片描述

类似于 VS 中的窗口。

它继承自:QWidget

它表示一个浮动(可停靠)的窗口,可以拖动它的位置,或者固定它的位置。

注意:如果需要对这个窗口进行测试,必须首先设置一个中心区域

setCentralWidget(new QPlainTextEdit(this));

因为只有设置了这个中心文本区域后,我们才能看到浮动窗口的正确的显示位置。

通过 addDockWidget() 来添加浮动窗口:在某个区域添加一个浮动窗口

void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)

基本操作函数:

  1. tabifyDockWidget:设置浮动窗口的重叠
  2. setFloating:设置可浮动,否则是停靠的。
void MainWindow::testDockWidget()
{
    //设置中心区域
    setCentralWidget(new QPlainTextEdit(this));
    
    auto DockWidget1=createDockWidget("解决方案资源管理器");
    auto DockWidget2=createDockWidget("团队资源管理器");
    auto DockWidget3=createDockWidget("命令窗口");
    addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea,DockWidget1);
    addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea,DockWidget2);
    addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea,DockWidget3);

    //设置浮动窗口的堆叠
    tabifyDockWidget(DockWidget1,DockWidget2);
    tabifyDockWidget(DockWidget2,DockWidget3);
}

QSystemTrayIcon

系统的托盘图片:只能有唯一一个。

在这里插入图片描述

图中的 M 就是我的程序的图片。

通过QSystemTrayIcon 的构造函数来创建一个托盘图标,并且显示出来:

注意:必须传递一个图片和调用show(),否则不会显示。

auto trayIcon=new QSystemTrayIcon(QIcon(":/icon.png"),this);
trayIcon->show();

它继承自:QObject

基本操作函数:

  1. setContextMenu:设置上下文菜单,可用于鼠标右键图标显示的菜单
  2. setIcon:设置图标
  3. setToolTip:设置图标的文本解释

信号:

  1. activated:激活状态,enum QSystemTrayIcon::ActivationReason的枚举表示了所有可能的状态

槽函数:

  1. hide:隐藏
  2. show:显示
  3. showMessage:显示一条信息

我们为这个托盘图标设置了一个菜单,并且鼠标右键和双击都可以显示出来。

我们还在菜单中设置了一些行为:控制程序退出与窗口最小化切换。

void MainWindow::SystemTrayIcon()
{
    auto trayIcon=new QSystemTrayIcon(QIcon(":/icon.png"),this);
    trayIcon->show();

    QMenu* trayMenu=new QMenu(this);
    trayMenu->addAction("退出",qApp,[=](){
        qApp->quit(); //退出系统
    });
    trayMenu->addSeparator();
    trayMenu->addAction("最小化",this,[=](){
        this->setVisible(!this->isVisible());
    });
    trayMenu->addAction("别点我",this,[=](){
        //trayIcon->showMessage("警告,电脑即将爆炸","错误操作,爆炸倒计时!");
        qInfo()<<"!!!!";
    });
    //添加上下文菜单
    trayIcon->setContextMenu(trayMenu);

    trayIcon->setToolTip("你好");

    //处理激活原因
    connect(trayIcon,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason reason){
        switch (reason) {
        case QSystemTrayIcon::Unknown:  //0

            break;
        case QSystemTrayIcon::Context:  //1

            break;
        case QSystemTrayIcon::DoubleClick://2
            //弹出菜单
            trayIcon->contextMenu()->popup(QCursor::pos());
            break;
        case QSystemTrayIcon::Trigger:  //左键点击
            //窗口切换
            this->setVisible(!this->isVisible());
            break;
        default:
            break;
        }
        qInfo()<<reason;
    });
}

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

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

相关文章

基于ENVI的遥感影像解译——以Landsat8数据为例(上)

遥感影像解译是一种指从图像获取信息的基本过程。即根据各专业&#xff08;部门&#xff09;的要求&#xff0c;运用解译标志和实践经验与知识&#xff0c;从遥感影像上识别目标&#xff0c;定性、定量地提取出目标的分布、结构、功能等有关信息&#xff0c;并把它们表示在地理…

火力全开,鏖战争锋|SCTF 2023圆满落幕!

2023年6月19日09:00&#xff0c;第八届XCTF国际联赛分站赛——SCTF 2023圆满落幕。本次赛事由XCTF国际联赛合作单位——成都信息工程大学Syclover战队组织&#xff0c;由赛宁网安提供技术支持。 经过持续48小时的夺旗厮杀&#xff0c;联合战队Nu1L最终力压群雄&#xff0c;夺得…

什么是mAP(mean average Precision)

Mean Average Precision&#xff0c;即 平均AP值 。AP&#xff08;Average precision&#xff09;单类标签平均&#xff08;各个召回率中最大精确率的平均数&#xff09;的精确率。AP: PR&#xff08; Precision-Recall&#xff09;曲线下面积&#xff0c;mAP(Mean Average Pre…

树莓派启用无密码 sudo

启用无密码 sudo&#xff0c;可以在不提供密码的情况下在树莓派上运行程序。 登录 Raspberry Pi 命令行界面。假设 Raspberry Pi 的默认用户名和密码分别为 pi 和 raspberry。在命令行界面中&#xff0c;键入以下命令&#xff1a; sudo nano /etc/sudoers 3. 通过添加以下行启…

被业务员缠着要数据,数据分析师除了加班还有第二种选择吗?

知乎的大数据给我推了这样一个问题&#xff1a;身为数据分析师&#xff0c;却被业务当做取数机&#xff1f; 热度很高&#xff0c;看来很多数据分析师有相似的处境。 作为一个数据分析师&#xff0c;大部分时间却忙于取数&#xff0c;即使996加班也忙不完&#xff0c;不仅没…

Word怎么删除空白页,4个方法轻松解决!

案例&#xff1a;我在编辑文档的时候会遇到空白页&#xff0c;我不能直接对它进行删除操作。我想知道如何删除Word里面的空白页&#xff1f;方法越简单越好&#xff01; Word是广泛使用的办公软件之一&#xff0c;但有时在编辑文档时会遇到一些空白页的问题。空白页的存在可能…

阿里云学生验证流程(申请入口、学生认证图文教程)

阿里云学生用户完成学生认证可以领取一台阿里云服务器&#xff0c;那么问题来了&#xff0c;阿里云学生验证申请入口​在哪&#xff1f;阿里云百科分享阿里云学生验证入口网页链接及学生认证全流程&#xff1a; 目录 阿里云学生验证入口及申请流程 打开学生验证申请入口 支…

BUG越改越多?微信团队用自动化测试化险为夷

&#x1f449;腾小云导读 作为后台开发 Coder&#xff0c;你可能会对以下场景感到似曾相识&#xff1a;历史上处理过的 BUG 反复横跳&#xff1b;版本兼容逻辑多&#xff0c;修复一个 BUG 触发了更多 BUG&#xff1b;上线时系统监控毫无异常&#xff0c;过段时间用户投诉某个页…

关于iOS16 以后屏幕旋转不得不说的事

由于笔者最近刚完成了一个强制屏幕横屏的需求 所以 顺便记录一下 实现过程中遇到 block点 也为广大的iOS开发者做一个笔记&#xff1a; 废话不多说直接上代码 //适配iOS16.0的横竖屏方法public static func switchInterfaceWtihIos16(orientation: UIInterfaceOrientation , o…

墨水屏服务更新及测试

一、更新墨水屏服务 ①删除tomcat/webapps/esls_new 缓存目录 ②替换新的esls_new.war ③重启tomcat,等待war包解压完成 ④修改数据库配置applicationContext-common.xml和回调接口配置urlConfig.properties ⑤重启tomcat 重启tomcat&#xff1a; tomcat/bin/shutdown.s…

我们还需要 SRE 吗?

在 「一文讲透研发&#xff0c;SRE&#xff0c;运维&#xff0c;DevOps 的区别」里&#xff0c;我们讲了几大工种的区别&#xff0c;这篇我们重点讲一下 SRE (Site Reliability Engineering)。 SRE 的兴起 SRE 最早起源于 2003&#xff0c;由 Google 提出。SRE 既是一种理念&a…

Linux Vim三种工作模式(命令模式、输入模式和编辑模式)详解

Linux 系统中所有的内容都以文件的形式进行存储&#xff0c;当在命令行下更改文件内容时&#xff0c;常会用到文本编辑器。 我们首选的文本编辑器是 Vim。使用 Vim 编辑文件时&#xff0c;存在 3 种工作模式&#xff0c;分别是命令模式、输入模式和编辑模式&#xff0c;这 3 种…

一文讲透研发,SRE,运维,DevOps 的区别

研发&#xff0c;SRE &#xff0c;运维是工种&#xff0c;而 DevOps 是体系。如果拿足球来打比方&#xff0c;研发&#xff0c;SRE &#xff0c;运维对应的就是前锋&#xff0c;中场&#xff0c;后卫这样的位置&#xff0c;而 DevOps 则是诸如 4-3-3 这样的阵型。 研发 也叫研…

聊聊如何独立使用ribbon实现业务客户端负载均衡

前言 ribbon是Netflix开源的客户端负载均衡工具&#xff0c;ribbon实现一系列的负载均衡算法&#xff0c;通过这些负载均衡算法去查找相应的服务。ribbon被大家所熟知&#xff0c;可能是来源于spring cloud&#xff0c;今天就来聊聊如何单独使用ribbon来实现业务客户端负载均衡…

我心中的编程语言之王:Python

我心中的编程语言之王&#xff1a;Python 在当今日益发展的信息技术领域&#xff0c;编程语言的地位愈发重要。它们是构建现代软件和应用的基石&#xff0c;也是实现科技进步的关键工具。在众多编程语言中&#xff0c;Python 以其简单、易用、高效等诸多优点&#xff0c;成为了…

Dubbo架构分层总结

进来闲来无事看了些有关dubbo源码的书籍和《极客时间》何辉老师的课程&#xff0c;由于知识点比较碎&#xff0c;遂以笔记的方式纪录&#xff0c;毕竟好记性不如烂笔头&#xff0c;也希望对感情趣的同学提供点帮助 假设你是个新手开发者&#xff0c;可能只是简单使用过dubbo框…

数字孪生世界建设核心能力:数据治理能力

随着世界经济由工业经济向数字经济转型&#xff0c;数据逐步成为关键的生产要素&#xff0c;企业开始将数据作为一种战略资产进行管理。数据从业务中产生&#xff0c;在IT系统中承载&#xff0c;要对数据进行有效治理&#xff0c;需要业务充分参与&#xff0c;IT系统确保遵从&a…

前端开发必须要知道的package.json文件

前言 package.json 文件是一个 Node.js 项目的配置文件&#xff0c;用于描述项目的元数据信息&#xff08;如名称、版本、作者、依赖等&#xff09;&#xff0c;以及运行和构建该项目所需的脚本命令。 在项目开发过程中&#xff0c; package.json 文件的维护和更新是非常重要…

Axure8 零基础操作入门

参考&#xff1a;黑马产品经理课程 视频资源&#xff1a;day1&day2&#xff0c;Axure部分 Axure8常用功能 选择/缩放 选择 包含选中&#xff1a;全部选中才有效&#xff08;避免误操作&#xff0c;建议使用这个&#xff09;相交选中&#xff1a;相交即全选中 缩放 元件等…

PHP开发工具22-PHP中安装和使用xdebug

文章目录 前言配置详解总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 作为一个程序员&#xff0c;千万不要说你没有用过debug工具&#xff0c;不然有点说不过去。xdebug是PHP语言一个强大的利器&#xff0c;用他可以做很多事情。 xdebug是PHP开发者常…