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.运行结果如下所示:

  • 相关阅读:
    空格在科技类文章中对阅读体验的影响
    命令行程序增加 GUI 外壳
    贝塞尔曲线控件 for .NET (EN)
    ASCII Art ヾ(≧∇≦*)ゝ
    字符型液晶屏模拟控件(En)
    🃏 用扑克牌编码信息
    <3>Centos系统完整安装python流程
    <自动化测试方案_7>第七章、PC端UI自动化测试
    性能测试方案(-)
    如何自动生成测试用例方案
  • 原文地址:https://www.cnblogs.com/LuckCoder/p/10918523.html
Copyright © 2011-2022 走看看