所以,如果我理解正确的话。
您让 Qt 处理正确的按钮(您没有在插槽中检查 Context ),然后菜单在失去焦点时消失。
但是您正在处理左键单击,并且您无法获得相同的行为。正确的?
我至少可以想到两种通过 eventFilter 执行此操作的方法:
这将是制造假事件的一种方式。
bool MainWindow::eventFilter(QObject *obj, QEvent *event){
if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent *mEvent = static_cast<QMouseEvent *>(event);
if(mEvent->button() == Qt::LeftButton)
{
QMouseEvent my_event = new QMouseEvent ( mEvent->type(),
mEvent->pos(), Qt::Rightbutton ,
mEvent->buttons(), mEvent->modifiers() );
QCoreApplication::postEvent ( trayIcon, my_event );
return true;
}
}
return QObject::eventFilter(obj, event);
}
安装
trayIcon->installEventFilter(this);
从主窗口
但是,我认为这有点棘手。
如果你正在制作一个 eventFilter,你可以在菜单上观察 focusOut 事件。
bool MainWindow::eventFilter(QObject *obj, QEvent *event){
QMouseEvent *mEvent = dynamic_cast<QMouseEvent *>(event);
if(mEvent)
{
if(mEvent->type() == QEvent::Leave || mEvent->type() == QEvent::WindowDeactivate)
{
trayIcon->contextMenu()->close();
return true;
}
}
return QObject::eventFilter(obj, event);
}
请注意,我还没有尝试过。但应该值得一试。
一些方便的链接:
如何检测我的应用程序在 Qt 中失去焦点?
安装事件过滤器
事后