• (四)Qt之右键菜单


    1、右键菜单创建和显示

    作为一种交互性强、使用方便的右键菜单在程序中是非常常用的,在Qt中可以轻松的实现。

    QMenu menu; 
    
    //添加菜单项,指定图标、名称、响应函数
    
    menu.addAction(QIcon("1.png"), QStringLiteral("添加"),this,SLOT(OnBscGroupRightAction())); 
    
    //在鼠标位置显示
    
    menu.exec(QCursor::pos());

    2、右键菜单关联控件

    QWidget及其子类都可有右键菜单,首先设置QWidget与右键菜单有关的函数setContextMenuPolicy(),属性对应项为contextmenuPolicy。

    setContextMenuPolicy函数的参数为枚举类型Qt::ContextMenuPolicy,qt帮助文档中有相应介绍:

    image

    a、Qt::DefaultContextMenu

    默认是Qt::DefaultContextMenu,它是利用右键菜单事件contextMenuEvent()来处理(which means the contextMenuEvent() handler is called)。就是要重写contextMenuEvent( QContextMenuEvent * event )函数。

    你可以通过UI属性来设置:

    image

    void MainWindow::contextMenuEvent(QContextMenuEvent *event)
    
    {
    
        QMenu Context;
    
        Context.addAction(ui->actionAdd);
    
        Context.exec(QCursor::pos());
    
    }

    b、Qt::CustomContextMenu

    它是发出QWidget::customContextMenuRequested信号,注意仅仅只是发信号,意味着要自己写显示右键菜单的slot。这个信号是QWidget唯一与右键菜单有关的信号(也是自有的唯一信号),同时也是很容易被忽略的signal:
    void customContextMenuRequested ( const QPoint & pos )

    一般来说为了方便,我们会省略自己添加connect来关联槽函数,而是采用默认的槽函数,默认槽函数命名规则:void on_控件ID_customContextMenuRequested(const QPoint &pos);

    void BscServer::on_treeView_customContextMenuRequested(const QPoint &pos) 
    
    { 
    
        QModelIndex index=ui.treeView->currentIndex(); 
    
        QStandardItem *item = m_pMenuMgr->GetModel()->itemFromIndex(index);
    
        CMenuItemData *data = dynamic_cast<CMenuItemData*>(item);
    
        //根据右键类容显示菜单
    
        ShowContextMenu(data);
    
    }

    c、Qt::ActionsContextMenu

    该类型比较简单,直接使用QWidget::actions()函数添加动作即可,点击右键就会自动弹出菜单。

    如对于QTableView控件,设置如下:

    image

       //添加右键菜
    
        ui.tableView->addAction(ui.action_add);
    
        ui.tableView->addAction(ui.action_del);
    
        //右键处理事件
    
        connect(ui.action_add, SIGNAL(triggered()), this, SLOT(addRecord()));
    
        connect(ui.action_del, SIGNAL(triggered()), this, SLOT(delRecord()));
  • 相关阅读:
    oracle 判断字符串是否包含指定内容
    java 如何使用多线程调用类的静态方法?
    oracle 快速复制表结构、表数据
    oracle 清空表数据的2种方式及速度比较
    一、Instrument之Core Animation工具
    net登录积分(每天登录积分仅仅能加一次) 时间的比較
    正规方程 Normal Equation
    笑谈贝叶斯网络(干货)上
    SQL SERVER 面试题
    好的创始人想要改变世界,最好的创始人还要不放弃——扎克伯格清华中文演讲
  • 原文地址:https://www.cnblogs.com/lingluotianya/p/3642605.html
Copyright © 2020-2023  润新知