文章目录

  • 一、右键菜单(方法1+方法2)的示例
  • 二、右键菜单实现的两种方法及其区别(个人理解)
  • 方法1
  • 方法2
  • 方法区分:
  • 三、源码
  • CMainWindow.h(包含槽函数和事件函数的定义)
  • CMainWindow.cpp(包含槽函数和事件函数的实现以及其他注意事项)
  • 总结


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

下图为两种右键菜单实现的示例图,源码在本文第三节(源码含详细注释)。

QT QTreeWidgetItem 添加右键菜单_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^/)

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