使用QMenu和mousePressEvent制作右键弹出菜单

您所在的位置:网站首页 qmenu用法 使用QMenu和mousePressEvent制作右键弹出菜单

使用QMenu和mousePressEvent制作右键弹出菜单

2023-06-10 23:02| 来源: 网络整理| 查看: 265

我需要实现一个在QTextBrowser上邮件弹出菜单的效果,如下所示:

 创建QTextBrowser的子类MyTextBrowser

首先创建一个QTextBrowser的子类,MyTextBrowser,如下所示:并定义一个QMenu指针

#ifndef MYTEXTBROWSER_H #define MYTEXTBROWSER_H #include #include #include #include #include #include #include #include class MyTextBrowser : public QTextBrowser { Q_OBJECT public: MyTextBrowser(QWidget *parent); QMenu *m_menu = nullptr; // QWidget interface protected: void mouseDoubleClickEvent(QMouseEvent *event); // QWidget interface protected: void mousePressEvent(QMouseEvent *event); private slots: void action_1_slot(); void action_2_slot(); void action_3_slot(); }; #endif // MYTEXTBROWSER_H 在构造函数中初始化菜单 MyTextBrowser::MyTextBrowser(QWidget *parent):QTextBrowser(parent) { m_menu = new QMenu(); QAction *a1 = new QAction("action1"); QAction *a2 = new QAction("action2"); QAction *a3 = new QAction("action3"); connect(a1,&QAction::triggered,this,&MyTextBrowser::action_1_slot); connect(a2,&QAction::triggered,this,&MyTextBrowser::action_2_slot); connect(a3,&QAction::triggered,this,&MyTextBrowser::action_3_slot); m_menu->addAction(a1); m_menu->addAction(a2); m_menu->addAction(a3); }

实现父类的鼠标单击事件和双击事件。

void MyTextBrowser::mouseDoubleClickEvent(QMouseEvent *event) { //qDebug() button() == Qt::LeftButton){ this->clear(); } } void MyTextBrowser::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::RightButton){ m_menu->popup(cursor().pos()); } }

关于位置pos,event变量中也存有位置属性,修改代码如下所示,添加打印pos的调试函数:

void MyTextBrowser::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::RightButton){ qDebug() localPos();表示MyTextBrowser窗口的位置,例如MyTextBrowser窗口的宽高是200X200。

那么event->localPos()的取值范围就是[0,199) 到[0,199]。

event->globalPos();和cursor().pos();的返回值相同,此时在MyTextBrowser的左上角右键单击,会看到下面的输出信息。从输出结果可知event->globalPos();和cursor().pos();是相同的。

 

 

实现菜单项的相关slot void MyTextBrowser::action_1_slot() { QAction *action = (QAction*)sender(); QMessageBox::information(this,action->text(),action->text()); } void MyTextBrowser::action_2_slot() { QAction *action = (QAction*)sender(); QMessageBox::information(this,action->text(),action->text()); } void MyTextBrowser::action_3_slot() { QAction *action = (QAction*)sender(); QMessageBox::information(this,action->text(),action->text()); }

将这个子类放到自己的工程中:

右键弹出如下窗口:

选择action1,弹出如下窗口:

小结 


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3