确定菜单的位置,及获取鼠标选中的项(QTreeWidgetItem)

mainwindow.h
cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTreeWidget>
#include <QTreeWidgetItem>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QTreeWidget *treeWidget;
QMenu* treeMenu;
QAction* actionTreeExpand;
QAction* actionTreeFold;
//这三个可以闪
QAction* actionRealDevice;
QAction* actionSimulation;
QAction* actionHang;
QTreeWidgetItem* selectItem;
void treeShowMenu(const QPoint &pos);
void expandTreeItem();
void foldTreeItem();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建主窗口
treeWidget=ui->tw_device_tree;
treeWidget->setWindowTitle("动物分类展示");
treeWidget->setColumnCount(1);
treeWidget->setHeaderLabels({"动物种类"});
// 创建蛙类父项
QTreeWidgetItem *frogParentItem = new QTreeWidgetItem(treeWidget);
frogParentItem->setText(0, "蛙类");
// 为蛙类添加子项
QStringList frogList = {"青蛙", "牛蛙", "蛤蟆", "箭毒蛙"};
for (const QString &frog : frogList) {
QTreeWidgetItem *frogItem = new QTreeWidgetItem(frogParentItem);
frogItem->setText(0, frog);
}
// 创建鱼类父项
QTreeWidgetItem *fishParentItem = new QTreeWidgetItem(treeWidget);
fishParentItem->setText(0, "鱼类");
// 为鱼类添加子项
QStringList fishList = {"草鱼", "鲤鱼", "金鱼"};
for (const QString &fish : fishList) {
QTreeWidgetItem *fishItem = new QTreeWidgetItem(fishParentItem);
fishItem->setText(0, fish);
}
// 展开所有项
treeWidget->expandAll();
// 显示窗口
treeWidget->show();
treeMenu = new QMenu(ui->tw_device_tree);
actionTreeExpand = new QAction("展开", treeMenu);
actionTreeFold = new QAction("折叠", treeMenu);
//下面这三个可以删除
actionRealDevice->setObjectName("RealDevice");
actionSimulation->setObjectName("Simulation");
actionHang->setObjectName("hanging");
treeMenu->addActions({actionTreeExpand, actionTreeFold, actionRealDevice , actionSimulation , actionHang});
treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(treeWidget, &QTreeWidget::customContextMenuRequested, this, &MainWindow::treeShowMenu);
connect(actionTreeExpand, &QAction::triggered, this, &MainWindow::expandTreeItem);
connect(actionTreeFold, &QAction::triggered, this, &MainWindow::foldTreeItem);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::treeShowMenu(const QPoint &pos)
{
if(ui->tw_device_tree->itemAt(pos) != nullptr){
selectItem = ui->tw_device_tree->itemAt(pos);
treeMenu->exec(QCursor::pos());
}else{
return;
}
}
void MainWindow::expandTreeItem()
{
if(selectItem != nullptr){
if(selectItem->parent() == nullptr){
ui->tw_device_tree->expandAll();
}else{
ui->tw_device_tree->expandItem(selectItem);
}
selectItem = nullptr;
}
}
void MainWindow::foldTreeItem()
{
if(selectItem != nullptr){
if(selectItem->parent() == nullptr){
ui->tw_device_tree->collapseAll();
}else{
ui->tw_device_tree->collapseItem(selectItem);
}
selectItem = nullptr;
}
}