所以,如果我理解正确的话。
您让 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);
}
请注意,我还没有尝试过。不过应该值得一试。
一些方便的链接:
How to detect that my application lost focus in Qt?
installEventFilter
postEvent