建立QTreeWidget下QTreeWidgetItem的右键菜单

基本思路:

  这里要考虑的问题有两个,一个是QTreeWidgetItem的右键功能,一个是确认点击右键之后实现菜单功能。关于QTreeWidgetItem下右键的功能的实现,使用QTreeWidgetItem信号,然后判断是否按下的为鼠标右键。关于菜单功能的实现,则是创建一个QMenu对象,然后将要实现的菜单功能包装到QAction对应的槽函数中。

下面以一个简单的Qt Widgets Application工程为例说明具体实现:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    QAction * test;   //自定义的QAction
private slots:
    void testSlot();   //与QAction想关联的槽函数
    void itemPressedSlot(QTreeWidgetItem *, int);   //用来判断是否是鼠标右键按下的槽函数
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    test = new QAction("test", ui->treeWidget);   //因为是在QTreeWidget内实现右键,所以以其作为父类

    connect(ui->treeWidget, SIGNAL(itemPressed(QTreeWidgetItem*,int)), this, SLOT(itemPressedSlot(QTreeWidgetItem*,int)));
    connect(test, SIGNAL(triggered(bool)), this , SLOT(testSlot()));
}

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

void MainWindow::testSlot()
{
    qDebug() << "Hello, Action";
}

void MainWindow::itemPressedSlot(QTreeWidgetItem * pressedItem, int column)
{
    if(qApp->mouseButtons() == Qt::RightButton)   //判断是否为右键
    {
        QMenu*menu = new QMenu(ui->treeWidget);
        if (pressedItem->text(column) == "A")   //在我的QTreeWidget对象中,有三个QTreeWidgetItem对象,其中有一个内容为“A”
        {
            menu->addAction(test);
            menu->exec(QCursor::pos());   //菜单弹出位置为鼠标点击位置
        }
    }
}

这里不要使用下面的方法实现右键功能

  if(qApp->mouseButtons() == Qt::RightButton)
    {
        ui->treeWidget->addAction(test);
        ui->treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
 }
这样实现的是整个QTreeWidget对象上的右键功能,而不是一个QTreeWidgetItem下的右键功能。


你可能感兴趣的:(建立QTreeWidget下QTreeWidgetItem的右键菜单)