2013-05-08 51 views
1

我在QSystemTrayIcon中有一個QMenu。兩者都是QMainWindow對象的成員。QT:觸發器上的上下文菜單

當我點擊QSystemTrayIcon的QMenu時,右鍵單擊(即,理解QSystemTrayIcon :: Context)和單擊左鍵單擊(即原因QSystemTrayIcon :: Trigger)時的行爲完全相同。

默認情況下右鍵單擊行爲的行爲就像我想要的那樣。然而,我無法弄清楚如何使左鍵單擊完全像右鍵單擊。我的努力,到目前爲止,導致我:

void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) 
{ 
    if(reason==QSystemTrayIcon::Trigger) trayIcon->contextMenu()->popup(QCursor::pos()); 
} 

然而,當它失去焦點而帶來了點擊右鍵文本菜單不讓它消失丟失焦點時菜單不消失。

有沒有讓觸發器像上下文那樣操作?也許一種方式來拋出一個模擬信號或什麼?

回答

0

所以,如果我理解正確。

你讓Qt處理正確的按鈕(你不檢查你的插槽中的上下文),然後當失去焦點時菜單消失。

但是你處理左鍵點擊,你不能得到相同的行爲。對?

我能想到的,至少,兩種方式通過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

+0

你的理解是正確的。在閱讀你的例子時,它看起來應該起作用,出於某種原因,我的代碼中沒有觸發eventFilter。 – moesef 2013-05-08 22:04:23

+0

對於第二種方法安裝在菜單 – Trompa 2013-05-09 05:30:50

+0

並prolly,也在第二個方法,其QEvent :: MouseMove。我會改變代碼 – Trompa 2013-05-09 08:34:50

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; 
    } 
}