zoukankan      html  css  js  c++  java
  • QMenu:QT鼠标右键弹出菜单

    在用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;
        }
    }

    4.运行结果如下所示:

  • 相关阅读:
    Java实现多线程的四种实现方式
    电梯调度算法[转]
    带黑洞的随机游走问题
    深度学习印象
    使用jupyterthemes插件定制jupyter notebook界面
    tf.gfile
    中国象棋残局库构建[抄]
    Android(Linux)线路规程的使用
    Remote Displayer for Android V1.2
    Android开发资源汇总
  • 原文地址:https://www.cnblogs.com/acmexyz/p/11551565.html
Copyright © 2011-2022 走看看