簡體   English   中英

如何在QScrollArea上繪制QImage? 做到了這一點,但有一些小問題QPainter :: begin:小部件繪畫只能作為paintEvent的結果開始

[英]How to draw QImage on QScrollArea? Did this, but have some minor problems QPainter::begin: Widget painting can only begin as a result of a 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 paintEventQPainter::begin: Widget painting can only begin as a result of a paintEvent但是我能夠運行該應用程序,並打開/關閉圖像。 因此,該程序實際上可以與此一起使用,但是它的錯誤消息使我感到困擾,我想知道如何擺脫它。 有了這個,上面的src代碼應用程序中只有一條更改的行可以正常工作並顯示圖像:

在此處輸入圖片說明

問題是,您想在哪里繪制:在ImageWidgetimgDisplayLabelscrollArea

如果我的解釋正確,那么警告基本上是在說,如果您想在小部件上begin繪畫,則應在同一小部件的paint事件中進行。

Qt 4.8文檔中

QPainter :: QPainter(QPaintDevice *設備)

構造一個畫家,該畫家立即開始繪畫繪畫設備。

這意味着通過使用目標設備調用QPainter構造函數,它將立即begin

因此,請嘗試劫持滾動區域的繪畫事件。

僅供參考,當你在Qt的劫持事件,我建議首先在您調用基類的實現新的實施像這樣使基類的行為得以保留。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM