Использование видеопамяти QLabel и эффекты QWidget :: hide () - PullRequest
0 голосов
/ 22 января 2019

Я пишу приложение, и потенциально могут быть десятки тысяч ярлыков (своего рода приложение для просмотра журналов), большинство из них скрыты с помощью QWidget :: hide (). Я представляю, что QLabel, когда создается, занимает немного видеопамяти. Теперь, hide () освобождает эту видеопамять? Или мне придется использовать QWidget :: remove () для большинства этих скрытых меток, чтобы поддерживать использование видеопамяти на разумном уровне?

1 Ответ

0 голосов
/ 22 января 2019

Как правило, большинство виджетов не хранят свои предварительно визуализированные изображения в памяти. Вместо этого они оказываются по требованию после признания их недействительными. Однако некоторые делают это, если рендеринг занимает много времени. Взглянул на исходный код QLabel (http://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/qlabel.cpp),. Кажется, что QLabel кэширует свое растровое изображение, когда scaledContents включен и масштабирование необходимо. Простые текстовые метки отображаются как есть, без кеширования.

Тем не менее, как упоминал @ G.M, каждый виджет потребляет некоторую системную память для хранения своих собственных данных и времени обработки из-за обработки событий, поэтому создание меток 10 КБ является разумной тратой ресурсов. Напротив, представления элементов - это отдельные виджеты, которые рисуют элементы на их поверхности. Нет обработки событий, нет ненужных кэшей. Как и в случае с QLabels, элементы представления элементов идеально подходят для стилизации, подробности см. http://doc.qt.io/archives/qt-5.8/stylesheet-examples.html#customizing-qlistview, http://doc.qt.io/archives/qt-5.8/stylesheet-examples.html#customizing-qtreeview. Более сложные выглядят так, как будто элементы многострочного списка достижимы с QItemDelegate: Qt QListWidgetItem Multiple Lines

...