Qt创建右键菜单的两种通用方法(QTableView实现右键菜单,含源码+注释)

这篇具有很好参考价值的文章主要介绍了Qt创建右键菜单的两种通用方法(QTableView实现右键菜单,含源码+注释)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、右键菜单(方法1+方法2)的示例

下图为两种右键菜单实现的示例图,源码在本文第三节(源码含详细注释)。
qt 右键菜单,Qt,qt,c++,ui
提示:不会使用Qt设计师设计界面的小伙伴点击这里。

二、右键菜单实现的两种方法及其区别(个人理解)

方法1

该方法是触发contextMenuEvent事件来实现右键菜单,只需在该事件函数中写入对应的右键菜单代码即可。

方法2

该方法是通过控件发出的customContextMenuRequested信号触发对应的槽函数实现,同样需要添加对应的右键菜单代码。

方法区分:

当在函数中并未使用setContextMenuPolicy函数设置对应值时,右键操作通常会触发contextMenuEvent事件;反之使用setContextMenuPolicy函数将值设置为Qt::CustomContextMenu时,才会发出对应的信号。
!!!!!
因为QWidget包含该信号和该事件,理论上说,只要继承了QWidget都能通过这两种方法实现右键菜单。

三、源码

CMainWindow.h(包含槽函数和事件函数的定义)

#ifndef CMAINWINDOW_H
#define CMAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class CMainWindow;
}

class CMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit CMainWindow(QWidget *parent = 0);
    ~CMainWindow();

private:
    Ui::CMainWindow *ui;

    // QWidget interface
protected:
    //方法1对应的事件函数
    void contextMenuEvent(QContextMenuEvent *event);

private slots:
    //方法2信号触发的槽函数
    void on_tableViewCustomContextMenuRequested(const QPoint &pos);
};

#endif // CMAINWINDOW_H

CMainWindow.cpp(包含槽函数和事件函数的实现以及其他注意事项)

#include "CMainWindow.h"
#include "ui_CMainWindow.h"
#include <QMenu>
#include <QStandardItemModel>

CMainWindow::CMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::CMainWindow)
{
    ui->setupUi(this);
    //调用setContextMenuPolicy并设置其值(如果不添加这行,对应的控件则不会发出对应的信号)
    ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
    //连接右键菜单对应的信号槽
    connect(ui->tableView, &QTableView::customContextMenuRequested
            , this, &CMainWindow::on_tableViewCustomContextMenuRequested);

    //创建视图控件对应的模型
    QStandardItemModel *model = new QStandardItemModel(ui->tableView);
    //将模型添加到视图控件中
    ui->tableView->setModel(model);
    for(int row = 0; row != 3; ++row)
    {
        for(int colum = 0; colum != 3; ++colum)
        {
            //循环添加view中的数据
            model->setItem(row, colum, new QStandardItem(
                               QString("Row:%1, Colum:%2").arg(row).arg(colum)));
        }
    }

}

CMainWindow::~CMainWindow()
{
    delete ui;
}

//方法1
void CMainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    Q_UNUSED(event);
    QMenu menu;
    //添加右键菜单的选项
    menu.addAction("方法1:选项1");
    menu.addAction("方法1:选项2");
    menu.addAction("方法1:选项3");
    //显示menu菜单并设置其显示位置为鼠标位置
    menu.exec(QCursor::pos());
}

//方法2
void CMainWindow::on_tableViewCustomContextMenuRequested(const QPoint &pos)
{
    //! 拓展:此处的pos函数可以使用QTableView的indexAt \
        函数获取当前鼠标下控件的QModelIndex对象(可用于判断操作)
    Q_UNUSED(pos);
    QMenu menu;
    //添加右键菜单的选项
    menu.addAction("方法2:选项1");
    menu.addAction("方法2:选项2");
    menu.addAction("方法2:选项3");
    //显示menu菜单并设置其显示位置为鼠标位置
    menu.exec(QCursor::pos());
}

温馨提示:通过信号触发的槽函数可通过ui文件右击控件,在弹出的菜单中选择转到槽,选择对应的信号,系统会自动连接信号槽和创建槽函数

总结

方法1适用于整个界面大部分的右键菜单相同时使用;方法2 则适用于窗口中只有部分控件包含右键菜单或不同的右键菜单的情况;如示例图一样,在tableview中的右键菜单和在窗口其他位置点击的右键菜单不同一样。
右键菜单其实也可以通过鼠标事件实现,并且其使用方法和方法1类似,不过需要判断鼠标按钮。
值得一提的是当点击右键菜单中的选项时,会发出triggered信号,可通过该信号连接槽函数做出对应的操作,在添加右键菜单项的时候也可设置槽函数等。

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除文章来源地址https://www.toymoban.com/news/detail-607145.html

到了这里,关于Qt创建右键菜单的两种通用方法(QTableView实现右键菜单,含源码+注释)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python创建多线程的两种常用方法

    这篇文章主要为大家详细介绍了Python中创建多线程的两种常用方法,文中的示例代码简洁易懂,对我们掌握Python有一定的帮助,需要的可以收藏一下 经过总结,Python创建多线程主要有如下两种方法: 函数 类 接下来,我们就来揭开多线程的神秘面纱。 在Python3中,Python提供了

    2024年02月15日
    浏览(27)
  • Qt+OpenCV显示图片的两种方法(代码演示)

    导  读     本文主要介绍Qt+OpenCV显示图像的两种方法,并通过代码演示效果。 背景介绍     OpenCV本身提供了一些GUI方法,但使用起来仍有局限性。以C++为例,实际应用中我们大多会使用Qt或MFC来编写GUI程序。相较之下,Qt比MFC更易上手且界面样式更丰富,所以越来越多的

    2024年02月07日
    浏览(32)
  • 【Qt】QThread & moveTothread-多线程的两种实现方法

    一、如何理解多线程 二、实现多线程的两种方式(面向应用) 2.1 继承 QThread 的类 2.2 (推荐这种方式)函数 moveTothread() 三、多线程的释放问题(善后工作) 类似我们单片机的编程,如在 Keil5 中对 51 单片机或者 STM32 单片机进行编程时,如果我们使用模块化编程,那么 main.c 文

    2024年02月01日
    浏览(33)
  • 在Qt窗口中添加右键菜单

    需要使用:事件处理器函数(回调函数) 在当前窗口类中重写鼠标操作相关的的事件处理器函数,有两个可以选择 在数据表事件处理器函数内部判断是否按下了鼠标右键 如果按下了鼠标右键创建菜单对象(也可以提前先创建处理), 并将其显示出来 在头文件中,添加 mousePressEvent

    2024年02月11日
    浏览(27)
  • 微信小程序 分享的两种方式:菜单级和按钮级

    在使用微信小程序的时候,我们可能会设计到一些视频的一些分享等,那么视频分享也分为两种方式,例如下图,当我们点击的时候,进行一个转发分享的一个操作 那么在原先代码的基础上,我们需要在原先代码的基础上button按钮上设置open-type=“share” 添加完open-type=\\\"share\\\"后

    2024年02月20日
    浏览(31)
  • QT打包的两种方式

    QT打包的两种方式: 一个是QT5自带的windeployqt(不需要下载安装),它可以找到程序(exe)用到的所有库文件,并且都拷贝到exe程序的当前文件。此时打包的exe较小,需要和拷贝进来的文件放一起运行,也可以将这些文件再次打包成一个大的exe文件,此时用的第二种打包方式

    2024年02月16日
    浏览(36)
  • git bash右键菜单失效解决方法

    git bash右键菜单失效解决方法 这几天重新更新了git,直接安装新版本后,右键菜单失效找不到了。找了好几个博客,发现都不全面,最后总结一下解决方法: (1)按win+r,输入regedit打开注册表,然后分别修改4个位置路径,修改为最后安装的软件的路径。 (2).修改如下四处

    2024年01月24日
    浏览(30)
  • Qt多线程使用的两种方式

    方式1 :继承自QThread类,重载run函数。此实现方法只有run()函数内的代码是运行在子线程内。 (不使用事件循环) 使用方法 : (1)run函数内有一个while或for的死循环(模拟耗时操作); (2)通过一个 标记位 来控制死循环的退出; (3)run()函数中无限循环记得 强制休息

    2023年04月10日
    浏览(33)
  • QT基础:event 函数重载、筛选鼠标按压事件、获取鼠标位置、右键显示菜单、修改鼠标样式功能演示

    这里演示的是QT基础,主要包含: event 函数重载、筛选鼠标按压事件、获取鼠标位置、右键显示菜单、修改鼠标样式等功能演示, 适合初学者食用 。 演示功能:点击鼠标左键、右键、中键、左右键同时点击,输出鼠标当前坐标;按下鼠标中键,鼠标样式被替换,按下鼠标左

    2024年02月09日
    浏览(31)
  • Qt中实现页面切换的两种方式

    在Qt中,可以使用QStackedWidget来实现两个UI界面的互相转换。QStackedWidget是一个堆叠窗口小部件,可以在其中添加多个子窗口,并且只显示其中一个子窗口。 注意:QStackedWidget只能用来装widget,不能装mainwindow!! ! 注意: 上面这种想法是错的! 下面这种想法才是对的! 注意

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包