QT, я сделал диалог Modaless, и теперь я хочу закрыть все диалоги, нажав кнопку - PullRequest
1 голос
/ 18 апреля 2019

Я сделал немодальное диалоговое окно (см. Код ниже). Как закрыть все диалоговые окна, нажав кнопку?

mainwindow.h

private:
    Ui::MainWindow *ui;
    Dialog *dialog;
};

mainwindow.cpp

void MainWindow::on_pushButton_clicked()
{
    dialog = new Dialog(this);
    dialog->show();
}

void MainWindow::on_closeButton_Clicked()
{
    //here I want to close all opened dialogs.

}

1 Ответ

1 голос
/ 18 апреля 2019

Текст заголовка и вопроса немного несоответствующий. Где заголовок спрашивает

Я хочу закрыть все диалоги, нажав кнопку

текст вопроса предоставляет пример кода для одного диалога только в том случае, если указатель на диалог доступен как элемент.

Этот ответ относится к самому названию:

Один из вариантов закрытия всех открытых диалогов - просто запомнить их указатели в std::vector<QDialog*> и вызвать для них hide(), например, в MainWindow::on_closeButton_Clicked().

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

Каждый QObject хранит дочерний список объектов, которые созданы с первым в качестве родителя. (Это способ Qt для упрощения управления памятью.) Это то, что можно использовать здесь & rarr; все созданные диалоги должны появиться в этом списке.

Я сделал небольшой образец testQCloseAllDlgs.cc, чтобы проверить / проиллюстрировать это:

#include <QtWidgets>

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QMainWindow qWin;
  qWin.setWindowTitle("Close Dialogs Test");
  for (int i = 0; i < 3; ++i) {
    QDialog *pQDlg = new QDialog(&qWin);
    pQDlg->setWindowTitle(QString("Dialog %1").arg(i + 1));
    //pQDlg->show();
  }
  QPushButton qBtnCloseDlgs("Close All Dialogs");
  qWin.setCentralWidget(&qBtnCloseDlgs);
  qWin.show();
  for (QObject *pQChild : qWin.children()) {
    if (QDialog *pQDlg = dynamic_cast<QDialog*>(pQChild)) {
      pQDlg->show();
    }
  }
  // install signal handlers
  QObject::connect(&qBtnCloseDlgs, &QPushButton::clicked,
    [&qWin](bool){
      for (QObject *pQChild : qWin.children()) {
        if (QDialog *pQDlg = dynamic_cast<QDialog*>(pQChild)) {
          pQDlg->hide();
        }
      }     
    });
  // run time loop
  return app.exec();
}

и соотв. файл проекта testQCloseAllDlgs.pro:

SOURCES = testQCloseAllDlgs.cc

QT += widgets

Скомпилировано и протестировано в cygwin64 :

$ qmake-qt5 testQCloseAllDlgs.pro

$ make && ./testQCloseAllDlgs
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQCloseAllDlgs.o testQCloseAllDlgs.cc
g++  -o testQCloseAllDlgs.exe testQCloseAllDlgs.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 
Qt Version: 5.9.4

Snapshot of testQCloseAllDlgs

При нажатии на кнопку Закрыть все диалоги (единственный виджет главного окна) все 3 диалоговых окна исчезают.

Обратите внимание, что hide() не удаляет диалоги & ndash; только становятся невидимыми.

Это то, что я предпочитаю лично & rarr; перезапускать диалоги.

  • Чтобы снова сделать их видимыми, может быть вызван метод show().
  • Чтобы «перезапустить» первое в настоящее время скрытое диалоговое окно, цикл может быть изменен для проверки видимости диалоговых окон, пока не будет найден невидимый.

Альтернативно, диалоги могут быть удалены. (Они будут исключены из дочернего списка родителей автоматически.) Это еще один момент, когда стоит использовать уже существующий элемент QObject::children() вместо собственного бухгалтерского учета, поскольку последний может быть не совсем легко реализовать правильно. .

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