Qt: родительско-дочерние виджеты. Означает ли закрытие одного дочернего виджета закрытие других дочерних виджетов?

#c #qt #parent-child

#c #qt #родитель-потомок

Вопрос:

У меня следующая проблема с тестовым приложением Qt, которое содержит один родительский виджет и два дочерних виджета, которые являются отдельными окнами. Если родительский виджет скрыт, то закрытие одного дочернего виджета подразумевает закрытие второго дочернего виджета, а также закрытие всего приложения.

Является ли это нормальным поведением родительских / дочерних виджетов в Qt? Есть ли способ сохранить видимым второй дочерний виджет и запустить приложение?

 #include <QApplication>
#include <QtWidgets>

class MyWidget : public QWidget {
public:
    MyWidget(const QStringamp; title = "", QWidget *parent = nullptr) :
        QWidget(parent) {
        setWindowTitle(title);
        setWindowFlags(windowFlags() | Qt::Window);
        setVisible(true);        
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget parent("Parent");
    MyWidget *child1 = new MyWidget("Child1", amp;parent);
    MyWidget *child2 = new MyWidget("Child2", amp;parent);
    QTimer::singleShot(5000, [amp;](){parent.hide();});

    return a.exec();
}
 

Существует три виджета простого класса MyWidget:
родительский ‘parent’ с двумя дочерними ‘child1’ и ‘child2’.
Через 5 секунд родительский виджет скрывается QTimer::singleShot .
После этого, если я закрою, например, дочернее окно 1, второе дочернее окно
2 также автоматически закрывается, и приложение завершается.

Я бы ожидал, что дочерние виджеты child1 и child2 независимы, и закрытие одного из них не должно закрывать другой.

Ответ №1:

Обычно дочерние элементы в Qt не зависят от другого, как вы этого хотите. Однако, когда закрывается последнее основное окно (см. QApplication::lastWindowClosed), приложение закрывается целиком. Вероятно, это то, что здесь происходит. Хотя я не уверен, почему.

Что вы могли бы попробовать, так это вручную определить closeEvents для ваших окон. Тем не менее, ваше поведение странно, поскольку я помню, как читал, что скрытие родительского окна также должно скрывать его дочерние элементы здесь: (https://www.qtcentre.org/threads/61708-Multiple-windows-hide-parent-when-child-shown-unhide-when-child-closed).

Комментарии:

1. Спасибо! Код hide(); событие-> игнорировать(); в переопределенном closeEvent(событие QCloseEvent *) действительно предотвращает скрытие другого дочернего окна.