一、引言

如图,我们需要在一个QTreeWidget 控件中添加了自定义右键菜单。
Qt : 在QTreeWidget中添加自定义右键菜单-LMLPHP

二、思路

如何做到的呢,很简单。浅浅记录和分享一下。

继承QTreeWidget,定义一个子类CustomTreeWidget ,在重写contextMenuEvent 事件即可。

三、代码

#include <QTreeWidget>
#include <QAction>
#include <QMenu>
#include <QContextMenuEvent>

class CustomTreeWidget : public QTreeWidget
{
    Q_OBJECT
public:
    CustomTreeWidget(QWidget* parent = nullptr);
protected:
    void contextMenuEvent(QContextMenuEvent* event) override;
signals:
};
#include "CustomTreeWidget.h"
#include <QComboBox>
#include <QDoubleSpinBox>
#include "NoWheelUiControls.h"

CustomTreeWidget::CustomTreeWidget(QWidget *parent) : QTreeWidget(parent)
{
}

void CustomTreeWidget::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu menu(this);
    QAction* addGroupAction = menu.addAction(QStringLiteral("添加组"));
    QAction* deleteGroupAction = menu.addAction(QStringLiteral("删除当前组"));
    QAction* addChildAction = menu.addAction(QStringLiteral("添加子项"));
    QAction* deleteOneAction = menu.addAction(QStringLiteral("删除当前项"));

    QList<QTreeWidgetItem*> items = selectedItems();
    if(items.isEmpty()) return;

    QAction* selectedItem = menu.exec(event->globalPos());

    if (selectedItem == addGroupAction) { // 新建组
        // add codes here
    } else if (selectedItem == deleteGroupAction) {// 删除组
    	// add codes here
    }else if(selectedItem == addChildAction) { // 添加项
		// add codes here
    }else if(selectedItem == deleteOneAction) { // 删除项
     	// add codes here
    }
    update();
}

四、演示效果

Qt : 在QTreeWidget中添加自定义右键菜单-LMLPHP

04-26 13:34