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

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

下图为两种右键菜单实现的示例图,源码在本文第三节(源码含详细注释)。
在这里插入图片描述
提示:不会使用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^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

  • 25
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
对于QTableView,可以通过使用QMenu和QAction来实现右键菜单。以下是一个简单的示例代码: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QMenu, QAction, QMessageBox from PyQt5.QtCore import Qt class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("QTableView右键菜单示例") # 创建QTableView self.table_view = QTableView(self) self.setCentralWidget(self.table_view) # 创建右键菜单 self.context_menu = QMenu(self.table_view) self.delete_action = QAction("删除", self) self.context_menu.addAction(self.delete_action) # 绑定右键菜单信号 self.table_view.setContextMenuPolicy(Qt.CustomContextMenu) self.table_view.customContextMenuRequested.connect(self.show_context_menu) # 绑定删除动作的槽函数 self.delete_action.triggered.connect(self.delete_row) def show_context_menu(self, pos): # 显示右键菜单 global_pos = self.table_view.mapToGlobal(pos) self.context_menu.exec_(global_pos) def delete_row(self): # 获取当前选中的行 selected_row = self.table_view.currentIndex().row() if selected_row >= 0: # 在这里编写删除行的代码 QMessageBox.information(self, "提示", "删除行:" + str(selected_row)) if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 这个例子创建了一个带有QTableView的主窗口,并在QTableView实现了一个右键菜单右键菜单有一个"删除"动作,当用户选择该动作时,会弹出一个消息框显示删除的行号。 你可以根据实际需求修改和扩展这个示例代码,来满足你的具体需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lw向北.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值