- 浏览: 3444519 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
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官网变更【2012】
2012-09-21 19:30 4213Qt最近被Digia完全收购,诺基亚这两年的不理不睬,没有魄力 ... -
【转】QT实现不规则窗体
2012-09-21 18:50 4990看到好文章,收藏一下: 看到网上有很多不规则窗体的实现 ... -
Qt应用程序如何使用DCMTK类库进行二次开发DICOM数据传输
2012-09-13 09:35 0参考文章: 1、Using DCMTK with ... -
【转】将QT开发的界面程序封装成DLL,在VC中成功调用
2012-09-11 10:33 21118最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后 ... -
诺基亚挥别Qt,转手给Digia
2012-09-11 09:37 2858一家总部位于芬兰的IT业务供应商Digia今天宣布,已经签署了 ... -
Qt多线程间信号槽传递非QObject类型对象的参数
2012-09-07 15:29 21375一、以前就发现过这个问题: 在Qt项目中,有时候为了 ... -
QT样式表(QStyleSheet)
2012-08-17 10:37 17890QT样式表 (QStyleSheet) 作者:刘旭晖 ... -
FinalData磁盘文件恢复工具(绿色破解版)
2012-08-02 13:28 8582FinalData磁盘文件恢复工具(绿色破解版),使用起来很方 ... -
Eclipse Qt开发环境的建立【转】
2012-08-01 11:15 43741.下载Eclipse目前Eclipse+CDT已经可以 ... -
汽车辐射监测系统-Qt开发
2012-07-25 16:18 4693最近晚上抽空忙了两个月,才把一个小系统做完。虽然做的不是太完 ... -
Qt做发布版,解决声音和图片、中文字体乱码问题
2012-07-14 16:02 4863Qt做发布版,解决声音和图片、中文字体乱码问题 ... -
QTableView使用中的疑问,如何及时显示操作Model后的结果?
2012-06-01 14:52 0最终的解决方法:我正 ... -
【转】Qt QTableview使用
2012-06-01 09:49 9674QTableWidget是QT程序中常用的显示数 ... -
QTableView双击 单机事件信号
2012-06-01 09:47 23092双击QTableView的行,获取该行数据 代码 ... -
QMessageBox改变大小
2012-05-31 15:33 8440创建一个QMessageBox: QMessageBo ... -
更新QTableView中的进度条状态
2012-05-30 14:37 14856前段时间,我接触了,如何在一个QTableView中加入一个控 ... -
QThread 线程暂停 停止功能的实现
2012-05-29 11:56 12199为了实现Qt中线程的暂停运行,和停止运行的控制功能 需要在设 ... -
QT环境变量
2012-05-28 18:53 5593不知道为啥同事有台电脑,装完Qt-VS2008库,和VS Ad ... -
广告光
2012-05-24 18:33 0盈创广告联盟 http://www.yo114.cn/ ... -
Test
2012-05-24 18:22 2186Test<IMG SRC="cf08e32c2 ...
相关推荐
本示例“QT右键菜单测试”展示了如何在QT 5.9版本中自定义右键菜单,这对于开发者来说是一项基础但至关重要的技能。 首先,我们需要了解QT中的QMenu类,它是创建菜单的基础。QMenu可以包含一系列的QAction,每个...
《Qt技术实现高效截屏与右键菜单功能详解》 在软件开发中,截屏功能是一种常见的需求,尤其是在桌面应用中。本篇文章将深入探讨如何使用Qt框架来实现高效的截屏功能,并结合右键菜单,提供类似QQ截图的用户体验。Qt...
pyqt、qt右键菜单英文翻译中文的qm文件,下载即可直接使用,对于QTextEdit、QPlainTextEdit、QLineEdit都可以正常显示中文 注意使用时压缩包中的两个文件qt_zh_CN.qm、widgets_zh_CN.qm都需要引入
以下是一个详细的步骤来实现QT右键菜单栏: 1. **创建QMenu对象**:首先,你需要创建一个QMenu对象,这将是右键菜单的基础。例如: ```cpp QMenu *contextMenu = new QMenu(this); ``` 2. **添加QAction**:...
通过以上步骤,你已经掌握了在Qt中为QPushButton添加右键菜单的基本方法。这只是一个基础示例,实际应用中,你可能需要根据项目需求进行更复杂的定制,如添加图标、设置快捷键、处理菜单项的分隔符等。Qt提供了丰富...
而为`QPushButton`添加右键菜单的功能,可以增加用户交互的多样性,使得按钮不仅仅是单击触发事件,还可以通过右键点击唤出上下文相关的操作选项。在本教程中,我们将深入探讨如何在`QPushButton`上实现这一功能。 ...
这个“Qt学习之QPushButton添加右键菜单2.zip”文件可能包含了一个示例项目,演示了如何在QPushButton上实现这一特性。下面将详细介绍如何在Qt中实现这一功能。 首先,我们需要了解Qt的信号和槽机制。这是Qt事件...
在本文中,我们将深入探讨如何在Qt4中实现一个具有右键菜单功能的透明Widget。首先,让我们逐一解析每个文件的作用: 1. **shapewidget.cpp**:这是实现自定义形状Widget的主要代码文件,其中包含了对透明效果的...
使用Qt库,开发者可以创建自定义的右键菜单,以增强应用程序的功能或提供特定的操作。本资源是一个Qt工程实例,专注于在Windows环境下为文件和目录添加自定义的右键菜单。 首先,我们要理解Qt库中的`...
QStandardItemModel角色控制及QTreeView添加不同的右键菜单 详细教程见:http://blog.csdn.net/czyt1988/article/details/26018513
Qt之列表视图右键菜单实现,同理其他继承于QAbstractItemView的视图窗口也可以进行右键菜单实现
使用方法 QTranslator translator;... translator.load(":/qt_zh_CN.qm"); a.installTranslator(&translator); QTranslator translator2; translator2.load(":/widgets.qm"); a.installTranslator(&translator2);
实例QT程序 —— 在QTableWidget表格中添加右键菜单功能。 编译可以直接运行。 运行环境WIN10 Qt5.9.7 。 资源为源码压缩包:QTableWidgetContextMenu.rar 相关文章链接如下: ...
在Qt开发中,为控件添加右键菜单是常见的需求,尤其在设计用户交互界面时。这个压缩包文件“利用Qt实现为控件添加右键菜单的功能.rar”提供了一个具体的示例,通过一个名为“MenuTest”的项目来展示这一功能。下面...
使用方法,在main函数中加入如下语句,并奖相关文件添加到qrc中: QTranslator translator; translator.load(QString(":...translator2.load(QString(":/cfg/xml/qt_zh_CN.qm")); app.installTranslator(&translator2);
具体来说,可以使用SetWindowLong()函数的GWL_EXSTYLE参数,将WS_EX_CONTEXTHELP风格移除,这会禁用右键菜单。代码示例如下: ```cpp DWORD dwStyle = GetWindowLong(hwnd, GWL_EXSTYLE); dwStyle &= ~WS_EX_...
在Qt框架中,实现鼠标右键点击弹出菜单是一项常见的需求,这主要涉及到信号与槽机制、QMenu类以及QAction类的使用。下面将详细解释如何在Qt5中实现这一功能。 首先,QMenu是Qt中用于创建下拉菜单或弹出菜单的类,而...
本教程“QT-04.2-qt菜单处理 解决控件右键菜单为英文问题”专注于解决这一问题,将QT应用中的右键菜单由英文转换为汉语,以提升用户体验。 首先,我们需要理解QT中的菜单系统是如何工作的。QT提供了一个名为`QMenu`...
pyqt QLineEdit QTextEdit 右键菜单汉化 调用方法: translator = QTranslator() translator.load('qt_zh_CN.qm') app.installTranslator(translator) translator2 = QTranslator() translator2.load('widgets....