Название: QLabel setPixmap неверно уставливается картинка Отправлено: Alp от Апрель 23, 2010, 17:23 Сидел на библиотеке версии 4.5 проблем не было. Тут решил перейти на 4.6 (2010.02.1) полезли странные глюки.
Код
В итоге я получаю одну и ту же картинку (которая загружается последней) в первом и втором QLabel. WTF??? Особенный ВТФ получается с учетом того, что внутри setPixmap конструируется новый QPixmap - копия параметра. Название: Re: QLabel setPixmap неверно уставливается картинка Отправлено: Marat(Qt) от Апрель 23, 2010, 17:44 Что тут скажешь - новая логика. Используйте
Код: QPixmap pix1,pix2; А если вам не понраву такое, то перепишите свой код так: Код: QPixmap pix; Название: Re: QLabel setPixmap неверно уставливается картинка Отправлено: SABROG от Апрель 23, 2010, 17:57 В таком виде всё нормально работает.
Код
QLabel копирует картинку и создает новый QPixmap через new внутри метода setPixmap(). Старую можно грохать, её изменение никак не влияет на содержимое в QLabel. Название: Re: QLabel setPixmap неверно уставливается картинка Отправлено: Alp от Апрель 23, 2010, 17:58 Что тут скажешь - новая логика. Используйте Код: QPixmap pix1,pix2; А если вам не понраву такое, то перепишите свой код так: Код: QPixmap pix; А где в Ассистанте про эту новую логику можно почитать? Это реализация принципа "CopyOnWrite" (если я верно понимаю его)? Проблема решилась несколько изящнее: something->setPixmap(pix.copy()) однако то, что эта новость не отображена в документации (может, конечно, и отображена, но сразу же я её не нашел) настораживает. Название: Re: QLabel setPixmap неверно уставливается картинка Отправлено: Marat(Qt) от Апрель 23, 2010, 18:03 А где в Ассистанте про эту новую логику можно почитать? Это реализация принципа "CopyOnWrite" (если я верно понимаю его)? Проблема решилась несколько изящнее: something->setPixmap(pix.copy()) однако то, что эта новость не отображена в документации (может, конечно, и отображена, но сразу же я её не нашел) настораживает. именно о таком изяществе я и хотел вам сказать, scaled тоже создает копию, просто я невнимательно читал ваш код, не понял что label подгоняется под картинку.Возможно такие новшества описаны в changelog'ах или в release notes'ах. Я сам на подобное попадал(с relationalTableModel). Цитировать QLabel копирует картинку и создает новый QPixmap через new внутри метода setPixmap(). Старую можно грохать, её изменение никак не влияет на содержимое в QLabel. А что если нет? [IMHO] Ваш пример мало о чем говорит. Метод load меняет одно(несколько) свойство объекта, а вот метод operator= работает несколько иначе, он возвращает ссылку на QPixmap, т.е. во втором setPixmap вы передаете уже несколько иную ссылку, тогда как в примере топикстартера ссылка одна и та же. [/IMHO] Название: Re: QLabel setPixmap неверно уставливается картинка Отправлено: SABROG от Апрель 23, 2010, 18:24 Какой-то косяк скрылся в методах QPixmap::load, QPixmap::loadFromData.
удалось воспроизвести таким образом: Код
Вероятно где-то засбоила copy-on-write. Получается QPixmap не считает за write загрузку картинки через load/loadFromData. Можно подсобить конечно таким образом: Код
Тогда copy-on-write срабатывает нормально. Название: Re: QLabel setPixmap неверно уставливается картинка Отправлено: SABROG от Апрель 23, 2010, 19:11 Вот он багрепорт, всё уже украдено до нас: http://bugreports.qt.nokia.com/browse/QTBUG-8606
Аж (http://bugreports.qt.nokia.com/images/icons/priority_critical.gif)P1: Critical Ждите 4.6.3. Хотел запостить этот код в качестве багрепорта, но раз уж он уже не нужен, оставлю тут для тех, кто захочет проверить, если будет регрессия или подозрения на этот баг: Код
Для версии Qt 4.6.3 уже 320 (http://bugreports.qt.nokia.com/browse/QTBUG/fixforversion/11572) багфиксов набралось. Один из которых даже мой (http://bugreports.qt.nokia.com/browse/QTBUG-7843) багрепорт. |