QT-QTreeWidget添加右键菜单响应时间的笔记

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

上一篇:qtreewidget 显示保存xml文件


下一篇:python – 暂时抑制PyQt事件?