У меня есть QMenu, который находится в QSystemTrayIcon. Оба являются членами объекта QMainWindow.
Я хочу, чтобы QMenu QSystemTrayIcon действовал одинаково при щелчке правой кнопкой мыши (т. е. по причине QSystemTrayIcon::Context) и при одиночном щелчке левой кнопкой мыши (т. е. по причине QSystemTrayIcon::Trigger).
Поведение правой кнопки мыши по умолчанию действует так, как я этого хочу. Однако я не могу понять, как заставить левый щелчок действовать точно так же, как правый щелчок. Мои усилия до сих пор приводят меня к:
Однако меню не исчезает, когда оно теряет фокус, тогда как вызов контекстного меню с помощью правого щелчка заставляет его исчезнуть, когда фокус теряется.
Есть ли способ заставить Trigger действовать как Context? Может быть, способ бросить фиктивный сигнал или что-то в этом роде?
Ну, мне нужно было сделать то же самое, и я не мог понять, как сделать это чисто с чистым кодом Qt, поэтому вот небольшой хак только для Windows, который работает:
void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
switch (reason)
{
case QSystemTrayIcon::Trigger:
case QSystemTrayIcon::DoubleClick:
case QSystemTrayIcon::MiddleClick:
{
POINT p;
GetCursorPos(&p);
HWND hwnd = WindowFromPoint(p);
ScreenToClient(hwnd, &p);
PostMessageA(hwnd, WM_RBUTTONDOWN, MK_RBUTTON, MAKELONG(p.x, p.y));
PostMessageA(hwnd, WM_RBUTTONUP, 0, MAKELONG(p.x, p.y));
}
break;
case QSystemTrayIcon::Context:
show();
setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
mTrayIcon->contextMenu()->popup(QCursor::pos());
break;
default:
break;
}
}
Ответ 2 · trompa
Итак, если я правильно понял.
Вы позволяете Qt обрабатывать правую кнопку (вы не проверяете контекст в своем слоте), а затем меню исчезает, когда теряется фокус.
Но вы обрабатываете нажатия левой кнопки и не можете добиться такого же поведения. Правильно?
Я могу придумать, по крайней мере, два способа сделать это через eventFilter: