首页 > 其他分享 >Qt中QWidgetAction使用例子

Qt中QWidgetAction使用例子

时间:2023-12-12 09:02:11浏览次数:36  
标签:控件 MWidget layout Qt QWidgetAction menu void 例子 new

在Qt中可以用QWidgetAction来模仿现代应用程序中的自定义控件的菜单项。比如下方Edge浏览器的菜单,在“缩放”一项中有用来调整网页缩放的几个按钮和显示网页缩放比例的控件。

这样的菜单项Qt也可以做。下面将给出一个简单的例子供参考,此例子在VS2017和Qt5.9下测试通过。其运行效果如下图:

上方图片中“复制”、“粘贴”和红色正方形就是我们自定义的菜单项内容。源代码的头文件如下:

class MWidget : public QWidget
{
    Q_OBJECT

public:
    MWidget(QWidget* parent = 0);

private:
    void paintEvent(QPaintEvent* event) override;
    void mousePressEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;
};

CPP文件:

// 这是弹出右键菜单的槽函数
void QtTest::on_tvHost_customContextMenuRequested(const QPoint& pos)
{
    QMenu *menu = new QMenu;

    QWidgetAction* actOpera = new QWidgetAction(menu);
    QWidget* mainHost = new QWidget;
    QHBoxLayout* layout = new QHBoxLayout(mainHost);
    layout->setContentsMargins(4, 0, 4, 0);
    layout->setSpacing(2);
    layout->addWidget(new QPushButton(u8"复制"));
    layout->addWidget(new QPushButton(u8"粘贴"));
    layout->addWidget(new MWidget());
    mainHost->setLayout(layout);
    actOpera->setDefaultWidget(mainHost);

    menu->addAction(actOpera);
    menu->addAction(u8"速览定义(&W)");
    menu->addAction(u8"转到定义(&S)");
    menu->addAction(u8"注释(&C)");
    menu->addAction(u8"断点(&B)");
    menu->exec(ui.tvHost->mapToGlobal(pos));
    delete menu;
}

/////////////////////////////////////////////////////////////////////////////////////////

// 这个自定义控件只是一个例子可以不要
MWidget::MWidget(QWidget* parent) : 
    QWidget(parent)
{
    setFixedSize(22, 22);
}

void MWidget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    painter.fillRect(rect(), Qt::red);
}

void MWidget::mousePressEvent(QMouseEvent* event)
{
    // 防止鼠标点击后菜单自动关闭
}

void MWidget::mouseReleaseEvent(QMouseEvent* event)
{
    // 防止鼠标点击后菜单自动关闭
}

上述代码中最重要的内容在QtTest::on_tvHost_customContextMenuRequested(...)函数中。其中QtTest是主窗口类。tvHost是需要弹出右键菜单的控件,需要在Qt设计师软件里将此控件的右键菜单模式修改为CustomContextMenu,然后运行时在控件上方点击右键就会自动触发这个槽函数。MWidget是我特意添加的一个自定义控件例子,如注释内容所说,如果你重写了mousePressEvent(...)和mouseReleaseEvent(...)函数,那么在你点击这个控件时右键菜单不会自动消失。否则,只要鼠标在此控件上点击一次菜单就会自动关闭,如同点击普通的QAction一样。这种行为在我的电脑上测试是这样,不知道其它的系统是不是也这样。

当然,QWidgetAction也有另外一种使用方式。就是自定义一个类继承它,然后向其中添加内容。这里不详细说了,可以自行搜索相关例子。

标签:控件,MWidget,layout,Qt,QWidgetAction,menu,void,例子,new
From: https://www.cnblogs.com/mengxiangdu/p/17836339.html

相关文章

  • C++ Qt开发:PushButton按钮组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QPushButton按钮组件的常用方法及灵活运用。QPushButton是Qt框架中用于创建按钮的组件类,是QW......
  • qt和cmake安装
    1/qtIndexof/archive/qt  2、cmakeDownloadCMake 安装比较简单 记得选择addpath,这样就不用手动添加环境变量了 3、vscode插件c/c++ cmake cmaketools qtconfigure qttools ......
  • Typescript中Readonly<T> 是什么&例子
    Readonly<T>是TypeScript中的一个预定义类型操作工具,用于将给定类型T中的所有属性设置为只读。这意味着创建的新类型将具有与原始类型相同的属性,但这些属性在新类型中是只读的,不可修改。下面是一个示例:typePerson={name:string;age:number;};typeReadonlyPe......
  • CH395+EMQX实现MQTT应用(Windows系统)
    MQTT协议1.MQTT简介MQTT是一种基于 发布/订阅模式的轻量级消息协议,工作在TCP/IP协议族上。其最大的优点是用极少量的代码和有限的宽带为设备间提供实时可靠的消息服务。在物联网(IOT)和机器与机器(M2M)等方面有较广泛的应用。2.MQTT特性2.1发布/订阅模式,提供一对多的消息发布......
  • Qt/C++音视频开发59-使用mdk-sdk组件/原qtav作者力作/性能凶残/超级跨平台
    一、前言最近一个月一直在研究mdk-sdk音视频组件,这个组件是原qtav作者的最新力作,提供了各种各样的示例demo,不仅限于支持C++,其他各种比如java/flutter/web/android等全部支持,性能上也是杠杠的,目前大概是在V0.23版本,大部分软件发布基本上都是在1.0版本才是比较稳定的,不过目前用下来......
  • Qt6 c++教程9测试&调试
    9测试&调试调试和测试是软件开发的重要组成部分。在本章中,你将学习如何调试Qt项目、不同的调试技术以及Qt支持的调试器。调试是发现错误或不希望出现的行为的根本原因并加以解决的过程。我们还将讨论使用QtTest框架进行单元测试。QtTest是基于Qt的应用程序和库的单元测试......
  • pyqt6 登录窗口
    pyqt_login-master/main.pyimportsysfromPyQt6importQtGui,QtWidgetsfromPyQt6.QtWidgetsimportQMainWindow,QMessageBoxfromWindowsimportloginuser_icon="assets/favicon.ico"users={"user":"admin123"}class......
  • C++ Qt开发:使用关联容器类
    当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念。顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构。它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的平衡。Qt中提供了丰富的容器类,用于方便地管理和操作数据。这些容......
  • C++ Qt开发:使用顺序容器类
    当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念。顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构。它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的平衡。Qt中提供了丰富的容器类,用于方便地管理和操作数据。这些容......
  • QtConcurrent::run()多线程的同步、异步
    Qt提供了QtConcurrent模块,处理一些常见的并行计算,最大的特点就是无需再使用互斥锁这种很低级的操作,全都封装好了。除此以外,QFuture、QFutureWatcher、QFutureSynchronizer类提供了一些辅助性的操作。参考:Qt中的多线程技术-知乎(zhihu.com)【QtConcurrent::run()需注意】......