1

サイズが大きすぎる場合に画像をスクロールできるように、このサンプル コード ( 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());
}
4

1 に答える 1

1

これは実際には「ハック」ではありません。これが本来あるべき姿です。ウィジェットが表示される画像よりも小さくならないようにしたい場合は、それがあなたのすることです。画像よりも小さくならないことを伝えます。しかし、あなたのコードでは、その内容よりも小さくすることができると指定しました:

QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

これが意味することは、ウィジェットのコンテンツが切り取られていることを意味する場合でも、ウィジェットはコンテナーの可視領域内に収まるサイズを持つことを好むということです。

ただし、これを行うよりエレガントな方法は、代わりにこれを使用することです。

QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

これにより、ウィジェットのサイズをまったく変更しようとしないようにレイアウトに指示されます。画像をロードするときにサイズを設定すると、手動でサイズを変更しない限り、そのサイズが維持されます。

そうは言っても、カスタム QWidget クラスの代わりに QLabel を使用することを検討する必要があるかもしれません。QLabel は既に画像を表示するように設定されており、どのサイズにするべきかを独自に認識していると思います。

于 2013-06-10T16:40:43.787 に答える