我正在尝试创建一个弹出菜单,我可以在其中检测为给定项目按下的鼠标按钮。我已经创建了一个自定义QAction
来构建我的QMenu
,但是当按下菜单项时triggered
信号没有提供QMouseEvent
我查询按下按钮。
另外,我正在设置每个QAction
的状态提示,当我将鼠标悬停在状态栏上时会显示状态提示,但是在我关闭QMenu
后它仍然保持不变。这是正常的行为吗?
答案 0 :(得分:3)
我不确定我是否明白你想要什么;但如果要在鼠标右键单击时显示弹出菜单,则应首先在窗口小部件(或窗口类)的头文件中覆盖与鼠标事件相关的函数,并声明一些将显示弹出菜单的函数。因此,头文件应包含以下声明:
...
void Popup(const QPoint& pt);
void mousePressEvent(QMouseEvent *event);
...
在函数的cpp文件定义中:
void testQt::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton) {
this ->Popup(event ->pos());
event->accept();
}
}
void testQt::Popup(const QPoint& pt)
{
QPoint global = this ->mapToGlobal(pt);
QMenu* pPopup = new QMenu(this);
QAction* pAction1 = new QAction("Item 1", this);
QAction* pAction2 = new QAction("Item 2", this);
pPopup ->addAction(pAction1);
pPopup ->addAction(pAction2);
QAction* pItem = pPopup ->exec(global);
if(pItem == pAction1)
{
}
else if(pItem == pAction2)
{
}
}
现在,当您按下鼠标右键时,光标位置会出现一个弹出菜单。 我希望这会有所帮助。
注意:如果要在选择操作时检测按下哪个鼠标按钮,则应从QMenu继承自己的类。 QMenu类包含受保护的函数mousePressEvent(QMouseEvent *event)
,应该覆盖它,并且当您在菜单中选择项目时,您将能够检测是否按下了鼠标左键。
答案 1 :(得分:1)
我知道这是一篇非常古老的帖子。但是,如果您想知道在弹出菜单/上下文菜单中单击了哪个按钮。
让我们说你按下保存按钮,它与信号和插槽等连接。在插槽中调用一个名为sender();
的方法。这会返回QObject
,您可以将其投射到QAction*
并从中获取数据等。
void MyClass::showMenu()
{
auto action(new QAction*("Blah", ui->my_toolbar));
QObject::connect(action, &QAction::triggered, this, &MyClass::mySlot);
}
void MyClass::mySlot()
{
auto myAction(static_cast<QAction*>(sender()));
myAction->doAwesomeStuff();
}