Как нарисовать 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 рисовальщик на виджете, вы должны сделать это в событии рисования того же виджета.

В документации Qt 4.8

QPainter::QPainter(устройство QPaintDevice *)

Создает маляр, который сразу же начинает рисовать устройство для рисования.

это значит, позвонив QPainter конструктор с целевым устройством, это begin немедленно.

Итак, попробуйте угнать событие рисования области прокрутки.

К вашему сведению, всякий раз, когда вы захватываете событие в Qt, я рекомендую сначала вызывать реализацию базового класса в вашей новой реализации, подобной этой, чтобы поведение базового класса было сохранено.

Другие вопросы по тегам