#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 *) действительно предотвращает скрытие другого дочернего окна.