首页 > 其他分享 >Qt之点击鼠标右键创建菜单栏使用(六)

Qt之点击鼠标右键创建菜单栏使用(六)

时间:2024-12-12 16:56:41浏览次数:5  
标签:widget 菜单 Qt menu 菜单栏 ui 右键 tab border

Qt开发 系列文章 - menu(六)


目录

前言

一、示例演示

二、菜单栏

1.MenuBar

2.Menu

总结


前言

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、一个状态栏(statusbar)及一个中心部件(centralwidget),是许多应用程序的基础。今天本文主要讲解菜单栏QMenuBar和QMenu,其中QMenu可以嵌入到菜单栏QMenuBar中,也可以作为弹出菜单使用。

QMenu是Qt框架中的一个类,用于创建和管理菜单。它提供了丰富的接口来添加菜单项、子菜单以及分隔符。QMenu不仅支持文本菜单项,还支持图标、快捷键和状态提示等功能,这些都可以通过QAction来设置。


一、示例演示

先给出本文示例效果展示,如下。

二、菜单栏

将从两个方面讲解菜单,第一个是示例演示中的MenuBar,在窗口前端添加菜单选项;第二个是在子窗口上通过鼠标点击显示菜单Menu。

1.MenuBar

  • 步骤1

新建一个Qt项目,带UI设计的,不会创建的参考本博主前面的博文,创建完后,双击打开项目。

  • 步骤2

如果如要在菜单中添加图片显示的,可参考这一步操作,如果不如要则跳过该步骤。添加图标首先是将你的图片添加到项目中,图片格式可以是ico、png等等。

在Qt界面上,选择你的项目,右键选择添加现有文件,选择你的图标目录,如下左图所示。将图标全部选中,点击打开添加。添加完后在Qt项目中会见到如下添加图标,见如下右图。

     

  • 步骤3

在Qt项目界面上,双击打开UI设计文件,在QMenuBar上添加如下功能,有主菜单和子菜单选项,自己可以按需添加,如下所示。

上面创建好的选项,在UI界面底部显示全部的内容,具体如下。

  • 步骤4

单击选中其中一个,右键进行编辑,此时可修改为中文,也可以添加步骤2所加的图标。操作完后显示如下左图。

  • 步骤5

要实现相关的按钮功能,例如,在帮助上显示版本信息,操作如下,选中项目,右键选择转到槽函数,选择triggered函数,步骤如下。

     

triggered函数代码如下(示例)。

void MainWindow::on_action_4_triggered()
{
    info = new QTextBrowser;
    info->setWindowTitle("版本信息");
    info->setWindowIcon(QApplication::style()-
                  >standardIcon(QStyle::StandardPixmap::SP_MessageBoxInformation));
    info->setText("版本14.7.0.9802\n系统词频: 630211129\n编译时间: Aug  2 2024 17:00:18");
    info->show();
}
  • 步骤6

上述创建好后,在UI界面左侧,主窗口类处,会有如下变量。

此时在窗口前端添加MenuBar菜单选项已操作完毕,接下面实现在子窗口上通过鼠标点击显示菜单Menu。

2.Menu

  • 步骤1

同样是打开UI设计界面,在UI界面上添加如下①②③,相应的类如下右图。

   

  • 步骤2

要实现相关函数功能,先在头文件上定义相关类,代码如下(示例):

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void on_action_4_triggered();
protected:
    void InitChart();
    void CreateMenu(QWidget *parent);
    bool eventFilter(QObject *obj, QEvent *event) override;
private:
    Ui::MainWindow *ui;
    QTextBrowser *info;
    QChart *chart;
    QLineSeries *series;
    QMenu *menu_widget;
    QMenu *menu_tab;
    QMenu *menu_tab_2;
};
  • 步骤3

在构造函数上进行参数初始化,和注册事件过滤器、创建菜单变量,并关联到相关子窗口上,代码如下(示例)。

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->toolBar->hide();
    InitChart();
    /*** 注册事件过滤器 ***/
    ui->widget->installEventFilter(this);
    ui->tab->installEventFilter(this);
    ui->tab_2->installEventFilter(this);
    /*** 创建右键菜单 ***/
    CreateMenu(ui->widget);
    CreateMenu(ui->tab);
    CreateMenu(ui->tab_2);
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->widget) {
        if(event->type() == QEvent::MouseMove) {
            QMouseEvent *pMouseEvent = (QMouseEvent*)event;
            // 功能函数
        }
        if(event->type() == QEvent::MouseButtonPress)
            menu_widget->exec(cursor().pos());  //菜单显示的位置跟随鼠标
    }
    else if (watched == ui->tab) {
        if(event->type() == QEvent::MouseButtonDblClick)
            menu_tab->exec(cursor().pos());
    }
    else if (watched == ui->tab_2) {
        if(event->type() == QEvent::MouseButtonDblClick)
            menu_tab_2->exec(cursor().pos());
    }
    return QObject::eventFilter(watched, event);
}

void MainWindow::CreateMenu(QWidget *parent)
{
    if(parent == ui->widget) {
        menu_widget = new QMenu(parent);//创建右键菜单
        menu_widget->addAction("功能1", this, [=](){fun1();});
        menu_widget->addAction("功能2", this, [=](){fun2();});
        menu_widget->addAction("清空", this, [=](){series->clear();});
        menu_widget->addAction("退出", this, [=](){ui->widget->close();});
        menu_widget->setStyleSheet("background-color: rgb(30, 30, 30);color: rgb(255, 255, 255);"
                            "border-right:2px solid #aaaaaa; "
                            "border-bottom:2px solid #aaaaaa;"
                            "border-left:2px solid #aaaaaa;"
                            "border-top:2px solid #aaaaaa; "
                            "border-radius:5px;"
                            "font: 16pt ""黑体"";"
                            "selection-background-color: rgb(100, 40, 40);");
    }
    else if (parent == ui->tab) {
        menu_tab = new QMenu(parent);//创建右键菜单
        menu_tab->addAction("功能1", this, [=](){fun1();});
        menu_tab->addAction("功能2", this, [=](){fun2();});
        menu_tab->addAction("隐藏", this, [=](){ui->tab->hide();});
        menu_tab->addAction("退出", this, [=](){ui->tab->close();});
        menu_tab->setStyleSheet("background-color: rgb(30, 30, 30);color: rgb(255, 255, 255);"
                            "border-right:2px solid #aaaaaa; "
                            "border-bottom:2px solid #aaaaaa;"
                            "border-left:2px solid #aaaaaa;"
                            "border-top:2px solid #aaaaaa; "
                            "border-radius:5px;"
                            "font: 16pt ""黑体"";"
                            "selection-background-color: rgb(100, 40, 40);");
    }
    else if (parent == ui->tab_2) {
        menu_tab_2 = new QMenu(parent);//创建右键菜单
        menu_tab_2->addAction("功能1", this, [=](){fun1();});
        menu_tab_2->addAction("功能2", this, [=](){fun2();});
        menu_tab_2->addAction("隐藏", this, [=](){ui->tab_2->hide();});
        menu_tab_2->addAction("退出", this, [=](){ui->tab_2->close();});
        menu_tab_2->setStyleSheet("background-color: rgb(30, 30, 30);color: rgb(255, 255, 255);"
                            "border-right:2px solid #aaaaaa; "
                            "border-bottom:2px solid #aaaaaa;"
                            "border-left:2px solid #aaaaaa;"
                            "border-top:2px solid #aaaaaa; "
                            "border-radius:5px;"
                            "font: 16pt ""黑体"";"
                            "selection-background-color: rgb(100, 40, 40);");
    }
}

上述编写完毕后,软件编译运行,显示如下。


总结

博文中相应的工程代码Qt-Case.zip 利用Qt开发软件进行编的例程,为博文提供案例-CSDN文库

标签:widget,菜单,Qt,menu,菜单栏,ui,右键,tab,border
From: https://blog.csdn.net/weixin_47006346/article/details/144238664

相关文章

  • Qt,设置软件字体
      //一、设置全局字体(系统库字体)QFontfont("Courier",10,QFont::Normal,false);a.setFont(font);//二、设置全局字体(自定义字体)intfont_id=QFontDatabase::addApplicationFont(QStringLiteral(":/static/font/FormaDJRMicro-Regular.ttf"));QStringfont_name......
  • kali下qt无法使用中文输入法解决方案
    1.如果使用的apt安装的designer-qt6等的一些工具,则使用如下方案aptinstallfcitx5-frontend-qt6如上就可解决,如果用的qt5,就安装fcitx5-frontend-qt5 2.使用qt在线安装的dpkg-Lfcitx5-frontend-qt6查看安装路径找到libfcitx5platforminputcontextplugin.so这个文件......
  • Qt编写RK3588视频播放器/支持RKMPP硬解/支持各种视音频文件和视频流/海康大华视频监控
    一、前言用ffmpeg做硬解码开发,参考自带的示例hw_decode.c即可,里面提供了通用的dxva2/d3d11va/vaapi这种系统层面封装的硬解码,也就是无需区分用的何种显卡,操作系统自动调度,基本上满足了各种场景的需要,这种方式很通用也便捷,但是一些特殊场景必须要用指定硬解码器名称的方式,比如指定......
  • QT自定义控件实践--滑动组件
    概述             本篇文章,会逐步带您了解,如何自定义一个QT的滑动组件操作步骤选择合适的基类继承:我们命名这个自定义控件为MySlipButton,继承自QWidget添加成员变量:根据滑动组件的特性,添加合适的成员变量,如当前值、最小值、最大值、滑块的位置等。......
  • Qt/C++音视频开发 - 获取本地摄像头名称/FFmpeg命令日志方式
    Qt/C++音视频开发-获取本地摄像头名称/FFmpeg命令日志方式介绍在音视频开发中,获取本地摄像头名称和通过FFmpeg命令记录日志是两个常见的需求。Qt/C++结合使用FFmpeg库实现这些功能,可以提高开发效率并增加程序的灵活性。应用使用场景实时流媒体应用:在直播、视频会议等......
  • Qt实现控件拖曳
    DragTreeWidget.h#ifndefDRAGTREEWIDGET_H#defineDRAGTREEWIDGET_H#include<QTreeWidget>classQMouseEvent;classDragTreeWidget:publicQTreeWidget{Q_OBJECTpublic:DragTreeWidget(QWidget*parent=nullptr);private:voidinit()......
  • MQTT协议史上最全解析(纯干货分享)
    目录MQTT是什么?一些术语解释MQTT特点MQTT控制报文格式十四种控制报文1号控制报文:CONNECT–连接到服务端2号控制报文:CONNACK–确认连接请求3号控制报文:PUBLISH–发布消息4号控制报文:PUBACK–发布确认5号控制报文:PUBREC–发布收到(QoS2,第一步)6号控制报文:PU......
  • 入库出库查询软件——qt
    miniMes系统操作说明一:功能说明主界面有扫描--查询两个界面,扫描界面如下1:默认开启自动入库出库功能2:右上角限制位数可根据需求设定二维码字符串的位数,设置完成后点击设定,弹窗设定成功即可3:运行逻辑如下,鼠标点击二维码输入框,扫描二维码,未入库的产品会执行《入库操作》4:两秒......
  • qt激光加工软件开发(一)
    20年毕业后,先是从事qt+c++开发,而后从事mfc开发,今年步入新的公司,着手开发一版新的激光设备加工软件激光加工软件所具备的功能:轴的控制:主要包括XYZ三个轴,品牌:ACS、固高、Galil控制卡等相机控制:用于显示影像,进行识别定位等功能,品牌:大恒、海康、Basler等激光器控制:用于划线,打标,清......
  • 使用ESP32做一个MQTT协议的公网对讲机
    此篇文章在2022年8月14日被记录使用MQTT做一个公网对讲机上一篇博客中,使用ESP32与ESP-NOW协议做了一个短距离对讲机(链接),发布了一个视频在B站评论区中,很多B友希望可以实现无限距离对讲,这样的话需要服务器转发,刚开始我想使用python写一个TCP或者UDP的转发功能,但是考虑到很多小......