サイズが大きすぎる場合に画像をスクロールできるように、このサンプル コード ( http://doc.qt.digia.com/4.6/widgets-scribble.html ) を変更しようとしました。
基本的に、これは mspaint のようなプログラムを作成するためのコードです (私のコードは、クラス名を変更したことを除いて、チュートリアルとほとんど同じです):
class ImageDisplay : public QWidget
{
Q_OBJECT
public:
ImageDisplay(QWidget *parent = 0);
~ImageDisplay();
void LoadImage(QString img);
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
private:
bool modified;
bool scribbling;
int myPenWidth;
QColor myPenColor;
QImage svgImage;
QPoint lastPoint;
private:
void ResizeImage(QImage *image, const QSize &newSize);
void DrawLineTo(const QPoint &endPoint);
};
カスタム ウィジェットをスクロール領域にアタッチするコード
...
scrollArea = new QScrollArea(centralWidget);
scrollArea->setWidgetResizable(true);
myImageDisplay = new ImageDisplay();
myImageDisplay->setGeometry(QRect(0, 0, 780, 559));
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
myImageDisplay->setSizePolicy(sizePolicy);
myImageDisplay->setMinimumSize(QSize(0, 0));
scrollArea->setWidget(myImageDisplay);
gridLayout->addWidget(scrollArea, 0, 0, 1, 1);
...
カスタム ウィジェットをスクロール領域内に配置しましたが、スクロールバーが表示されません。デバッグすると、ウィジェットのサイズは srollarea より大きくすることはできません。
ウィジェットのサイズをコンテナのサイズよりも大きく拡張できない、またはちょっとよくわからないということをどこかで読んだことがあります。
ウィジェットの最小サイズを画像のサイズに設定する「ハック」のように見える洗練されていないソリューションを見つけました。コードをロード画像内に配置しました
void ImageDisplay::LoadImage(QString img)
{
QImage loadedImage;
loadedImage.load(img);
QSize newSize = loadedImage.size().expandedTo(size());
ResizeImage(&loadedImage, newSize);
svgImage = loadedImage;
modified = false;
update();
// "hack" code
this->setMinimumHeight(newSize.height());
this->setMinimumWidth(newSize.width());
}