问题描述
在QT界面编程中,经常会涉及到QTreeWidget右键菜单的功能,可能需要针对不同的右击情况有不同的菜单:
1. 根节点(root)的右键菜单
2. 孩子节点(child)的右键菜单
3. 有树,但没有右击节点的右键菜单
4. 没有树的右键菜单
以及点击菜单选项有相应的响应
解决方案
结果演示:
不同位置有不同的右键菜单
!
点击菜单选项弹出的提示对话框
下面是工程代码,里面有详细的说明
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTreeWidgetItem>
#include <QMessageBox>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void setupTreeWidget();
public slots:
void showTreeRightMenu(QPoint);
//右键菜单选项槽函数
void menuM1();
private:
Ui::MainWindow *ui;
enum itemType{root = QTreeWidgetItem::UserType,child};
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化树窗口,并添加两棵树
this->setupTreeWidget();
/////////////////////////////第一步///////////////////////////////////////
//为treeWidget选择右键用户自定义菜单
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
//连接树窗口右键信号与用户自定义菜单槽函数,这里的QPoint是树窗口
//任意坐标位置
this->connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),
this,SLOT(showTreeRightMenu(QPoint)));
/////////////////////////////////////////////////////////////////////////
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setupTreeWidget()
{
//始能树窗口
ui->treeWidget->setEnabled(true);
//实例化第一棵树的根节点,并标记为root类型
QTreeWidgetItem* tree1 = new QTreeWidgetItem(QStringList("tree1"),root);
//实例化第一棵树的孩子,并标记为child类型
QTreeWidgetItem* child1 = new QTreeWidgetItem(QStringList("child1"),child);
//为第一棵树添加孩子
tree1->addChild(child1);
//实例化第二棵树
QTreeWidgetItem* tree2 = new QTreeWidgetItem(QStringList("tree2"),root);
QTreeWidgetItem* child2 = new QTreeWidgetItem(QStringList("child2"),child);
tree2->addChild(child2);
//添加树到树窗口
ui->treeWidget->addTopLevelItem(tree1);
ui->treeWidget->addTopLevelItem(tree2);
}
/////////////////////////////第二步///////////////////////////////////////
void MainWindow::showTreeRightMenu(QPoint pos)
{
//实例化右键菜单
QMenu* menu = new QMenu;
//实例化右键菜单选项
QAction* m1 = new QAction("树的根节点!");
QAction* m2 = new QAction("树的孩子节点");
QAction* m3 = new QAction("没有树存在!");
QAction* m4 = new QAction("有树,但是没有右击树节点");
//连接菜单选项点击信号与槽函数
this->connect(m1,SIGNAL(triggered(bool)),this,SLOT(menuM1()));
//根据pos判断鼠标右击位置是树的根节点root,还是孩子节点child,或者都不是
//鼠标右击的位置是树的节点,则item是对应的节点信息,否则为NULL
QTreeWidgetItem* item = ui->treeWidget->itemAt(pos);//关键
if(item)
{
//判断item是root还是child
switch(item->type())
{
case root:
//添加菜单选项
menu->addAction(m1);
break;
case child:
//添加菜单选项
menu->addAction(m2);
break;
}
}
else
{
//没有树存在
if(ui->treeWidget->topLevelItemCount() == 0)
//添加菜单选项
menu->addAction(m3);
//有树存在,但是没有右击树中的节点
else
//添加菜单选项
menu->addAction(m4);
}
//移动菜单出现在鼠标点击的位置
menu->move(ui->treeWidget->cursor().pos());
menu->show();
}
///////////////////////////////////////////////////////////////////
/////////////////////////第三步/////////////////////////////////////
void MainWindow::menuM1()
{
QMessageBox::warning(this,tr("提示"),tr("树的根节点!"));
}