Как правильно открыть и закрыть окно / диалог? - PullRequest
2 голосов
/ 14 июня 2010

Я пытаюсь разработать новую программу.Рабочий процесс выглядит следующим образом:

Login --> Dashboard (Window with menus) --> Module 1
                                        --> Module 2
                                        --> Module 3
                                        --> Module XXX

Итак, чтобы открыть Dashboard из Login (диалоговое окно), я использую

Dashboard *d = new Dashboard();
d->show(); 
close(); 

В Dashboard я использую эти коды для повторного открытия Loginесли пользователь закрывает окно (нажав «X»)

closeEvent(QCloseEvent *) 
{
    Login *login = new Login();
    login->show();
}

При открытом диспетчере задач я запускаю программу и наблюдаю за использованием памяти.После нажатия кнопки «Открыть панель мониторинга» в разделе «Вход в систему» ​​и закрытия панели инструментов для возврата в раздел «Вход в систему» ​​я заметил, что объем памяти увеличивается примерно на 500 КБ.Он может уйти до 20 МБ при использовании 12 МБ памяти, просто открыв и закрыв окно / диалог.

Итак, что я тут не так сделал?Мне нужно знать это, прежде чем я продолжу разрабатывать те модули, которые определенно потребляют больше памяти при моем программировании.Заранее спасибо.

1 Ответ

1 голос
/ 14 июня 2010

Одной из причин может быть то, что вы снова и снова создаете Login виджет без удаления его.

Я считаю, что ваш логин является QWidget, Панель инструментов - это QDialog.Вместо close() просто скройте виджет Login с помощью hide() или setvisible(false).

В closeEvent() DashBoard дают done(someIntValue);

При доступе к DashBoard вместо show () дают

int returnValue = d->exec();

, еслиreturnValue - это someIntValue, show() Виджет входа в систему.

Таким образом, вы избегаете создания виджета входа в систему несколько раз.Но многие другие факторы могут быть ответственны за использование памяти, что можно выяснить, только просмотрев весь код.

Редактировать:

Поскольку ваша панель инструментов является QMainWindow, вы не можете позвонить done(someIntValue); Вместо этого попробуйте подключить сигнал destroyed( QObject * obj = 0 ) DashBoard и в соответствующем слоте show() ваш логин .. Конечно, вы должны иметь экземпляр DashBoard в диалоге логин и соединение междувышеуказанный сигнал и слот должны быть сделаны в Login .

Надеюсь, это поможет.

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