3

これは非常に具体的なC++およびQt関連の質問であることは知っていますが、とにかく誰かが私を助けることができるかもしれません...

以下のコードを参照してください: スクロール領域内に画像を表示したいです。スクロール領域のビュー ポートには、定義済みの初期サイズが必要です。つまり、画像のサイズがビュー ポートの初期サイズよりも大きい場合はスクロール バーが表示され、それ以外の場合は表示されません。

// create label for displaying an image
QImage image( ":/test.png" );
QLabel *label = new QLabel( this );
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new QScrollArea( this );
area->setWidget( label );

// set the initial size of the view port
// NOTE: This is what I'd like to do, but this method does not exist :(
area->setViewPortSize( QSize( 300, 300 ) );

ビューポートが最初のサイズとは別のサイズになるように、アプリケーション全体のサイズを変更できます。

残念ながら、ビューポートのサイズを設定する方法を見つけることができませんでした。Qt のレイアウト メカニズムでは、ビュー ポートのデフォルト サイズが設定されているようですが、これまでは変更できませんでした。で新しいサイズを設定する

area->setMinimumSize( QSize( 300, 300 ) );

実際に要求されたサイズを設定しますが、スクロール領域は 300x300 より小さいサイズにサイズ変更する機能を失います。

何か案は?

4

6 に答える 6

2

スクロール領域はトップレベルのウィジェットですか? その場合は、電話するだけです

area->resize(300,300);

階層内にある場合は、トップレベルを適切に (複雑に) サイズ変更するか、領域の minimumSize を設定する必要があります。また、LayoutPolicy を試してみることもできます。sizeHint が QSize(300,300) であると仮定すると、https://doc.qt.io/qt-5/qsizepolicy.html#Policy で定義されている内容に従って、適切なサイズ ポリシーを与えることができます。 -列挙

于 2009-01-02T19:52:20.630 に答える
2

あなたは問題を間違った方法で見ていると思います。QScrollArea は、フレームまたは QMainWindow に配置する単なるウィジェットです。ウィジェットのサイズは、それを含むウィジェットのレイアウトによって制御されます。

Trolltech からのこの例を見てみましょう: Image Viewer Example

于 2008-10-30T20:13:45.660 に答える
1

あなたが試すことができます:

class MyScrollArea : public QScrollArea
{
    virtual QSize sizeHint() const { return QSize( 300, 300 ); }
};

// create label for displaying an image
QImage image( ":/test.png" );
Label *label = new QLabel;
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new MyScrollArea( this );
area->setWidget( label );

しかし、レイアウトと Qt は驚くほど Voodoo です。それはIMOの最も機能の少ない部分です。

それでもうまくいかない場合は、さまざまなウィジェットで QWidget::resize() を呼び出してみてください。

于 2008-10-30T14:00:07.990 に答える
0

スクロール領域内に画像を表示しようとしている場合、最善の策はラベルを使用することではありません。

(スクロール領域とラベルの代わりに)QGraphicsView / QGraphicsScene/QGraphicPixmapItemを使用してみてください。画像を表示するときのパフォーマンスははるかに優れています。スクロールバーを使用して移動すると、スクロール領域とラベルの再描画が非常に不十分になります。

たとえば、「qgvImageView」と呼ばれるGUI上のQGraphicsViewと「image」と呼ばれるQImageを含む「.ui」ファイルがあります。

QGraphicsScene *scene = new QGraphicsScene(qgvImageView);
QPixmap pixTmp(QPixmap::fromImage(image));
QGraphicsPixmapItem * ppixItem = scene->addPixmap( pixTmp );
ppixItem->setPos(0,0);

QTドキュメントを確認してください。ところで:これはQt4.2で導入されました

これで問題が具体的に解決するかどうかはわかりませんが、QGraphicsViewがあなたがやろうとしていることにうまく反応する可能性があります。

于 2008-11-04T22:46:12.010 に答える
0

それは、(私が正しく読んでいれば) 内部領域が 300x300 になるようにウィジェットのサイズを変更することです。ただし、スクロール領域はフレームの一種であり、QWidget を継承しているため、ごまかすことができる場合があります。これは、 を呼び出すだけでよいことを意味しますarea->resize( 300 + fudge, 300 + fudge )。ここで、ファッジ値は、フレームの描画に使用される余分なビットを考慮します。

ただし、これが動的にサイズ変更可能なダイアログで機能するかどうかはわかりません。私はこのようなことをしたことがありません。

于 2008-10-28T14:36:53.237 に答える
0

使ってみてはどうですか

area->setGeometry(int x, int y, int w, int h);
于 2009-01-03T19:00:46.677 に答える