2011-08-07 49 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的信号连接到插槽一次。这通常是在创建动作的构造函数(或从构造函数调用的专用函数)中完成的。