Как сделать так, чтобы диалоговое окно Qt получало информацию при блокировке главного окна от пользователя? - PullRequest
3 голосов
/ 18 августа 2010

У меня есть главное окно Qt, которое открывает диалоговое окно с кнопками ОК и Отмена. В этом диалоговом окне есть простой счетчик, который запрашивает у пользователя номер, который должен быть возвращен в главное окно при нажатии кнопки «ОК» или «Отмена» (для отмены он просто отправит обратно -1).

Я думал об использовании кода в сигнале в mainWindow.cpp примерно так:

void mainWindow::slot_openNumberDlg(){
    // Create a new dialog
    numberDlg dlg( this );

    // Show it and wait for Ok or Cancel
    if( dlg.exec() == QDialog::Accepted ){
        return;
    }
}

Но как мне вернуть значение счетчика в диалоговом окне обратно в главное окно, если оно будет уничтожено при нажатии кнопки?

Я также подумал об альтернативном решении, где я бы инициализировал диалог в конструкторе mainWindow, но он не отображается, пока сигнал не активирует слот в mainWindow.cpp, вот так:

// Create as pointer in main.h:
numberDlg *dlg;

// Initialize pointer and setup listener in constructor (main.cpp):
mainWindow::mainWindow(){
    dlg = new numberDlg();
    QObject::connect( dlg, SIGNAL( sig_retVal(int) ), ui->widget, SLOT( slot_showNum(int) ) );
}

// Make a function to handle show/close:
void mainWindow::slot_numberOpenClose(bool trigger){
    if(trigger){
        dlg->show();
    } else {
    dlg->close();
    }
}

Приведенный выше код сможет отправить число из счетчика диалога в mainWindow, используя сигнал / слот, но он не заблокирует mainWindow. Я не хочу, чтобы пользователь продолжал использовать mainWindow, пока диалоговое окно не было принято или отклонено.

Любые идеи о том, как я могу заблокировать главное окно и отправить номер обратно в главное при закрытии диалога?

Ответы [ 2 ]

7 голосов
/ 18 августа 2010

Что вам нужно сделать, это создать функцию в вашем диалоговом классе, которая возвращает желаемое значение, и использовать его следующим образом из вашего главного окна:

void mainWindow::slot_openNumberDlg(){
    // Create a new dialog
    numberDlg dlg( this );

    // Show it and wait for Ok or Cancel
    if( dlg.exec() == QDialog::Accepted ){
        m_theValue = dlg.myValue(); // <--
        return;
    }
} // dlg goes out of scope

dlg не будет уничтожен, пока не выйдетвне области, где я разместил комментарий, поэтому ваш метод будет работать нормально.

1 голос
/ 03 октября 2012

использовать dlg.setWindowModality (Qt :: WindowModal); :

void mainWindow::slot_openNumberDlg(){

  numberDlg dlg( this );
  dlg.setWindowModality(Qt::WindowModal);//blocks input to its parent window

  if( dlg.exec() == QDialog::Accepted )
  {
      dlg.setResult(true);//mask
      return;
  }
  else if(dlg.exec() == QDialog::Rejected)
  {
      dlg.setResult(false);//mask
      return;
  }
}



  if(dlg.getResult() == true)//value usable only when accepted
  {
      m_theValue = dlg.myValue();
  }

Если вы хотите более точный результат, переопределите метод closeEvent () QWidget для обработки кнопки выходавашего диалога.(или вы можете установить значение по умолчанию как ложное)

 void numberDlg::closeEvent(QCloseEvent *event)
 {
     setResult(false);
     close();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...