精华内容
下载资源
问答
  • Qt右键菜单

    2019-05-20 07:19:49
    Qt右键菜单 所谓“右键菜单”,可以这样来看:右键+菜单。所以可以定义一个菜单,然后重写鼠标点击事件,令菜单在鼠标右击的时候弹出来。这种方法是可以的,但是Qt提供了一种专门用于右键菜单的方法,且看下面这个...

    Qt右键菜单

    所谓“右键菜单”,可以这样来看:右键+菜单。所以可以定义一个菜单,然后重写鼠标点击事件,令菜单在鼠标右击的时候弹出来。这种方法是可以的,但是Qt提供了一种专门用于右键菜单的方法,且看下面这个属性:

    Qt::ContextMenuPolicy

    通过函数setContextMenuPolicy()来设置一个widget上面显示的菜单的属性。

    1. Qt::DefaultContextMenu

    这个属性的默认值是Qt::DefaultContextMenu,此时需要调用函数contextMenuEvent(),重写其中的内容。

    void MenuTest::contextMenuEvent(QContextMenuEvent *)

    {

        QMenu *menu = new QMenu(this);

        menu->addAction(tr("花好月圆"));

        menu->addAction(tr("似水流年"));

        menu->exec(QCursor::pos());

    }

    这个属性的其它值有Qt::NoContextMenuQt::PreventContextMenuQt::ActionsContextMenu以及Qt::CustomContextMenu

    2. Qt::ActionsContextMenu

    ui.treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);//设置属性

    QAction *act1 = new QAction(tr(""), this);

    ui.treeWidget->addAction(act1);

    QAction *act2 = new QAction(tr(""), this);

    ui.treeWidget->addAction(act2);

    这种方法也很简单,但依然不够灵活。

    3.Qt::CustomContextMenu

    使用Qt::CustomContextMenu时会发出信号 customContextMenuRequested()。通过该信号,可以获得当前鼠标的位置,通过位置可以做更多我们想做的事。下面是一个简单的完整的例子。

    头文件:

    #ifndef MENUTEST_H

    #define MENUTEST_H

     

    #pragma execution_character_set("utf-8")

    #include <QtWidgets/QWidget>

    #include <QMenu>

    #include "ui_menutest.h"

     

    class MenuTest : public QWidget

    {

        Q_OBJECT

     

    public:

        MenuTest(QWidget *parent = 0);

        ~MenuTest();

     

    private:

        Ui::MenuTestClass ui;

        QMenu *m_pCustomMenu;//右键菜单

     

    private slots:

        void TreeWidgetMenuSlot(const QPoint &);//鼠标右击,弹出菜单槽函数

        void MenuActionSlot(QAction *);//点击菜单中项的槽函数

    };

     

    #endif // MENUTEST_H

    具体实现:

    #include <QDebug>

    #include "menutest.h"

     

    MenuTest::MenuTest(QWidget *parent)

        : QWidget(parent)

        , m_pCustomMenu(NULL)

    {

        ui.setupUi(this);

        ui.treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);//设置属性

        //右击时会发出信号,然后建立槽连接

        connect(ui.treeWidget, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(TreeWidgetMenuSlot(const QPoint &)));

    }

     

    MenuTest::~MenuTest()

    {

    }

     

    void MenuTest::TreeWidgetMenuSlot(const QPoint &)

    {

        if (m_pCustomMenu == NULL)

        {

            m_pCustomMenu = new QMenu(this);

            connect(m_pCustomMenu, SIGNAL(triggered(QAction *)), this, SLOT(MenuActionSlot(QAction *)));

        }

        m_pCustomMenu->clear();

        QAction *act1 = new QAction(tr(""), m_pCustomMenu);

        act1->setData(1);

        m_pCustomMenu->addAction(act1);

     

        QAction *act2 = new QAction(tr(""), m_pCustomMenu);

        act2->setData(2);

        m_pCustomMenu->addAction(act2);

     

        QAction *act3 = new QAction(tr(""), m_pCustomMenu);

        act3->setData(3);

        m_pCustomMenu->addAction(act3);

     

        QAction *act4 = new QAction(tr("绿"), m_pCustomMenu);

        act4->setData(4);

        m_pCustomMenu->addAction(act4);

     

        m_pCustomMenu->popup(QCursor::pos());

    }

     

    void MenuTest::MenuActionSlot(QAction *act)

    {

        if (act == NULL)

        {

            return;

        }

        int nData = act->data().toInt();

        switch (nData)

        {

        case 1:

            qDebug() << "好花好景好时光";

            break;

        case 2:

            qDebug() << "画堂春暖不胜香";

            break;

        case 3:

            qDebug() << "红裙舞动燕飞忙";

            break;

        case 4:

            qDebug() << "一片行云到画堂";

            break;

        default:

            break;

        }

    }

    注:上面的例子中使用了switch语句,可能对效率有影响,所以我们可以为每个action建立信号槽连接。

    展开全文
  • qt右键菜单

    2021-02-26 18:28:39
    (四)Qt右键菜单 1、右键菜单创建和显示 作为一种交互性强、使用方便的右键菜单在程序中是非常常用的,在Qt中可以轻松的实现。 QMenu menu; //添加菜单项,指定图标、名称、响应函数 menu....

    (四)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()));
    
    展开全文
  • QT右键菜单

    2018-04-04 09:47:18
    QT界面设计Qmenu的使用,ListWidget的使用。使用右键增加或删除一个list
  • QT右键菜单测试.rar

    2020-04-09 16:45:37
    该程序演示了自定义QT右键菜单的方法,其它菜单与此雷同,稍作修改即可 QT版本:5.9 QT自定义右键菜单示例代码
  • Qt 右键菜单

    2017-11-27 16:44:37
    QTreeWidget 右键不响应问题。 查看源码发现,基类...button() == Qt::LeftButton)emit clicked(index);” ,所以右键点击不会有响应的消息。 解决方案: 查询资料发现类“QWidget”可设置上下文菜单策略(...

    QTreeWidget 右键不响应问题。

    查看源码发现,基类QAbstractItemView中鼠标单击事件mouseReleaseEvent有一句左键的判断“if (event->button() == Qt::LeftButton)emit clicked(index); ,所以右键点击不会有响应的消息。

    解决方案:

    查询资料发现类QWidget可设置上下文菜单策略(“setContextMenuPolicy(Qt::ContextMenuPolicy policy);”),就是为单击右键弹出菜单准备的,而QWidgetQAbstractItemView的基类

    设置:setContextMenuPolicy(Qt::CustomContextMenu);”,会在customContextMenuRequested(const QPoint &pos);”响应右键事件。

    转:(http://blog.51cto.com/laokaddk/697402

     

    customContextMenuRequested

     

     

    要在某一种窗体内添加右键菜单栏,比如在QTreeWidget中添加,

    可以用到slot函数customContextMenuRequested(QPoint pos)。

     

    如果是在Qt Creator中,则操作过程为:右击QTreeWidget-->go to slot--

    -->选择customContextMenuRequested(QPoint pos)。

     

    然后,在新建的customContextMenuRequested(QPoint pos)函数中便可以实现具体的菜单栏了。

     

    为了判断右键点击的位置,即点即不同的item节点,会出现不同的右键菜单,我们可以用API中itemAt()函数实现。

    而为了给每个节点赋予不同的键值,可以通过setData()来实现。

     

    我在TreeWidget中添加右键菜单的实现代码:

     

     

     

     

     

    建立TreeWidget根节点的代码实现:

     

     

     

    view plain

    1. QTreeWidgetItem *root;      
    2. root = new QTreeWidgetItem(ui->treeWidget, QStringList(QString("Connection")));  
    3. QVariant var0(0);  
    4. root->setData(0,Qt::UserRole,var0);  

     

    view plain

    1. void MainWindow::on_treeWidget_customContextMenuRequested(QPoint pos)  
    2. {  
    3.     QTreeWidgetItem* curItem=ui->treeWidget->itemAt(pos);  //获取当前被点击的节点  
    4.     if(curItem==NULL)return;           //这种情况是右键的位置不在treeItem的范围内,即在空白位置右击  
    5.     if(0==curItem->data(0,Qt::UserRole))      //data(...)返回的data已经在之前建立节点时用setdata()设置好  
    6.     {  
    7.        QMenu *popMenu =new QMenu(this);//定义一个右键弹出菜单  
    8.   
    9.        popMenu->addAction(ui->action_newDB);//往菜单内添加QAction   该action在前面用设计器定义了  
    10.        popMenu->addAction(ui->action_openDB);  
    11.        popMenu->addAction(ui->action_delDB);  
    12.        popMenu->exec(QCursor::pos());//弹出右键菜单,菜单位置为光标位置  
    13.     }  
    14.     else  
    15.     {  
    16.         QMenu *popMenu =new QMenu(this);//定义一个右键弹出菜单  
    17.   
    18.         popMenu->addAction(ui->action_newTable);//往菜单内添加QAction   该action在前面用设计器定义了  
    19.         popMenu->addAction(ui->action_openTable);  
    20.         popMenu->addAction(ui->action_designTable);  
    21.         popMenu->exec(QCursor::pos());//弹出右键菜单,菜单位置为光标位置  
    22.     }  
    23. }  

     

    注意:

    还要在MainWindow的构造函数中加入:

    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    否则不会出现右键!!

    展开全文
  • qt 右键菜单

    2012-11-28 17:33:34
    QWidget及其子类都可有右键菜单,因为QWidget有以下两个与右键菜单有关的函数: Qt::ContextMenuPolicy contextMenuPolicy () const void setContextMenuPolicy ( Qt::ContextMenuPolicy policy ) Qt::...
    
    

    QWidget及其子类都可有右键菜单,因为QWidget有以下两个与右键菜单有关的函数:

    Qt::ContextMenuPolicy contextMenuPolicy () const

    void setContextMenuPolicy ( Qt::ContextMenuPolicy policy )

    Qt::ContextMenuPolicy枚举类型包括:Qt::DefaultContextMenu, Qt::NoContextMenu, Qt::PreventContextMenu, Qt::ActionsContextMenu, and Qt::CustomContextMenu。

    使用方式如下:


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


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

    void customContextMenuRequested ( const QPoint & pos )

    该信号的发出条件是:用户请求contextMenu(常规就是鼠标右击啦)且同时被击的widget其contextMenuPolicy又是Qt::CustomContextMenu。
    注意:pos是该widget接收右键菜单事件的位置,一般是在该部件的坐标系中。但是对于QAbstratScrollArea及其子类例外,是对应着其视口viewport()的坐标系。如常用的QTableView、QHeaderView就是QAbstratScrollArea的子类。
    因为仅发信号,所以需自己写显示右键菜单的slot来响应,例如一个表格(QTableView类型)表头的显示右键菜单槽:
    datatable->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(datatable->horizontalHeader(), SIGNAL(customContextMenuRequested(const QPoint&)), 
            this, SLOT(show_contextmenu(const QPoint&)));//this是datatable所在窗口
    QMenu *cmenu = NULL;
    show_contextmenu(const QPoint& pos)
    {
        if(cmenu)//保证同时只存在一个menu,及时释放内存
        {
            delete cmenu;
            cmenu = NULL;
        }
        QMenu cmenu = new QMenu(datatable->horizontalHeader());
        
        QAction *ascendSortAction = cmenu->addAction("升序");
        QAction *descendSortAction = cmenu->addAction("降序");
        QAction *filterAction = cmenu->addAction("过滤");
        QAction *reshowAction = cmenu->addAction("重载");
        
        connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
        connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
        connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));
        connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));
        
        cmenu->exec(QCursor::pos());//在当前鼠标位置显示
        //cmenu->exec(pos)是在viewport显示
    }

    也可先做好cmenu,好处是始终使用一个:
        QMenu cmenu = new QMenu(datatable->horizontalHeader());
        
        QAction *ascendSortAction = cmenu->addAction("升序");
        QAction *descendSortAction = cmenu->addAction("降序");
        QAction *filterAction = cmenu->addAction("过滤");
        QAction *reshowAction = cmenu->addAction("重载");
        
        connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
        connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
        connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));
        connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));
    show_contextmenu(const QPoint& pos)
    {
        if(cmenu)
        {
            cmenu->exec(QCursor::pos());
        }
    }


    3)使用Qt::ActionsContextMenu。
    把部件的所有action即QWidget::actions()作为context menu显示出来。
    还是上面的例子,要在表格(QTableView类型)表头显示右键菜单:
            QAction *ascendSortAction = new QAction("升序", this);
            QAction *descendSortAction = new QAction("降序", this);
            QAction *filterAction = new QAction("过滤", this);
            QAction *unfilterAction = new QAction("取消过滤", this);
        
            connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
            connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
            connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(filter_table()));
            connect(unfilterAction, SIGNAL(triggered(bool)), this, SLOT(unfilter_table()));
        
            datatable->horizontalHeader()->addAction(ascendSortAction);
            datatable->horizontalHeader()->addAction(descendSortAction);
            datatable->horizontalHeader()->addAction(filterAction);
            datatable->horizontalHeader()->addAction(unfilterAction);
             
            datatable->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);

    另外两个就是不显示context menu了:
    Qt::NoContextMenu
        the widget does not feature a context menu, context menu handling is deferred to the widget's parent.
        
    Qt::PreventContextMenu
        the widget does not feature a context menu, and in contrast to NoContextMenu, the handling is not deferred to the widget's parent. This means that all right mouse button events are guaranteed to be delivered to the widget itself through mousePressEvent(), and mouseReleaseEvent().

    补充:
        使用Qt::ActionsContextMenu比较简洁,但是如果需要根据当前菜单弹出的位置来定义不同菜单,或者像上个例子,在表格(QTableView类型)表头显示右键菜单时,我需要知道是哪一列表头被点击,从而在后来调用sort_ascend()排序函数时能够根据不同列进行不同排序策略,那么Qt::ActionsContextMenu就做不到了。
        这种需要捕捉弹出位置的情况只好用Qt::ActionsContextMenu了,customContextMenuRequested ( const QPoint & pos )信号返回点击位置pos(在表头视口坐标系中位置),然后表头即可调用logicalIndexAt(pos)函数得到被点击section对应的index即被点击部分的列号,然后存下来可供后面action激活的排序槽使用。
    show_contextmenu(const QPoint& pos)
    {
        //get related column of headerview
        contextmenu_column = datatable->horizontalHeader()->logicalIndexAt(pos);

        //show contextmenu
        if(cmenu)
        {
            cmenu->exec(QCursor::pos());
        }
    }


    From: http://hi.baidu.com/qinpanke/blog/item/679eb78ef30313e7f01f36c6.html


    展开全文
  • QT 右键菜单

    2016-06-21 13:52:24
    1. widget 控件 ContextMenuPolicy 设置为 ...2. include 文件中声明菜单的指针 QMenu *listRightMenu; 3. 初始化函数中进行构建 QMenu *listRightMenu = new QMenu(ui->tableWidget); QAction *addUnitA
  • QT右键菜单、右键下拉菜单、各控件响应右键菜单方法简介(持续添加更新中...... QT主窗体右键弹出下拉菜单方法(我的主窗体的类名是CGuiMainwindow): void CGuiMainwindow::contextMenuEvent...
  • pyqt、qt右键菜单英文翻译中文的qm文件,下载即可直接使用,对于QTextEdit、QPlainTextEdit、QLineEdit都可以正常显示中文 注意使用时压缩包中的两个文件qt_zh_CN.qm、widgets_zh_CN.qm都需要引入
  • //右键菜单 #include //右键菜单 //在类中定义 QAction* set_par_only; //右键菜单 private slots: void print_only(); //曹函数 //在主函数中 this->set_par_only = new QAction(tr("打印"),...
  • qt 右键菜单事件

    千次阅读 2019-05-05 15:21:48
    使用右键菜单,方法很多 有一篇博客很全 Qt实现右键菜单的五种方法!(以QListWidget为例) 但是常用的就是重写virtual void contextMenuEvent(QContextMenuEvent *event);右键菜单函数. 以保存halcon图片为例子; ...
  • Qt:QT右键菜单

    2015-02-27 21:54:00
    Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中 http://wenku.baidu.com/view/c51cfb63cf84b9d528ea7a29.html ... QWidget及其子类都可有右键菜单,因为QWidget有以下两个...
  • //菜单设置快捷键无效 action3->setShortcutContext(Qt::WidgetShortcut); action3->setShortcut(QKeySequence(Qt::ALT | Qt::Key_G)); connect(action3, SIGNAL(triggered()), this, ...求解如何设置右键菜单的快捷键
  • Qt右键菜单的添加

    千次阅读 2016-01-19 10:54:20
    鼠标事件是学习Qt必不可少的一个事件,初学者总是会忽略这一点,而右键菜单在平常的使用中更是常见,下面就Qt中添加右键菜单的几种方法做一简单的介绍: 1、鼠标事件添加/**重写鼠标处理器*/ void QWidget::...
  • QT主窗体右键弹出下拉菜单方法(我的主窗体的类名是CGuiMainwindow): void CGuiMainwindow::contextMenuEvent(QContextMenuEvent* e) { QMenu *menu = new QMenu(); menu->addSeparator(); menu->addSeparator...
  • 在平时使用Qt程序开发的时候,很多时候都会涉及到鼠标右键菜单的操作,以下对鼠标右键菜单的创建做一个系统的介绍:菜单的创建方法主要分为两种:第一种:通过事件处理器实现重写事件处理器voidQWidget::...
  • QT右键菜单无响应

    2020-11-01 11:45:42
    ui.treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); 看看是否漏写了这句代码。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,021
精华内容 408
关键字:

qt右键菜单