QPainter терпит неудачу при начале вызова

Я пытаюсь нарисовать файл PNG на QsplashScreen. Я пытаюсь сделать это через QPainter. Причина, по которой я хочу сделать это через QPainter, заключается в том, что я хочу, чтобы он плавно минимизировался (пока он не исчезнет). Когда я просто перерисовываю его, он совсем не выглядит гладким.

Я передал QSplashScreen конструктору QPainter. Когда я вызываю begin() в QPainter с параметром QSplashScreen as, он терпит неудачу при утверждении d->active. То же самое происходит, когда я подаю Qpixmap.

Что я делаю не так? Как мне инициировать функцию begin() QPainter?


person user254974    schedule 20.01.2010    source источник


Ответы (2)


Вы хотите создать подкласс QSplashScreen и повторно реализовать drawContents. См. документацию.

Используйте художника, который они вам дают, и все будет в порядке.

person Adam W    schedule 20.01.2010
comment
Спасибо, это помогло мне, и я получил плавный переход. У меня еще есть одна проблема. По какой-то причине оригинальная картинка до сих пор лежит там. Что происходит, так это то, что я сначала показываю картинку в полном размере, а затем плавно уменьшаю ее. Проблема в том, что пока картинка сворачивается, исходная полноразмерная картинка все равно остается на заднем плане. Я попытался установитьVisible(false) для первой картины, и это не помогло... Есть идеи? Большое спасибо. - person user254974; 24.01.2010
comment
Не видя его, попробуйте поиграть с backgroundMode (doc.trolltech.com/4.6/qpainter. html#backgroundMode) и eraseRect (doc.trolltech.com/4.6/qpainter .html#eraseRect) - person Adam W; 24.01.2010

В частности, об использовании QPainter в документах для метода begin четко указано, что только один рисовальщик может быть активен на данном устройстве рисования одновременно, а также что использование версии-конструктора QPainter автоматически вызывает начало для значения, которое вы передали. Итак, если вы делаете это, как описано в вашем вопросе, например:

QWidget *widget( ... );

QPainter painter( widget );
painter.begin( widget ); // <-- error, we already have a painter active on that paint device (our own).
// Do stuff...
painter.end();

Возможно, Qt должен сначала закрыть устройство, а затем открыть новое, но код, подобный приведенному выше, означает, что вы не совсем понимаете, как работает QPainter. Вы почти всегда должны использовать версию, в которой вы передаете устройство конструктору, и вам никогда не нужно вызывать begin или end. (Иногда вы можете оставить рисовальщик на долгое время и специально использовать для него begin и end — в этом случае вам не следует инициализировать его на устройстве.)

person Caleb Huitt - cjhuitt    schedule 20.01.2010
comment
Я бы не согласился с последней частью. Если вы только начинаете, вы всегда должны переопределять события рисования или рисования, используя предоставленный вам QPainter. Но в любом случае вам следует прочитать документацию по функциям, которые вы используете. - person Adam W; 20.01.2010