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

我需要实现一个在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() << "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,弹出如下窗口:

使用QMenu和mousePressEvent制作右键弹出菜单_第1张图片

小结 

你可能感兴趣的:(QT,qt,开发语言)