Qt: родительско-дочерние виджеты. Означает ли закрытие одного дочернего виджета закрытие других дочерних элементов? - PullRequest
2 голосов
/ 18 апреля 2019

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

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

#include <QApplication>
#include <QtWidgets>

class MyWidget : public QWidget {
public:
    MyWidget(const QString& 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", &parent);
    MyWidget *child2 = new MyWidget("Child2", &parent);
    QTimer::singleShot(5000, [&](){parent.hide();});

    return a.exec();
}

Есть три виджета простого класса MyWidget: родитель один 'родитель' с двумя дочерними объектами 'child1' и 'child2'. Через 5 секунд родительский виджет скрывается с помощью QTimer :: singleShot. После этого, если я закрою, например, окно child1, второе окно child2 также автоматически закрывается и приложение завершается.

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

1 Ответ

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

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

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

...