`
qimo601
  • 浏览: 3449192 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

QT右键菜单

    博客分类:
  • 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右键菜单测试.rar

    本示例“QT右键菜单测试”展示了如何在QT 5.9版本中自定义右键菜单,这对于开发者来说是一项基础但至关重要的技能。 首先,我们需要了解QT中的QMenu类,它是创建菜单的基础。QMenu可以包含一系列的QAction,每个...

    ScreenSnaper.rar_QT 截屏_Qt右键菜单_qt QQ截图_qt 右键菜单

    《Qt技术实现高效截屏与右键菜单功能详解》 在软件开发中,截屏功能是一种常见的需求,尤其是在桌面应用中。本篇文章将深入探讨如何使用Qt框架来实现高效的截屏功能,并结合右键菜单,提供类似QQ截图的用户体验。Qt...

    pyqt、qt右键菜单英文翻译中文的qm文件

    pyqt、qt右键菜单英文翻译中文的qm文件,下载即可直接使用,对于QTextEdit、QPlainTextEdit、QLineEdit都可以正常显示中文 注意使用时压缩包中的两个文件qt_zh_CN.qm、widgets_zh_CN.qm都需要引入

    QT右键菜单栏的实现源码

    以下是一个详细的步骤来实现QT右键菜单栏: 1. **创建QMenu对象**:首先,你需要创建一个QMenu对象,这将是右键菜单的基础。例如: ```cpp QMenu *contextMenu = new QMenu(this); ``` 2. **添加QAction**:...

    Qt学习之QPushButton添加右键菜单

    通过以上步骤,你已经掌握了在Qt中为QPushButton添加右键菜单的基本方法。这只是一个基础示例,实际应用中,你可能需要根据项目需求进行更复杂的定制,如添加图标、设置快捷键、处理菜单项的分隔符等。Qt提供了丰富...

    Qt学习之QPushButton右键菜单

    而为`QPushButton`添加右键菜单的功能,可以增加用户交互的多样性,使得按钮不仅仅是单击触发事件,还可以通过右键点击唤出上下文相关的操作选项。在本教程中,我们将深入探讨如何在`QPushButton`上实现这一功能。 ...

    Qt学习之QPushButton添加右键菜单2.zip

    这个“Qt学习之QPushButton添加右键菜单2.zip”文件可能包含了一个示例项目,演示了如何在QPushButton上实现这一特性。下面将详细介绍如何在Qt中实现这一功能。 首先,我们需要了解Qt的信号和槽机制。这是Qt事件...

    Qt4 右键菜单 透明Widget 实例

    在本文中,我们将深入探讨如何在Qt4中实现一个具有右键菜单功能的透明Widget。首先,让我们逐一解析每个文件的作用: 1. **shapewidget.cpp**:这是实现自定义形状Widget的主要代码文件,其中包含了对透明效果的...

    Qt下显示文件及目录的Windows右键菜单

    使用Qt库,开发者可以创建自定义的右键菜单,以增强应用程序的功能或提供特定的操作。本资源是一个Qt工程实例,专注于在Windows环境下为文件和目录添加自定义的右键菜单。 首先,我们要理解Qt库中的`...

    Qt 弹出菜单右键菜单 QMenu 设置不同颜色的子项

    在Qt中,可以使用样式表(StyleSheet)来自定义QMenu的外观,包括其子项(如菜单项QAction)的颜色。但是,要注意的是,直接通过样式表为QMenu的每个子项设置不同的颜色可能不是很方便,因为样式表通常用于设置类的...

    QStandardItemModel角色控制及QTreeView添加不同的右键菜单

    QStandardItemModel角色控制及QTreeView添加不同的右键菜单 详细教程见:http://blog.csdn.net/czyt1988/article/details/26018513

    Qt之QAbstractItemView视图项右键菜单

    Qt之列表视图右键菜单实现,同理其他继承于QAbstractItemView的视图窗口也可以进行右键菜单实现

    QT5.14.2 右键菜单汉化文件.rar

    使用方法 QTranslator translator;... translator.load(":/qt_zh_CN.qm"); a.installTranslator(&translator); QTranslator translator2; translator2.load(":/widgets.qm"); a.installTranslator(&translator2);

    实例QT程序 —— QTableWidget 表格右键菜单功能(该方式可用于任意Widget子类控件)

    实例QT程序 —— 在QTableWidget表格中添加右键菜单功能。 编译可以直接运行。 运行环境WIN10 Qt5.9.7 。 资源为源码压缩包:QTableWidgetContextMenu.rar 相关文章链接如下: ...

    解决QTextEdit右键菜单为英文的问题

    使用方法,在main函数中加入如下语句,并奖相关文件添加到qrc中: QTranslator translator; translator.load(QString(":...translator2.load(QString(":/cfg/xml/qt_zh_CN.qm")); app.installTranslator(&translator2);

    利用Qt实现为控件添加右键菜单的功能.rar

    在Qt开发中,为控件添加右键菜单是常见的需求,尤其在设计用户交互界面时。这个压缩包文件“利用Qt实现为控件添加右键菜单的功能.rar”提供了一个具体的示例,通过一个名为“MenuTest”的项目来展示这一功能。下面...

    屏蔽标题栏右键系统菜单及按钮

    具体来说,可以使用SetWindowLong()函数的GWL_EXSTYLE参数,将WS_EX_CONTEXTHELP风格移除,这会禁用右键菜单。代码示例如下: ```cpp DWORD dwStyle = GetWindowLong(hwnd, GWL_EXSTYLE); dwStyle &= ~WS_EX_...

    Qt实现鼠标右击弹出菜单

    在Qt框架中,实现鼠标右键点击弹出菜单是一项常见的需求,这主要涉及到信号与槽机制、QMenu类以及QAction类的使用。下面将详细解释如何在Qt5中实现这一功能。 首先,QMenu是Qt中用于创建下拉菜单或弹出菜单的类,而...

    QT-04.2-qt菜单处理 解决控件右键菜单为英文问题

    本教程“QT-04.2-qt菜单处理 解决控件右键菜单为英文问题”专注于解决这一问题,将QT应用中的右键菜单由英文转换为汉语,以提升用户体验。 首先,我们需要理解QT中的菜单系统是如何工作的。QT提供了一个名为`QMenu`...

Global site tag (gtag.js) - Google Analytics