网上有很多关于pos机菜单详解,Qt右键菜单的5种方案的知识,也有很多人为大家解答关于pos机菜单详解的问题,今天pos机之家(www.poszjia.com)为大家整理了关于这方面的知识,让我们一起来看下吧!
本文目录一览:
1、pos机菜单详解
pos机菜单详解
学习了QT很久,下面总结了5种实现右键菜单的方法(以QListWidget为例):
下面5种方法选其一即可.当然越简单越好啦!
1.重写QListWidget的virtual void mousePressEvent(QMouseEvent *event);鼠标点击函数.
2.重写QListWidget的virtual void contextMenuEvent(QContextMenuEvent *event);右键菜单函数.
3.在使用QListWidget的窗口中,virtual void mousePressEvent(QMouseEvent *event);鼠标点击函数.
4.修改QListWidget的右键菜单策略.
5.添加事件过滤器.
1.重写QListWidget.
//"QMyListWidget.h"#ifndef QMYLISTWIDGET_H#define QMYLISTWIDGET_H#include <QListWidget>#include <QMenu>#include <QAction>#include <QContextMenuEvent>#include <QMouseEvent>class QMyListWidget : public QListWidget{ Q_OBJECTpublic: QMyListWidget(QWidget *parent); ~QMyListWidget();protected: void mousePressEvent(QMouseEvent *event);private: QMenu *m_contextMenu; QAction *m_addAction; QAction *m_delAction;};#endif // QMYLISTWIDGET_H//这里是QMyListWidget的实现.//"QMyListWidget.cpp"#include "QMyListWidget.h"QMyListWidget::QMyListWidget(QWidget *parent): QListWidget(parent){ //创建一个菜单,后面不在解释. m_contextMenu = new QMenu; m_addAction = new QAction("add Item",this); m_delAction = new QAction("del Item",this); m_contextMenu->addAction(m_addAction); m_contextMenu->addAction(m_delAction);}QMyListWidget::~QMyListWidget(){}void QMyListWidget::mousePressEvent(QMouseEvent *event){ //确保右键点击,然后跳出菜单. if (event->button() == Qt::RightButton) { m_contextMenu->exec(event->globalPos()); } //要继续保留QListWidget原有的点击事件. QListWidget::mousePressEvent(event);}
当重写后,别忘记把QListWidget部件提示为你的QMyListWidget部件,提升方法看上篇博客.
2.重写virtual void contextMenuEvent(QContextMenuEvent *event);
//"QMyListWidget.h"头文件基本一致,所以就不放上来了.//下面是"QMyListWidget.cpp"的代码.void QMyListWidget::contextMenuEvent(QContextMenuEvent *event){ //让菜单移动到鼠标位置并显示. m_contextMenu->exec(event->globalPos());}
3.在原窗口中重写void contextMenuEvent(QContextMenuEvent event);或者void mousePressEvent(QMouseEvent *event);
//以下为"c.cpp"的代码:c::c(QWidget *parent) : QMainWindow(parent){ ui.setupUi(this); ui.listWidget->addItem("zx"); m_contextMenu = new QMenu; m_addAction = new QAction("add Item", this); m_delAction = new QAction("del Item", this); m_contextMenu->addAction(m_addAction); m_contextMenu->addAction(m_delAction);}c::~c(){}void c::contextMenuEvent(QContextMenuEvent *event){ //把鼠标位置转化成相对于QWidget的位置,然后判断是否在QListWidget内. QPoint i = ui.listWidget->mapFromGlobal(event->globalPos()); Qrect rect(QPoint(0,0),ui.listWidget->size()); if (rect.contains(i)) { m_contextMenu->exec(event->globalPos()); }}*/
4.设置QListWidget的右键菜单策略.
c::c(QWidget *parent) : QMainWindow(parent){ ui.setupUi(this); //修改策略. ui.listWidget->setContextMenuPolicy(Qt::CustomContextMenu); ui.listWidget->addItem("zx"); m_contextMenu = new QMenu; m_addAction = new QAction("add Item", this); m_delAction = new QAction("del Item", this); m_contextMenu->addAction(m_addAction); m_contextMenu->addAction(m_delAction); //和该策略对应的信号,showListWidgetMenuSlot为自己定义的槽函数. connect(ui.listWidget, SIGNAL(customContextMenuRequested(QPoint)),this, SLOT(showListWidgetMenuSlot(QPoint)));}c::~c(){}void c::showListWidgetMenuSlot(QPoint pos){ m_contextMenu->exec(QCursor::pos());}
5.使用事件过滤器.假设在窗口中.因为如果在重写类中使用,感觉没什么必要.
c::c(QWidget *parent) : QMainWindow(parent){ ui.setupUi(this); ui.listWidget->addItem("zx"); //加入事件过滤器. ui.listWidget->installEventFilter(this); //重要 m_contextMenu = new QMenu; m_addAction = new QAction("add Item", ui.listWidget); m_delAction = new QAction("del Item", ui.listWidget); m_contextMenu->addAction(m_addAction); m_contextMenu->addAction(m_delAction);}c::~c(){}ool c::eventFilter(QObject *o, QEvent *event){ if (o == ui.listWidget) { if (event->type() == QEvent::ContextMenu) { m_contextMenu->exec(QCursor::pos());//重要 return true; } } return QObject::eventFilter(o,event); }
原文链接:https://blog.csdn.net/qq_37233607/article/details/78649151
以上就是关于pos机菜单详解,Qt右键菜单的5种方案的知识,后面我们会继续为大家整理关于pos机菜单详解的知识,希望能够帮助到大家!
