我需要实现一个在QTextBrowser上邮件弹出菜单的效果,如下所示:
创建QTextBrowser的子类MyTextBrowser
首先创建一个QTextBrowser的子类,MyTextBrowser,如下所示:并定义一个QMenu指针
#ifndef MYTEXTBROWSER_H
#define MYTEXTBROWSER_H
#include <QMouseEvent>
#include <QObject>
#include <QTextBrowser>
#include <QWidget>
#include <QDebug>
#include <QMenu>
#include <QAction>
#include <QMessageBox>
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() << "mouseDoubleClickEvent";
if(event->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() << "cursor().pos() = " << cursor().pos();
qDebug() << "event->localPos() = " << event->localPos();
qDebug() << "event->globalPos() = " << event->globalPos();
m_menu->popup(cursor().pos());
}
}
event->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,弹出如下窗口: