Qt学习笔记(5)

2023-05-16

目录

一.菜单栏(MenuBar)

二.工具栏(ToolBar)

三.状态栏(StatusBar)

四.浮动窗口(DockWidget)

五.右键菜单

六.托盘菜单


一.菜单栏(MenuBar)

  • 只能有一个, 创建的最上方

菜单栏有两种方式可以创建,一种获取系统提供的,一种是自己new一个,然后窗口setMenuBar为新建菜单:

    //获取提供的MenuBar
    QMenuBar* bar = menuBar();
    //自己new一个
    QMenuBar* selfBar = new QMenuBar(this);
    this->setMenuBar(selfBar);

菜单栏的操作一般是:添加菜单(Menu),添加菜单行为(Action),给菜单添加快捷键,连接信号与槽:

void MainWindow::initMenuBar()
{
    //获取提供的MenuBar
    QMenuBar* bar = menuBar();
    //自己new一个
    QMenuBar* selfBar = new QMenuBar(this);
    this->setMenuBar(selfBar);

    //给菜单栏添加菜单项,可以添加图标
    //给菜单添加快捷键,在写菜单文本时用&表示
    QMenu* fileMenu = selfBar->addMenu("文件(&F)");
    QMenu* editMenu = selfBar->addMenu("编辑(&D)");

    //给菜单添加动作,三种方式
    auto newfileAct = fileMenu->addAction("新建文件");
    auto openfileAct = fileMenu->addAction(style()->standardIcon(QStyle::StandardPixmap::SP_FileIcon),"打开文件");

    auto saveAct = new QAction(style()->standardIcon(QStyle::StandardPixmap::SP_DirIcon),"保存文件");
    fileMenu->addAction(saveAct);

    //连接信号
    //1.复杂写法,每个写一遍,需要先接收一下返回值,直接连接动作信号
    connect(newfileAct,&QAction::triggered,this,[](){
        qDebug()<<"newfileAct";
    });
    connect(openfileAct,&QAction::triggered,this,[](){
        qDebug()<<"openfileAct";
    });
    connect(saveAct,&QAction::triggered,this,[](){
        qDebug()<<"saveAct";
    });
    //2.通过menu的信号处理动作的信号,可以捕获动作
    connect(fileMenu,&QMenu::triggered,this,[=](QAction* act){
        if(act == newfileAct)
        {

        }else if(act == openfileAct)
        {

        }else if(act == saveAct)
        {

        }
        qDebug()<<"triggered"<<act->text();
    });
    //3.直接在添加动作的时候添加处理函数,跟connect差不多
    fileMenu->addAction(style()->standardIcon(QStyle::StandardPixmap::SP_MessageBoxWarning),"消息警告"
                        ,this,[](){qDebug()<<"消息警告";});

    //给动作添加快捷键,中间不能加空格
    newfileAct->setShortcut(QKeySequence("Ctrl+N"));
    openfileAct->setShortcut(QKeySequence("Ctrl+O"));

    //设置动作可以选中
    newfileAct->setCheckable(true);
}

二.工具栏(ToolBar)

  • 可以有多个, 默认提供了一个, 窗口的上下左右都可以停靠

工具栏一般是那种有图标的或者按钮:

void MainWindow::toolBar()
{
    //添加工具栏
    QToolBar* toolBar =  addToolBar("toolBar");
    //添加动作
    toolBar->addAction(QIcon(":/new/prefix1/phone.ico"),"电话");
    toolBar->addAction("hello");
    toolBar->addWidget(new QPushButton("按钮"));

    //可以有多个工具栏
    QToolBar* toolBar1 =  addToolBar("toolBar");
    //添加动作
    toolBar1->addAction(QIcon(":/new/prefix1/phone.ico"),"电话");
    toolBar1->addAction("hello");
    toolBar1->addWidget(new QPushButton("按钮"));
}

三.状态栏(StatusBar)

  • 只能有一个, 窗口最下方

同样的,有两种创建方式,一种是获取自带的状态栏,一种是new一个然后设置。

QStatusBar* statusbar = statusBar();
QStatusBar* statusbar = new QStatusBar;
this->setStatusBar(statusbar);

一般状态栏搭配Lable使用,文字放左边,按钮放右边,添加默认是左对齐,可以换。

void MainWindow::statusBar()
{
    //一般来说,showmessage左边,能点的放右边
    //获取自带的状态栏
    QStatusBar* bar = QMainWindow::statusBar();
    //添加控件,默认左对齐
    bar->addWidget(new QLabel("状态"));
    bar->addWidget(new QPushButton("AN状态"));

    //添加在右边的控件
    bar->addPermanentWidget(new QLabel("right"));
    auto show = new QPushButton("showMessage",this);
    bar->addPermanentWidget(show);
    connect(show,&QPushButton::clicked,this,[=](){
        //显示状态信息,参数2表示显示时长
        bar->showMessage("我在哦",2000);
    });
}

四.浮动窗口(DockWidget)

  • 也叫停靠窗口,可以有多个, 默认没有提供, 窗口的上下左右都可以停靠
void MainWindow::dockWidget()
{
    //创建浮动窗口
    QDockWidget* gitDock = new QDockWidget("Git");
    QDockWidget* solveDock = new QDockWidget("解决方案管理器");
    QDockWidget* teamDock = new QDockWidget("团队资源管理器");
    QDockWidget* resDock = new QDockWidget("资源视图");

    auto btn = new QPushButton("btn",gitDock);

    //把浮动窗口添加到mainwindow
    addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,gitDock);
    addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,solveDock);
    addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,teamDock);
    addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,resDock);

    //分割浮动窗口
    splitDockWidget(gitDock,solveDock,Qt::Orientation::Horizontal);
    //选项卡式停靠
    tabifyDockWidget(teamDock,resDock);
}

五.右键菜单

  • 在桌面右击鼠标会出现菜单,这个我们一般叫做右键菜单
  • 首先需要给控件设置上下文菜单策略 setContextMenuPolicy(Qt::CustomContextMenu) 
  • 设置该策略后当我们右键点击控件时qt会发送一个信号 customContextMenuRequested(const QPoint &pos) ,其中参数pos用来传递右键点击时的鼠标的坐标,这个坐标一般是相对于控件左上角而言的
  • 最后给这个信号设置相应的槽函数,在槽函数中将菜单展示出来就行了。
    //添加一个中心窗口
    this->setCentralWidget(new QTextEdit);

    //设置右键菜单策略
    setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
    contextMenu = new QMenu(this);
    contextMenu->addAction("a");
    contextMenu->addAction("b");
    //添加分割线
    contextMenu->addSeparator();
    contextMenu->addAction("c");
    contextMenu->addAction("d");
    //连接信号与槽
    connect(this,&MainWindow::customContextMenuRequested,this,[=](const QPoint& pos){
        //pos是相对屏幕的坐标
//        contextMenu->popup(pos);//弹出
        //需要相对坐标转为相对窗口的坐标
        //1.使用mapToParent
        contextMenu->popup(mapToParent(pos));
        //2.直接用全局
        contextMenu->popup(QCursor::pos());
        qDebug()<<"连接成功";
    });

六.托盘菜单

  • 系统托盘就是在系统桌面底部特定的区域显示运行的程序
void MainWindow::inittrayIcon()
{
    //创建,托盘一定要设置图标
    trayIcon = new QSystemTrayIcon(QIcon(":/new/prefix1/phone.ico"),this);
    //必须要手动显示
    trayIcon->show();
    //给托盘添加菜单
    QMenu* menu = new QMenu("我是一个菜单",this);
    menu->addAction("打开主面板",this,&MainWindow::showNormal);
    menu->addSeparator();
//    menu->addAction("退出程序",this,&MainWindow::close);//这种方式只适用于单窗口退出
    menu->addAction("退出程序",qApp,&QApplication::quit);//真正退出
    //把菜单交给托盘
    trayIcon->setContextMenu(menu);

    //处理托盘的信号
    connect(trayIcon,&QSystemTrayIcon::activated,this,&MainWindow::onActive);
}

void MainWindow::onActive(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason)
    {
    case QSystemTrayIcon::ActivationReason::Unknown:
        qDebug()<<"Unknown";
        break;
    case QSystemTrayIcon::ActivationReason::DoubleClick:
        qDebug()<<"DoubleClick";
        break;
    case QSystemTrayIcon::ActivationReason::Context:
        qDebug()<<"Context";
        break;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt学习笔记(5) 的相关文章

随机推荐

  • openwrt 编译出错求解决方案

    新手入门openwrt 编译出错求解决方案 Configuring kmod sched cake Configuring kmod ifb Configuring iptables mod conntrack extra Configur
  • Ubuntu18.04 编译 ORB-SLAM2(./build.sh + ./build_ros.sh)完整流程,各种报错处理(踩坑总结)

    文章目录 前言系统版本 一 准备工作1 确定是否安装了 C 43 43 11 或者 C 43 43 0x 编译器2 安装 Pangolin 库3 安装 OpenCV 库4 安装 Eigen3 库5 ROS环境6 下载 ORB SLAM2 源
  • 高翔ORB-SLAM2稠密建图编译(添加实时彩色点云地图+保存点云地图)

    目录 前言系统版本 一 准备工作下载源码 二 编译 build sh1 删除一些build文件夹2 创建 Vocabulary 文件夹3 在CMakeLists txt中取消编译器的一些设置4 编译5 运行TUM数据集6 实时查看彩色点云地
  • 使用D435i相机跑ORB-SLAM2_RGBD_DENSE_MAP-master稠密建图编译(实时彩色点云地图加回环+保存点云地图)

    目录 前言系统版本 一 准备工作下载源码 二 编译 build sh1 删除一些build文件夹2 创建 Vocabulary 文件夹3 编译1 xff09 错误1 4 解决 段错误 xff08 核心已转储 xff09 改动一改动二 5 v
  • SLAM数据集TUM,KITTI,EuRoC数据集的下载地址与真实轨迹文件的查找

    目录 前言一 TUM数据集1 下载地址2 真实轨迹文件的查找3 轨迹格式 二 KITTI数据集1 下载地址2 真实轨迹文件的查找 三 EuRoC数据集1 下载地址2 真实轨迹文件的查找3 轨迹格式 前言 在SLAM的学习过程中 xff0c
  • 镭神16线激光雷达使用

    目录 一 创建工作空间二 进入src 下载驱动三 编译四 修改IP五 查看激光雷达点云 一 创建工作空间 span class token function mkdir span p leishen ws src 二 进入src 下载驱动
  • 使用D435i相机录制TUM格式的数据集

    目录 前言系统版本 一 使用realsense SDK录制bag包的情况1 录制视频2 提取rgb和depth图片1 2 3 对齐时间戳 二 用realsense ros打开相机录制bag包1 将深度图对齐到RGB2 使用realsense
  • 使用MeshLab软件处理pcd点云文件

    目录 前言1 安装MeshLab软件2 利用pcl库将pcd文件转成ply文件3 利用MeshLab旋转ply点云4 将ply文件转为pcd文件5 将ply文件转为pcd文件 xff08 添加读取配置文件版本 xff09 前言 在使用D43
  • 用C/C++读取配置文件的小例子

    这里提供了一个用C C 43 43 读取配置文件的简单框架 xff0c 具体内容可以依据自己的需要修改 GitHub上面的链接 xff1a https github com YuanpengDuan read config 新建一个文件夹
  • 洛谷P1080 [NOIP2012 提高组] 国王游戏

    此题用到的算法有贪心和高精度计算 高精度 高精度真的太折磨人了 xff0c 我搞了好久好久 xff08 PS xff1a python可跳过这一步 xff0c 它自带高精度 一开始我想用long long 但这个数据长度已经超过long l
  • Python中统一快速更换变量的名称

    首先 xff0c 选中需要更改的变量名称 xff0c 其次按下 Ctrl 43 R xff0c 就会出现如下的界面 其次输入你要替换成的变量名字 例如下方截图 xff0c 我要将num替换为str1 最后 xff0c 点击 Replace
  • Linux Qt程序打包

    前言 当我们在linux系统上开发一些工具时 xff0c 想快速分发给相关人员使用时 xff0c 我们可以把开发的相关依赖进行打包 xff0c 然后分发使用 xff0c 其中打包过程中遇到一些问题 xff0c 在没有安装Qt的机器上运行回报
  • word转pdf保持图片清晰度

    今天写论文的遇到两个问题 1 word插入的图片清晰度不够高 xff0c 放大之后不清晰了 2 word里面清晰度高 xff0c 但是转pdf之后放大不清晰了 问题1解决办法 xff1a word中 gt 插入图片 gt 右键选择图片 按照
  • c++字符串连接函数strcat_s

    格式 int a 100 61 0 int b 100 61 0 strcat s a b 功能 把字符数组2 b 连到字符数组1 a 后面 字符数组1必须足够大 连接前两串以 0 结束
  • Python语音合成探究(二、朗读文本的编码问题)

    语音合成时 xff0c 选取的朗读文本大多是网上收集来的TXT 文件 xff0c 有些文件会因为编码原因打开不了 xff0c 程序运行出错 如同样是 离骚 txt 文档 xff0c 用 with open 39 离骚 txt 39 as f
  • 关于Windows上的Android子系统安装

    Win11早些时候的版本公式里展示的安卓系统 Windows Subsystem for Android 简称WSA xff0c 现在可以在电脑中使用 xff0c 过了一年多的时间才想起还有个这种功能 xff0c 在安装时也是发现一些小细节
  • 大一上学期C++课程设计——学生成绩管理系统(QT项目)

    这里是一个大一的萌新 xff01 仅做学习分享 工程文件在评论区置顶 xff01 xff01 近期整理了一下大一上学期的课程设计报告作为学习总结 xff0c 使用的软件是Qt Creator xff0c 主界面效果如下图 QT具体环境如下图
  • 单片机控制直流电机(风扇)电路详解

    单片机引脚为什么无法直接控制电机或风扇 xff1f 我们在使用单片机去控制 43 5V的直流电机或者散热风扇时 xff0c 可能会有一种疑惑 xff0c 51单片机的引脚电压为 43 5V xff0c 为什么不直接用单片机引脚去驱动电机或者
  • [NOIP2002 普及组] 过河卒

    题目描述 棋盘上 AA 点有一个过河卒 xff0c 需要走到目标 BB 点 卒行走的规则 xff1a 可以向下 或者向右 同时在棋盘上 CC 点有一个对方的马 xff0c 该马所在的点和所有跳跃一步可达的点称为对方马的控制点 因此称之为 马
  • Qt学习笔记(5)

    目录 一 菜单栏 MenuBar 二 工具栏 ToolBar 三 状态栏 StatusBar 四 浮动窗口 DockWidget 五 右键菜单 六 托盘菜单 一 菜单栏 MenuBar 只能有一个 创建的最上方 菜单栏有两种方式可以创建 x