【发布时间】:2016-04-13 05:37:14
【问题描述】:
我正在尝试创建一个弹出菜单,我可以在其中检测为给定项目按下的鼠标按钮。我已经创建了一个自定义QAction 来构建我的QMenu,但是按下菜单项时的triggered 信号没有提供QMouseEvent 让我查询按下的按钮。
另外,我为每个QAction 设置了一个状态提示,当我将鼠标悬停在它上面时,它会出现在状态栏中,但即使在我关闭QMenu 后它仍然存在。这是正常行为吗?
【问题讨论】:
我正在尝试创建一个弹出菜单,我可以在其中检测为给定项目按下的鼠标按钮。我已经创建了一个自定义QAction 来构建我的QMenu,但是按下菜单项时的triggered 信号没有提供QMouseEvent 让我查询按下的按钮。
另外,我为每个QAction 设置了一个状态提示,当我将鼠标悬停在它上面时,它会出现在状态栏中,但即使在我关闭QMenu 后它仍然存在。这是正常行为吗?
【问题讨论】:
我不确定我是否理解你想要什么;但是如果你想在鼠标右键单击时显示一个弹出菜单,你应该首先在你的小部件(或窗口类)的头文件中覆盖与鼠标事件相关的函数并声明一些将显示你的弹出菜单的函数。所以,头文件应该包含这些声明:
...
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),它应该被覆盖,当您在菜单中选择一个项目时,您将能够检测是否按下了鼠标左键或右键。
【讨论】:
我知道这是一篇很老的帖子。但是,如果您想知道在弹出菜单/上下文菜单中单击了哪个按钮。
假设您按下按钮保存,它与信号和插槽等连接。在插槽中调用一个名为 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();
}
【讨论】: