简体   繁体   English

如何在Qt上自定义可滚动图像小部件

[英]How can scrollable image widget custom on Qt

I have problem to scrollable for my custom image Widget. 我的自定义图像小部件无法滚动。

This is my custom image Widget. 这是我的自定义图像小部件。

imagewidget.h: imagewidget.h:

#ifndef IMAGEWIDGET_H
#define IMAGEWIDGET_H

#include <QWidget>
#include <QImage>
#include <QString>
#include <QPaintEvent>
#include <QAbstractScrollArea>

class ImageWidget: public QWidget
{
public:
    explicit ImageWidget(QWidget *parent = 0);
    QImage m_Image;
    void loadImage(const QString &fileName);
protected:
    void paintEvent(QPaintEvent *event);
};

#endif // IMAGEWIDGET_H

imagewidget.cpp: imagewidget.cpp:

#include "imagewidget.h"
#include <QPainter>
#include <QPoint>
#include <QDebug>
#include <QScrollBar>


ImageWidget::ImageWidget(QWidget *parent): QWidget(parent)
{
}

void ImageWidget::loadImage(const QString &fileName)
{
    if(!fileName.isNull()){
        m_Image.load(fileName);
        this->update();
        qDebug()<<"Load Image"<<endl;
    }
}

void ImageWidget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    if(!m_Image.isNull()){
        p.drawImage(QPoint(0,0),m_Image);

    }
    qDebug()<<"Paint Event"<<endl;
}

And this is mainwindow.cpp 这是mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QScrollArea>
#include <QString>
#include <QFileDialog>
#include <QWidget>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    scrollArea(new QScrollArea())
{
    ui->setupUi(this);
    m_Image = new ImageWidget(this);
    scrollArea->setWidgetResizable(true);
    scrollArea->setWidget(m_Image);
    setCentralWidget(scrollArea);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionOpen_triggered()
{
   QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), "/", tr("Image Files (*.png *.jpg *.bmp *.tif *.tiff)"));

   m_Image->loadImage(fileName);
   m_Image->adjustSize();
   this->update();

}

With a large image, the image cannot diplay with scroll bar. 对于大图像,图像无法与滚动条一起显示。 My result is below. 我的结果如下。 Thank you for reading. 感谢您的阅读。 图像浏览器

You forget to set ImageWidget minimumsize. 您忘记设置ImageWidget minimumsize。

void ImageWidget::loadImage(const QString &fileName)
    {
    if(!fileName.isNull()){
        m_Image.load(fileName);
        setMinimumSize(m_Image.size());   //add this line
        this->update();
        qDebug()<<"Load Image"<<endl;
    }
}

ScrollArea shows scrollbars when its size is smaller than content's widget (ImageWidget in this case). ScrollArea的大小小于内容窗口小部件(在这种情况下为ImageWidget)时,会显示滚动条。 You just load image and paint it on widget but not change widget's size. 您只需加载图像并将其绘制在窗口小部件上,但不更改窗口小部件的大小。

:) My first answer on stackoverflow. :)我对stackoverflow的第一个答案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM