Ваши экземпляры макета являются переменными стека, поэтому они разрушаются после возврата конструктора.Другие объекты теперь имеют указатели на экземпляры, которые больше не существуют.Это обычно означает сбой.
Сделайте ваши экземпляры макета закрытыми членами FindDialog
, чтобы этого не происходило.
Обратите внимание, что при создании экземпляров QObject в стеке вы должны быть осторожны спорядок декларирования.Когда QObject будет уничтожен, он удалит все свои дочерние объекты, если они не были уничтожены.Это означает, что вам нужно убедиться, что ваши виджеты уничтожены, прежде чем их макеты это сделают.(Это относится ко всем объектам QObject с отношениями родитель / потомок, а не только к макетам.) Если вы не обращаете на это внимания, родители попытаются удалить дочерние элементы, которые находятся в стеке (что, очевидно, недопустимо).
Порядок уничтожения членов класса является обратным порядку построения.Таким образом, члены, объявленные последними, уничтожаются первыми.В случае подклассов QLayout их необходимо уничтожить после их дочерних виджетов.Поэтому вам нужно сначала объявить их:
private:
QHBoxLayout topLeftLayout;
QVBoxLayout leftLayout;
QVBoxLayout rightLayout;
QHBoxLayout mainLayout{this};
QLabel label{tr("Find &what:")};
QLineEdit lineEdit;
QCheckBox caseCheckBox{tr("Match &case")};
QCheckBox backwardCheckBox{tr("Search &bacward")};
QPushButton findButton{tr("&Find")};
QPushButton closeButton{tr("&Close")};
Это одна из причин, по которой большая часть кода Qt, который вы видите там, вместо этого выделяет объекты QObject в куче (с new
).Вам не придется беспокоиться об этой проблеме, когда вы кладете их в кучу.Очевидно, что вы можете столкнуться с утечками памяти, когда объекты без родителей никогда не удаляются.Так что выбирай свой яд.