2016-06-16 29 views
0

我有一個Qt的問題,即時通訊只試圖在一個特定的熱鍵被按下時調用一次QDialog,但我不斷收到多個QDialog。 我試圖當按下熱鍵時顯示一個對話框實例

private: 
ProductsDlg * pd; 

MainWindow.cpp:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    setCentralWidget(ui->MainTabWidget); 
    setFixedHeight(481); 
    setFixedWidth(335); 

    RegisterHotKey(HWND(winId()) , 0 , NULL , VK_F9); 

    //pd = new ProductsDlg(this); // I USED THIS TO TRY if(pd->isVisible()) Down in the Hotkey press Event. 
} 

bool MainWindow::nativeEvent(const QByteArray &eventType , void *message , long *result) 
{ 
    Q_UNUSED(eventType); 
    Q_UNUSED(result); 

    MSG * msg = static_cast<MSG*>(message); 
    if(msg->message == WM_HOTKEY) 
    { 
     if(!pd) 
     { 
      pd = new ProductsDlg(this); 
      pd->show(); 
     } 
    } 
} 

我知道即時做錯了什麼,因爲在我這一個崩潰關閉QDialog的,我再次按下熱鍵。 我試過如果(!pd-> isVisible())在Hotkey事件上,但並沒有真正做任何事情。 當QDialog關閉時,全局「dp」是否被刪除? BTW即時通訊使用setAttribute(Qt :: WA_DeleteOnClose);在那個QDialog上,如果這影響了任何事情。

編輯:我正在考慮一種方法只創建一次QDialog,只是顯示它並隱藏它時,熱鍵被稱爲,但我不知道如何完成,我仍然崩潰。

感謝

+0

'pd'在關閉後會保留一個指向舊的'QDialog'的指針,'if(!pd)'只會在第一次爲真。 。 。 – Mike

+0

您可以使用'QShortcut'而不是WinAPI。 –

+0

@Mike,是的,這是我最初的想法,圍繞它的任何解決方案?我試過使用一個變量設置爲FALSE當QDialog關閉時(QDialog的析構函數將其設置爲false時,它調用),但沒有,我不喜歡這種方法。 – Zylva

回答

0

我只是用顯示/隱藏方法和它的工作對我來說...我想我的問題是使用一個全局對象,並多次知道當QDialog的是它會被刪除使用它周圍像@Mike所說的那樣封閉!dp只在第一時間有效。

由於我的QDialog是無框架的,並且由於它也被一個熱鍵關閉,所以我使用隱藏而不是關閉它。

if(!dp->isVisible()) 
{ 
    dp->show(); 
} 
else 
{ 
    dp->hide(); 
} 

這就是我所需要的(相同的熱鍵顯示和隱藏)。

感謝您的所有答案!

相關問題