15

最初の画像のように見えるように、再試行の子が非表示になっているときにウィジェットのサイズを変更するにはどうすればよいですか? メイン レイアウトは QVBoxLayout で、再試行の子も QVBoxLayout を持つウィジェットです。

私は次のことを試しました:

  • アップデート()
  • updateGeometry()
  • setGeometry(childrenRect())
  • レイアウト()->アクティブ化()

再試行ウィジェットを非表示に設定するとすぐに、メインウィジェットで。これを行うには、何らかのイベントをインターセプトする必要がありますか?

4

5 に答える 5

21

adjustSize関数はあなたが望むことをするかもしれません。

于 2010-03-18T13:52:59.120 に答える
8

これは、ウィジェットの非表示/表示時に自動サイズ変更を行う基本的な例です。

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();
}
于 2013-01-27T12:22:34.310 に答える
4

これは私がちょうど答えを開発したものです!!! (注:これは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] )

いいえ。それはきれいではありません。ただし、投稿されたイベントでウィンドウのサイズが変更される前に、ペイントローラーが2回振られるのを見ただけです。制約をロックしたり、親ウィジェットを振ったり、階層を上ってサイズのヒントを探したりする必要はありません。

于 2012-02-22T23:36:21.787 に答える
4

私の問題は、レイアウト内に子を持つトップレベルの QWidget (QDialog または QMainWindow の代わりに) があるという点で少し異なりました。それらの子がより大きなにサイズ変更されたとき、QWidget は対応するようにサイズ変更されますが、それらが小さくなったときはそうではありませんでした。上記と同じように、エリアには空きスペースがありました。私は最終的に解決策を見つけました:

QWidget で使用されているレイアウトには、setSizeConstraint() というプロパティがありました。これは通常、それを所有する QWidget の「最小サイズ」に影響するだけの「QLayout::SetDefaultConstraint」に設定されます。代わりに、「QLayout::SetFixedSize」を選択しました。これにより、レイアウトが所有する QWidget の固定サイズを調整し、必要なときに効果的に小さくなります。

于 2011-01-19T00:22:18.580 に答える