質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

1351閲覧

Qt5のQWidgetでsetFixedHeight()は使わず、自身に内包するウィジェットの高さを合計した高さに自動調整して欲しい

jiro.kaihatsu

総合スコア16

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/11/27 13:52

編集2021/11/28 07:18

Qt5のQWidgetの高さはどうやって決まるものなのでしょうか?

setFixedHeight()は使わず、QWidget自身に内包するウィジェットの高さを合計してほしいのですが、自動調整?その方法がわかりません。ぜひQt5経験者の方にアドバイスをいただきたいです。

以下、私の手元で思い通りに行かないケースを挙げます。

お詫び:

これまでQWidgetと言いましたが、正確にはQAbstractItemView派生の具象クラスです。ご存知のように、QAbstractItemViewの親はQAbstractScrollAreaであり、QAbstractScrollAreaの親はQFrameです。QFrameはQWidgetの子供なのでQWidgetと表現しました。正確でなくてすいません。以降の例で出現するSubPanelクラスはQAbstractItemView派生クラスです。

次の2つのウィンドウのように、単にQPushButtonとQTableWidgetを並べたケース(左)と、QPushButtonとQTableWidgetをまとめるQWidgetを追加したケース(右)では、右のQWidgetで並べる方はみょうに間延びしてます。QWidgetの高さが思ったより小さくなりません。

QWidgetでまとめないケース(左)QWidgetでまとめるケース(右)
左右

QWidgetにsetLayout()したQVBoxLayoutにたいして、setSizeConstraint(QLayout::SetFixedSize)してみましたが、処置前と処置後で差がありませんでした。

QWidget::setFixedHeight(任意の高さ)では任意の高さに変更できるのですが、それでは内包するウィジェットの高さを合計する必要が有り手間がかかるので避けたいです。

QWidgetの高さを内包するウィジェットの高さに合わせたいのですが、setFixedHeight()はQWidget自身に内包するウィジェットの高さを合計してほしいです。

念の為ソースコードを挙げておきます。

ポイントと成る箇所の抜粋

c++

1// :QWidgetでまとめないケース(抜粋) 2auto layoutBottom = new QVBoxLayout; 3{ 4 /* 5 * QPushButtonとQTableWidgetを並べています 6 */ 7 8 auto button = new QPushButton("middle bottom", this); 9 layoutBottom->addWidget(button); 10 11 auto table = new QTableWidget(this); 12 { 13 table->setColumnCount(3); 14 table->setRowCount(3); 15 table->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 16 table->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 17 auto h = table->horizontalHeader(); 18 h->setSectionResizeMode(0, QHeaderView::Stretch); 19 h->setSectionResizeMode(1, QHeaderView::Stretch); 20 h->setSectionResizeMode(2, QHeaderView::Stretch); 21 table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); 22 table->resizeRowsToContents(); 23 24 int nRowHeight = table->rowHeight(0); 25 int nTableHeight = 26 (table->rowCount() * nRowHeight) + 27 table->horizontalHeader()->height() + 28 2 * table->frameWidth(); 29 table->setMinimumHeight(nTableHeight); 30 table->setMaximumHeight(nTableHeight); 31 } 32 layoutBottom->addWidget(table); 33} 34mainLayout->addLayout(layoutBottom);

c++

1// :QWidgetでまとめたケース(抜粋) 2auto layoutBottom = new QVBoxLayout; 3{ 4 // SubPanelではQPushButtonとQTableWidgetを並べています 5 // 内容は先に挙げたコードとほぼ同一です 6 auto sub = new SubPanel(this); 7 layoutBottom->addWidget(sub, 0, Qt::AlignTop); 8 9 layoutBottom->setSizeConstraint(QLayout::SetFixedSize); 10} 11mainLayout->addLayout(layoutBottom); 12

ソース全体

ソース全体はGithub Gistに載せておきます。

https://gist.github.com/tacchang001/f8b4287020d30b3b5d8f6fc96a639963

検討中

2021/11/28 主レイアウトの最小高をSubPanelに設定してみた

ウィジェットやレイアウトのSizeやHintSizeを表示してみて、やっぱりというかSubPanel(QPushButtonとQTableWidgetのまとめ役)の高さが妙な高さ(というか私がよく分かっていない)であるため、見た目が妙な間延びで表示されているところまでは分かりました。

解決方法は分かっていませんが、期待に一番近いのはSubPanelの主パネルが示してくれる最小高をSubPanelの高さに指定する方法です。

c++

1setFixedHeight(layout->totalMinimumSize().height());

これが最適解かどうかはわかりませんが、少なくとも見た目は期待通りになりました。

以上

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問