try to inspect this code.
it use QPainter to draw image in widget from ROI (Region Of Interests) on image.
it works on video card, so, you don't need to resize image on CPU when it scrolled. This code just draw the part of image to widget rect.
imagewidget.h
Qt Code:
  1. #ifndef IMAGEMODEL_H
  2. #define IMAGEMODEL_H
  3.  
  4. #include <QObject>
  5. #include <QWidget>
  6. #include <QPaintEvent>
  7. #include <QMouseEvent>
  8. #include <QResizeEvent>
  9. #include <QPainter>
  10. #include <QDebug>
  11. #include <QAbstractSlider>
  12.  
  13. class ImageWidget : public QWidget
  14. {
  15. Q_OBJECT
  16. public:
  17. static QImage defaultImage();
  18. explicit ImageWidget(QWidget *parent);
  19. void setImage(QImage* image,bool bResetRoi);
  20. QRectF getRoi();
  21. void setRoi(QRectF newRoi);
  22. QSize getImgSize();
  23.  
  24. public slots:
  25. void on_setVScrollValue(int value);
  26. void on_setHScrollValue(int value);
  27.  
  28. signals:
  29. void resetRoi(QRectF roi);
  30. private:
  31. QImage m_img;
  32. QRectF m_roi;
  33. QRectF m_borders;
  34.  
  35. void paintEvent(QPaintEvent *event);
  36. void resizeEvent(QResizeEvent *event);
  37. };
  38.  
  39. #endif // IMAGEMODEL_H
To copy to clipboard, switch view to plain text mode 



imagewidget.cpp
Qt Code:
  1. #include "imagewidget.h"
  2.  
  3. QImage ImageWidget::defaultImage()
  4. {
  5. QImage img(100,100,QImage::Format::Format_Invalid);
  6. QPainter painter(&img);
  7. painter.setPen(QPen(Qt::black));
  8. painter.setBrush(QBrush(Qt::black,Qt::SolidPattern));
  9. painter.drawRect(QRect(QPoint(0,0),QSize(100,100)));
  10. return img;
  11. }
  12.  
  13. ImageWidget::ImageWidget(QWidget* parent)
  14. : QWidget(parent)
  15. {
  16. m_roi = rect() - contentsMargins();
  17. if(m_roi.width() > m_roi.height())
  18. m_borders.setSize(QSizeF(m_roi.width(),m_roi.width()));
  19. else
  20. m_borders.setSize(QSizeF(m_roi.height(),m_roi.height()));
  21. qDebug()<<m_roi;
  22. }
  23.  
  24. void ImageWidget::setImage(QImage *image,bool bResetRoi)
  25. {
  26. if(!image) return;
  27. if(!bResetRoi)
  28. {
  29. m_img = *image;
  30. update();
  31. return;
  32. }
  33. m_img = *image;
  34. m_roi = QRect(QPoint(0,0),size()) - contentsMargins();
  35. qDebug()<<m_roi;
  36. m_borders.setSize(m_img.size() * 1.2);
  37. m_borders.moveCenter(m_img.rect().center());
  38. update();
  39. }
  40.  
  41. QRectF ImageWidget::getRoi()
  42. {
  43. return m_roi;
  44. }
  45.  
  46. void ImageWidget::setRoi(QRectF newRoi)
  47. {
  48. bool bNormal = true;
  49. if(newRoi.height() < m_borders.height())
  50. {
  51. if(newRoi.top() < m_borders.top())
  52. {
  53. newRoi.moveTop(m_borders.top());
  54. bNormal = false;
  55. }
  56. if(newRoi.bottom() > m_borders.bottom())
  57. {
  58. newRoi.moveBottom(m_borders.bottom());
  59. bNormal = false;
  60. }
  61. }
  62. else
  63. {
  64. newRoi.moveCenter(QPointF(newRoi.center().x(),
  65. m_borders.center().y())
  66. );
  67. }
  68. if(newRoi.width() < m_borders.width())
  69. {
  70. if(newRoi.left() < m_borders.left())
  71. {
  72. newRoi.moveLeft(m_borders.left());
  73. bNormal = false;
  74. }
  75. if(newRoi.right() > m_borders.right())
  76. {
  77. newRoi.moveRight(m_borders.right());
  78. bNormal = false;
  79. }
  80. }
  81. else
  82. {
  83. newRoi.moveCenter(QPointF(m_borders.center().x(),
  84. newRoi.center().y())
  85. );
  86. }
  87. if(!bNormal) emit resetRoi(newRoi);
  88. m_roi = newRoi;
  89. qDebug()<<m_roi;
  90. }
  91.  
  92. QSize ImageWidget::getImgSize()
  93. {
  94. if(m_img.isNull())
  95. return size();
  96. return m_img.size();
  97. }
  98.  
  99. void ImageWidget::on_setVScrollValue(int value)
  100. {
  101. m_roi.moveTop(value);
  102. qDebug()<<m_roi;
  103. emit resetRoi(m_roi);
  104. update();
  105. }
  106.  
  107. void ImageWidget::on_setHScrollValue(int value)
  108. {
  109. m_roi.moveLeft(value);
  110. qDebug()<<m_roi;
  111. emit resetRoi(m_roi);
  112. update();
  113. }
  114.  
  115. void ImageWidget::paintEvent(QPaintEvent *event)
  116. {
  117. if(m_img.isNull())
  118. {
  119. QWidget::paintEvent(event);
  120. return;
  121. }
  122. if(m_img.format() == QImage::Format_Invalid)
  123. {
  124. QWidget::paintEvent(event);
  125. return;
  126. }
  127. QPainter painter(this);
  128. painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
  129. painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
  130. QBrush blackBrush;
  131. blackBrush.setColor(QColor(Qt::black));
  132. blackBrush.setStyle(Qt::SolidPattern);
  133. painter.setBackground(QBrush(Qt::black));
  134. painter.setBrush(blackBrush);
  135.  
  136. painter.drawRect(event->rect());
  137. painter.drawImage(event->rect(),m_img,m_roi.toRect());
  138. }
  139.  
  140.  
  141. void ImageWidget::resizeEvent(QResizeEvent *event)
  142. {
  143. QWidget::resizeEvent(event);
  144. }
To copy to clipboard, switch view to plain text mode