QDialog не закрывается сразу при нажатии X, как сделать так, чтобы он НЕ сверху? - PullRequest
0 голосов
/ 08 августа 2011

Я открываю окно QDialog из QMainWindow.Теперь, когда я нажимаю окно QDialog, оно не всегда закрывается при первом нажатии - мне нужно нажать несколько раз (3-4), чтобы закрыть его.У меня есть closeEvent слот с простым event->accept(); внутри.

Вот как я вызываю 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 НЕ находились сверху?(Я не хочу, чтобы оно блокировало родительское окно.

ОБНОВЛЕНИЕ
хорошо, я обнаружил, что функция из MainWindow, которая отображает contexMenu и внутри него, имеет единственное соединение/ slot является активным для вызова, поэтому я просто использовал разъединение, я не знаю, является ли он лучшим sulotion, но он работает.
Теперь у меня есть последняя проблема. Вот код, который я надеюсь, его хорошо

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()));

 ....
 ....

}

1 Ответ

1 голос
/ 08 августа 2011

В вашем втором вопросе термин, который вы ищете, это модальные и немодальные диалоги.Документация QDialog точно описывает, как вы создаете немодальные диалоги:

Немодальные диалоги отображаются с помощью show (), который немедленно возвращает управление вызывающей стороне.

т.е. не используйте exec(), поскольку это создаст модальное диалоговое окно (которое блокирует родительский элемент).

Не следует подключать один и тот же сигнал / слот более одного раза, если только вы не хотитедействие запускается несколько раз.Все, что вам нужно сделать, это подключить сигнал QAction к слоту один раз.Обычно это делается в конструкторе (или в специальной функции, вызываемой из конструктора), где вы создаете действие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...