本节对应的视频讲解:B_站_链_接
【QT开发笔记-基础篇】 第4章 事件 4.9 右键菜单事件
本章要实现的整体效果如下:
QEvent::ContextMenu
在窗口/控件上点击鼠标右键时,触发该事件,它对应的子类是 QContextMenuEvent
首先,在 context_widget.h
中声明几个 QAction
、槽函数以及 contextMenuEvent()
函数:
#include <QContextMenuEvent>
#include <QMenu>
#include <QAction>
#include <QCursor>
class ContextWidget : public QWidget
{
private slots:
void slotAction();
protected:
void contextMenuEvent(QContextMenuEvent* event);
private:
QAction* cut;
QAction* copy;
QAction* paste;
QAction* toUpper;
QAction* toLower;
QAction* hide;
};
然后,在 context_widget.cpp
的构造中,创建 QAction
并关联槽函数:
ContextWidget::ContextWidget(QWidget* parent) : QWidget{parent}
{
cut = new QAction("剪切(T)", this);
copy = new QAction("复制(C)", this);
paste = new QAction("粘贴(P)", this);
toUpper = new QAction("转成大写(U)", this);
toLower = new QAction("转成小写(L)", this);
hide = new QAction("隐藏行", this);
connect(cut, SIGNAL(triggered()), this, SLOT(slotAction()));
connect(copy, SIGNAL(triggered()), this, SLOT(slotAction()));
connect(paste, SIGNAL(triggered()), this, SLOT(slotAction()));
connect(toUpper, SIGNAL(triggered()), this, SLOT(slotAction()));
connect(toLower, SIGNAL(triggered()), this, SLOT(slotAction()));
connect(hide, SIGNAL(triggered()), this, SLOT(slotAction()));
}
然后,实现槽函数:
void ContextWidget::slotAction()
{
QAction* act = (QAction*)(sender());
#if 0
if ( act == cut ) {
qDebug() << "slot_cut";
}
#endif
qDebug() << act->text();
}
这里使用 QObject
类的 sender()
函数,返回发送该信号的对象
最后,实现 contextMenuEvent()
函数:
void ContextWidget::contextMenuEvent(QContextMenuEvent* event)
{
QMenu* menu = new QMenu();
menu->setFixedWidth(160); //菜单栏显示宽度
menu->addAction(cut);
menu->addAction(copy);
menu->addAction(paste);
menu->addSeparator();
menu->addAction(toUpper);
menu->addAction(toLower);
menu->addSeparator();
menu->addAction(hide);
menu->exec(event->globalPos());
delete menu;
}
此时运行结果,就可以弹出菜单,并执行相对于菜单的功能(这里仅仅是打印菜单的文本):