QScrollAreaの初期サイズを設定する方法は?
質問
これは非常に具体的な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より小さいサイズにサイズ変更する機能を失います。
アイデアはありますか
解決
あなたは問題を間違った方法で見ていると思います。 QScrollAreaは、フレームまたはQMainWindowに配置する単なるウィジェットです。ウィジェットのサイズは、ウィジェットを含むウィジェットのレイアウトによって制御されます。
Trolltechの次の例をご覧ください。画像ビューアー例
他のヒント
スクロール領域はトップレベルのウィジェットですか?もしそうなら、単に呼び出します
area->resize(300,300);
階層内にある場合は、トップレベルを適切に(複雑に)サイズ変更するか、エリアのminimumSizeを設定する必要があります。また、LayoutPolicyを試すこともできます。sizeHintがQSize(300,300)であると仮定すると、 https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum
お試しください:
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()を呼び出してみてください。
あなたはそれほど簡単にできるとは思いませんが、それは(私が正しく読んでいるなら)内部領域が300x300になるようにウィジェットのサイズを調整することです。ただし、スクロールエリアはフレームの一種であり、QWidgetから継承されるため、それをごまかすことができる場合があります。これは、 area-> resize(300 + fudge、300 + fudge)
を呼び出すことができることを意味します。ここで、ファッジ値は、フレームの描画が占める余分なビットを考慮します。
ただし、これが動的にサイズ変更可能なダイアログで機能するかどうかはわかりません。このようなことは一度もしていません。
スクロール領域内に画像を表示しようとしている場合、最善の策はラベルを使用しないことです。
(スクロール領域とラベルの代わりに)QGraphicsView / QGraphicsScene / QGraphicPixmapItemを使用してみてください。画像を表示するときのパフォーマンスははるかに優れています。スクロールバーを使用して移動すると、スクロール領域とラベルは画像の再描画が非常に悪くなります。
たとえば、" .ui" " qgvImageView"というGUIのQGraphicsViewを含むファイル" image"と呼ばれるQImage ...
QGraphicsScene *scene = new QGraphicsScene(qgvImageView);
QPixmap pixTmp(QPixmap::fromImage(image));
QGraphicsPixmapItem * ppixItem = scene->addPixmap( pixTmp );
ppixItem->setPos(0,0);
QTドキュメントをご覧ください。ところで:これはQt 4.2で導入されました
これが問題を具体的に解決するかどうかはわかりませんが、QGraphicsViewがあなたがやろうとしていることによりよく反応する可能性があります。
使用方法
area->setGeometry(int x, int y, int w, int h);