子が非表示になっているときに qt ウィジェットのサイズを変更する
質問
再試行の子が非表示になっているときに、最初の画像のようにウィジェットのサイズを変更するにはどうすればよいですか?メインのレイアウトは QVBoxLayout であり、再試行の子も同様に QVBoxLayout を持つウィジェットです。
私は次のことを試しました:
- アップデート()
- updateGeometry()
- setGeometry(childrenRect())
- レイアウト()->アクティブ化()
再試行ウィジェットを非表示に設定するとすぐにメインウィジェットに表示されます。これを行うには、何らかのイベントをインターセプトする必要がありますか?
解決
adjustSize
の機能は、あなたがやりたいことがあります。
他のヒント
ここでウィジェットの表示/非表示時に自動サイズ変更ない基本的な例です。
dialog.hファイルます:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QtGui>
class dialog : public QDialog
{
Q_OBJECT
public:
explicit dialog(QWidget *parent = 0)
{
vlayout.addWidget(&checkbox);
vlayout.addWidget(&label);
label.setText("Label");
setLayout(&vlayout);
this->layout()->setSizeConstraint(QLayout::SetFixedSize); // !!! This is the what makes it auto-resize
checkbox.setChecked(true);
connect(&checkbox,SIGNAL(toggled(bool)),&label,SLOT(setVisible(bool)));
}
private:
QVBoxLayout vlayout;
QCheckBox checkbox;
QLabel label;
};
#endif // DIALOG_H
とmain.cの
#include <QApplication>
#include "dialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
dialog d;
d.show();
return a.exec();
}
これは、私はちょうどのための答えを開発したものです! (注:これはPyQt4形態で説明する)
余分なパネルの表示と非表示時に私が再サイズ私のアプリのウィンドウに能力を必要としています。 しかし、過去に私が再サイズのウィンドウが必要ではなかったように、単にUIおよび/または作業フローを再構成することになりました。しかし、今では必要不可欠です。
ウィンドウには、その作成時に再サイズにすることができます。ウィンドウをリサイズすることができ、直接(例えばself.resize(XSIZE、YSIZE) しかし、あなたが必要なサイズをキャプチャするコードのいくつかの行を作成する場合、必要な部分を隠し、サイズがどうあるべきか再計算し、再サイズは全く取らないことのようです。
(実施例)
curHgt = self.size().height()
curWth = self.size().width()
myFrmHgt = self.ui.reviewFrm.size().height()
self.ui.reviewFrm.hide()
self.resize( curWth, (curHgt - myFrmHgt ) )
何もありません。動作しません。なぜいけないのでしょうか?
これは答えのために、今日の狩りはまだ生き答えを思い付くしませんでした。オプションにはいくつかの製品があります。ウィジェット階層を狩り、無効、adjustSize。あなたがメインウィンドウサイズ直ししようとしている場合はうまく動作しないことに揺れ、むしろ徹底的なレイアウト。 FixedSizeにあなたの制約を設定するというのが圧倒的な反応もありました。しかし、それはむしろちょっとあなたがハングネイルを持っている場合は、手首であなたの手を切断するというような、全体の目的に反します。
しかし、私は中掘りやサイズ変更が保留を取っていない理由が原因でサイズ変更をリセットします投稿イベントのキューであることを発見して、いくつかの成功を持っていた誰かに遭遇んでした。
彼の解決策は、キューに入れられたイベントは、あなたのウィンドウをリセットしないように、ちょうどあなたのアプリケーションの再サイズを行う前に、QApplication.sendPostedEvents()を実行するようにしました。 はいといいえ。 はい、これが解決策である、と私はそれを行うためのきれいな方法があると確信しているが、あなたは本当に最初の洗浄ペイントローラーのようなキューを振る必要があります。
ここで私はこれまで、固体のようだという設定というのが私の簡単なスニペットです。
result = [ self.size().width(), self.size().height() ]
if self.ui.reviewFrm.isVisible():
result[1] -= self.ui.reviewFrm.size().height()
self.ui.reviewFrm.hide()
while self.size().height() > result[1]:
self.appy.sendPostedEvents()
self.resize( result[0], result[1] )
いいえ。それはかなりではありません。しかし、ほとんどの私はそれがサイズを変更するウィンドウに許さ投稿イベントの前に二回ペイントローラーを振る見てきました。 サイズヒントを探して階層を通じて制約をロックしたり、親ウィジェットを振るか、登るする必要はありません。
私の問題は、私は、レイアウト内の子供がいた(代わりにQDialogまたはQMainWindowの)トップレベルのQWidgetを持っていたという点で少し異なっていました。これらの子供たちは、の大きなのにリサイズされたとき、彼らが小さくなったとき、QWidgetのは、対応するためにサイズ変更しますが、ありません。多くの上記のように、面積はちょうど空のスペースを持っていました。私は最終的に解決策を見つけます:
私のQWidgetのに使用されるレイアウトはsetSizeConstraintと呼ばれるプロパティを持っていました()。これは通常、単にそれを所有しているQWidgetのの「のminimumSizeを」影響する「QLayout :: SetDefaultConstraint」、設定されています。代わりに、私はレイアウトが所有しているのQWidgetのの固定の大きさ、それがために必要なときに効果的に小型化を調整製「QLayout :: SetFixedSize」を選択しました。
QLayout::SetFixedSize
を設定した後にサイズを変更できるようにしたい場合は、あなたもQWidget::resizeEvent()
をオーバーライドする必要があります。
void resizeEvent(QResizeEvent* event) override {
QWidget::resizeEvent(event);
layout()->setSizeConstraint(QLayout::SetMinAndMaxSize);
};