我在QSystemTrayIcon中有一个QMenu。两者都是QMainWindow对象的成员。
我想QSystemTrayIcon的QMenu在右键单击(即QSystemTrayIcon :: Context)和单击左键单击时(即QSystemTrayIcon :: Trigger原因)完全相同。
默认情况下,右键单击行为就像我想要的那样。但是我无法弄清楚如何让左键单击动作就像右击一样。到目前为止,我的努力使我:
void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
if(reason==QSystemTrayIcon::Trigger) trayIcon->contextMenu()->popup(QCursor::pos());
}
然而,当菜单失去焦点时菜单不会消失,而右键单击调出上下文菜单会使焦点丢失时消失。
有没有让Trigger像Context一样?也许是一种抛出模拟信号的方法?
答案 0 :(得分:1)
嗯,我需要做同样的事情,并且无法弄清楚如何使用纯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;
}
}
答案 1 :(得分:0)
所以,如果我理解正确的话。
你让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);
}
请注意,我还没试过。但值得一试。
一些方便的链接: