2011-08-07 52 views
0

我從QMainWindow打開QDialog窗口。現在當我按下QDialog窗口 它並不總是在第一次按下 - 我需要按幾次(3-4)關閉它。 我有closeEvent插槽,裏面有簡單的event->accept();QDialog在按下X時不會立即關閉,如何使它不在頂部?

這是我如何調用QDialog的從主窗口:

void MyManager::DialogContainerOpen(type t) 
{ 
if(pMyDialogContainer == NULL) 
{ 
    pMyDialogContainer = new MyDialogContainer(); 
} 

int returnVal = QDialog::Rejected; 
if(!m_bContainer) 
{ 
    m_bContainer = true; 

    int returnVal = pMyDialogContainer->exec(); 


    if(returnVal != QDialog::Accepted) { 
    m_bContainer = false; 
    } 
} 
} 

這是第一個問題。

第二個問題是我如何設置QDialog窗口不在頂部? (我不想它阻止的父窗口。

UPDATE
以及我發現,從主窗口的函數,示出了contexMenu 和裏面具有連接單/槽是保持調用所以我只是用斷開 我不知道它的最佳sulotion但其工作。
現在我juat有最後的問題。 這裏是代碼我希望它的確定

void MainWindowContainer::ShowContextMenu(const QPoint& pos) // this is a slot 
{ 

    QModelIndex modelIndx; 

    QPoint globalPos = ui.treeView_mainwindow->mapToGlobal(pos); 


    bool b1 = connect(OpenAction, SIGNAL(triggered()),m_SignalMapper, SLOT(map())); 
    m_SignalMapper->setMapping(OpenAction,voidID); 
    bool b2 = connect(m_SignalMapper, SIGNAL(mapped(QString)), this, SLOT(OpenWin(QString))); 

    QAction* selectedItem = ContextMenu.exec(globalPos); 

} 


void MainWindowContainer::OpenWin(QString gid) 
{ 
    //disconnect(sender0, SIGNAL(overflow()),receiver1, SLOT(handleMathError())); 
    disconnect(m_SignalMapper, SIGNAL(mapped(QString)),this, SLOT(OpenWin(QString))); 
    disconnect(OpenAction,SIGNAL(triggered()),m_SignalMapper, SLOT(map())); 

.... 
.... 

} 
+0

當你不重寫'closeEvent'時會發生什麼? (這不是順便說一句) – Mat

回答

1

關於第二個問題,你是這個詞尋找模態vs無模式對話。該QDialog文檔準確地告訴你如何創建非模態對話框:

模態對話框用show(),它立即返回控制給調用者顯示。

即不使用exec(),因爲這樣會形成一個模態對話框(阻止父對象)。

除非您希望多次執行操作,否則不應該多次連接相同的信號/插槽。您只需將QAction的信號連接到插槽一次。這通常是在創建動作的構造函數(或從構造函數調用的專用函數)中完成的。