Qtでウィジェットのアスペクト比を維持するにはどうすればよいですか?ウィジェットを中央に配置するのはどうですか?
5 に答える
独自のレイアウト マネージャーを実装する必要はありません。QWidget
継承と再実装でできること
int QWidget::heightForWidth( int w ) { return w; }
四角いままでいること。ただし、heightForWidth()
明らかに X11 プロトコルがサポートしていないため、X11 のトップレベル ウィンドウでは機能しません。センタリングに関しては、 の 3 番目のパラメーターまたは の 5 番目のQt::AlignCenter
パラメーターとして渡すことができます。QBoxLayout::addWidget()
QGridLayout::addWidget()
注:少なくとも Qt の新しいバージョンでは、 QWidget にはheightForWidth
orwidthForHeight
がなく (オーバーライドできないため)、setWidthForHeight(true)
orsetHeightForWidth(true)
は QGraphicsLayout の子孫に対してのみ効果があります。
正しい答えは、カスタム レイアウト マネージャーを作成することです。これは、 QLayoutをサブクラス化することで可能になります。
QLayout をサブクラス化するときに実装するメソッド
- void addItem(QLayoutItem* item);
- レイアウトに項目を追加します。
- int count() const;
- アイテム数を返します。
- QLayoutItem* itemAt(int インデックス) const;
- インデックスの項目参照を返します。ない場合は 0 を返します。
- QLayoutItem* takeAt(int インデックス);
- index からレイアウトの項目を取得して返すか、何もない場合は 0 を返します。
- Qt::Orientations expandDirections() const;
- レイアウトのエキスパンド方向を返します。
- bool hasHeightForWidth() const;
- レイアウトが幅の計算のために高さを処理するかどうかを示します。
- QSize maximumSize() const;
- レイアウトの最小サイズを返します。
- void setGeometry(const QRect& rect);
- レイアウトのジオメトリとその中のアイテムを設定します。ここでは、縦横比を維持し、センタリングを行う必要があります。
- QSize sizeHint() const;
- レイアウトの優先サイズを返します。
参考文献
resize()
内部からの呼び出しresizeEvent()
は、私にとってはうまくいきませんでした。ウィンドウのサイズが2回(あなたが持っているように)変更されると、せいぜいちらつきが発生し、最悪の場合は無限ループになります。
固定アスペクト比を維持するための「正しい」方法は、カスタムレイアウトを作成することだと思います。QLayoutItem::hasHeightForWidth()
2つのメソッドとをオーバーライドする必要がありますQLayoutItem::heightForWidth()
。