Как нарисовать QImage на QScrollArea? Сделал это, но есть небольшие проблемы QPainter::begin: рисование виджета может начаться только в результате paintEvent
Итак, вот что я хочу сделать: я хочу нарисовать QImage, чтобы окно имело полосы прокрутки в случае, если изображение оказалось слишком большим. На данный момент у меня есть что-то вроде этого:
#include "imagewidget.h"
#include <QImage>
#include <QPainter>
#include <QGridLayout>
#include <QLabel>
ImageWidget::ImageWidget(QWidget* parent)
: QWidget(parent)
{
m_image = QImage();
scrollArea = new QScrollArea(this);
QGridLayout *gridLayout = new QGridLayout(this);
imgDisplayLabel = new QLabel(this);
imgDisplayLabel->setPixmap(QPixmap::fromImage(m_image));
imgDisplayLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
imgDisplayLabel->setScaledContents(true);
imgDisplayLabel->adjustSize();
scrollArea->setWidget(imgDisplayLabel);
gridLayout->addWidget(scrollArea,0,0);
setLayout(gridLayout);
}
void ImageWidget::paintEvent(QPaintEvent* event)
{
QPainter paint(this);
if(!m_image.isNull())
paint.drawImage(0,0, m_image);
imgDisplayLabel->setPixmap(QPixmap::fromImage(m_image));
imgDisplayLabel->adjustSize();
imgDisplayLabel->setScaledContents(true);
}
void ImageWidget::setImage(QImage im)
{
m_image = im;
update();
}
void ImageWidget::removeImage()
{
m_image = QImage();
update();
}
Тем не менее, это не дает мне тот эффект, который я хочу получить:
Когда я меняюсь QPainter paint(this);
в QPainter paint(scrollArea);
У меня есть сообщение об ошибке (или, я думаю, это предупреждение): QPainter::begin: Widget painting can only begin as a result of a paintEvent
но я могу запустить приложение и открывать / закрывать изображения. Итак, программа на самом деле работает с этим, но это сообщение об ошибке беспокоит меня, и я хотел бы знать, как от него избавиться. При этом работает только одна измененная строка из вышеприведенного приложения src code и отображает изображения следующим образом:
1 ответ
Вопрос в том, где вы хотите рисовать: на ImageWidget
на imgDisplayLabel
или на scrollArea
,
Если я правильно интерпретирую, предупреждение в основном говорит, что если вы хотите begin
рисовальщик на виджете, вы должны сделать это в событии рисования того же виджета.
QPainter::QPainter(устройство QPaintDevice *)
Создает маляр, который сразу же начинает рисовать устройство для рисования.
это значит, позвонив QPainter
конструктор с целевым устройством, это begin
немедленно.
Итак, попробуйте угнать событие рисования области прокрутки.
К вашему сведению, всякий раз, когда вы захватываете событие в Qt, я рекомендую сначала вызывать реализацию базового класса в вашей новой реализации, подобной этой, чтобы поведение базового класса было сохранено.