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());
これが最適解かどうかはわかりませんが、少なくとも見た目は期待通りになりました。
以上
あなたの回答
tips
プレビュー