资源描述:
《Qt:QListWidget的item上实现右键菜单》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、QWidget及其子类都可有右键菜单,因为QWidget有以下两个与右键菜单有关的函数:Qt::ContextMenuPolicycontextMenuPolicy()constvoidsetContextMenuPolicy(Qt::ContextMenuPolicypolicy)Qt::ContextMenuPolicy枚举类型包括:Qt::DefaultContextMenu,Qt::NoContextMenu,Qt::PreventContextMenu,Qt::ActionsContextMenu,andQt::CustomCon
2、textMenu。使用方式如下:1)默认是Qt::DefaultContextMenu。它是利用右键菜单事件contextMenuEvent()来处理(whichmeansthecontextMenuEvent()handleriscalled)。就是要重写contextMenuEvent(QContextMenuEvent*event)函数。2)使用Qt::CustomContextMenu。它是发出QWidget::customContextMenuRequested信号,注意仅仅只是发信号,意味着要自己写显示右键菜单的slot。这个信
3、号是QWidget唯一与右键菜单有关的信号(也是自有的唯一信号),同时也是很容易被忽略的signal:voidcustomContextMenuRequested(constQPoint&pos)该信号的发出条件是:用户请求contextMenu(常规就是鼠标右击啦)且同时被击的widget其contextMenuPolicy又是Qt::CustomContextMenu。注意:pos是该widget接收右键菜单事件的位置,一般是在该部件的坐标系中。但是对于QAbstratScrollArea及其子类例外,是对应着其视口viewport()
4、的坐标系。如常用的QTableView、QHeaderView就是QAbstratScrollArea的子类。因为仅发信号,所以需自己写显示右键菜单的slot来响应,例如一个表格(QTableView类型)表头的显示右键菜单槽:datatable->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu);connect(datatable->horizontalHeader(),SIGNAL(customContextMenuRequested(constQPoint&
5、)),this,SLOT(show_contextmenu(constQPoint&)));//this是datatable所在窗口QMenu*cmenu=NULL;show_contextmenu(constQPoint&pos){if(cmenu)//保证同时只存在一个menu,及时释放内存{deletecmenu;cmenu=NULL;}QMenucmenu=newQMenu(datatable->horizontalHeader());QAction*ascendSortAction=cmenu->addAction("升序");Q
6、Action*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(so
7、rt_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,好处是始终使用一个:QMenucmenu=newQMenu(d
8、atatable->horizontalHeader());QAction*ascendSortAction=cmenu->addAction("升序");QAction*des