1.信号槽连接
this->connect(d->ui->treeWidget, SIGNAL(customContextMenuRequested(QPoint)),
this, SLOT(showTreeRightMenu(QPoint)));
2。showTreeRightMenu(QPoint)的实现
//实例化右键菜单
QMenu* menu = new QMenu;
//实例化右键菜单选项
static QActionGroup *layerGroup = mapApp->actionGroup("layer");
static QAction *propertyTableAction = mapApp->action("layer","property");
//连接菜单选项点击信号与槽函数
this->connect(propertyTableAction, SIGNAL(triggered(bool)), this, SLOT(menuM1()));
QTreeWidgetItem* item = d->ui->treeWidget->itemAt(pos); //关键
if (item->type() == 1000)
{
menu->addAction(propertyTableAction);
}
//移动菜单出现在鼠标点击的位置
menu->move(d->ui->treeWidget->cursor().pos());
menu->show();
3.menuM1()的实现
按自己需求随便写
/**************************下文为转载的参考文献******************************************/
转载1:
在用QT编程时,有时候要实现鼠标右键弹出菜单的功能.下面代码演示鼠标右键弹出菜单.
1.新建一个QT工程,点击MainWindow.ui,鼠标右键Go to slot.....,添加customContextMenuRequested(const QPoint &pos)事件
2.找到属性页中的contextMenuPolicy,把DefaultContextMenu改成CustomContextMenu.保存关闭MainWindow.ui
3.在on_MainWindow_customContextMenuRequested(const QPoint &pos)函数体添加一下代码
void MainWindow::on_MainWindow_customContextMenuRequested(const QPoint &/*pos*/)
{
//创建菜单对象
QMenu *pMenu = new QMenu(this);
QAction *pNewTask = new QAction(tr("新建任务"), this);
QAction *pEditTask = new QAction(tr("设置任务"), this);
QAction *pDeleteTask = new QAction(tr("删除任务"), this);
QAction *pToolRenName = new QAction(tr("改名工具"), this);
QAction *pToolEdot = new QAction(tr("设置工具"), this);
QAction *pToolDelete = new QAction(tr("删除工具"), this);
//1:新建任务 2:设置任务 3:删除任务 4:改名工具 5:设置工具 6:删除工具
pNewTask->setData(1);
pEditTask->setData(2);
pDeleteTask ->setData(3);
pToolRenName->setData(4);
pToolEdot->setData(5);
pToolDelete ->setData(6);
//把QAction对象添加到菜单上
pMenu->addAction(pNewTask);
pMenu->addAction(pEditTask);
pMenu->addAction(pDeleteTask);
pMenu->addAction(pToolRenName);
pMenu->addAction(pToolEdot);
pMenu->addAction(pToolDelete);
//连接鼠标右键点击信号
connect(pNewTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pEditTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pDeleteTask, SIGNAL(triggered()), SLOT(onTaskBoxContextMenuEvent()));
connect(pToolRenName, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pToolEdot, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pToolDelete, SIGNAL(triggered()), SLOT(onTaskBoxContextMenuEvent()));
//在鼠标右键点击的地方显示菜单
pMenu->exec(cursor().pos());
//释放内存
QList<QAction*> list = pMenu->actions();
foreach (QAction* pAction, list) delete pAction;
delete pMenu;
}
void MainWindow::onTaskBoxContextMenuEvent()
{
QAction *pEven = qobject_cast<QAction *>(this->sender()); //this->sender()就是发信号者 QAction
//获取发送信息类型 1:新建任务 2:设置任务 3:删除任务 4:改名工具 5:设置工具 6:删除工具
int iType = pEven->data().toInt();
switch (iType)
{
case 1:
QMessageBox::about(this, "tip", pEven->text());
break;
case 2:
QMessageBox::about(this, "tip", pEven->text());
break;
case 3:
QMessageBox::about(this, "tip", pEven->text());
break;
case 4:
QMessageBox::about(this, "tip", pEven->text());
break;
case 5:
QMessageBox::about(this, "tip", pEven->text());
break;
case 6:
QMessageBox::about(this, "tip", pEven->text());
break;
default:
break;
}
}
转载链接:QMenu----QT鼠标右键弹出菜单 - 程序员大本营
转载2:
问题描述
在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("树的根节点!"));
}
————————————————
版权声明:本文为CSDN博主「MoreBoldness」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tadpole099/article/details/74097051