2
Qtでうまくいけば明らかな機能を持つCollapse/ExpandボタンでGroupBoxを作成しようとしています。私はボタンを描くとQGroupBoxをサブクラス化しました。クリックすると、私のコードはGroupBoxのすべての子にsetVisible(false)
を呼び出します。さらに、GroupBox内のすべてのQLayoutsを通過し、contentMarginsをゼロに設定します。しかし、いくつかのGroupBoxはまだ折りたたまれた状態で他のものよりも大きく出てきます。折りたたみ可能なグループボックスをQtで作成する - 折りたたみサイズを決定するものは何ですか?
これは(私が可能nullptr
問題を認識だ)私は今のところ出ているものです:
void CollapsibleGroupBox::onVisibilityChanged()
{
CollapseExpandButton::State s;
s = m_clExpButton->state();
QLayout *master = this->layout();
QList<QObject *> children = this->children();
switch (s) {
case CollapseExpandButton::State::COLLAPSED:
for (QObject *o : children) {
QWidget *w = qobject_cast<QWidget *>(o);
if (w != nullptr) {
if (w != m_clExpButton)
w->setVisible(false);
continue;
}
if (o == master) {
m_layoutMargins.clear();
collapseLayout(master);
}
}
break;
case CollapseExpandButton::State::EXPANDED:
for (QObject *o : children) {
QWidget *w = qobject_cast<QWidget *>(o);
if (w != nullptr) {
w->setVisible(true);
continue;
}
if (o == master)
expandLayout(master);
}
break;
}
}
void CollapsibleGroupBox::collapseLayout(QLayout *layout)
{
for (QObject *o : layout->children()) {
QLayout *l= qobject_cast<QLayout *>(o);
if (l == nullptr)
continue;
collapseLayout(l);
}
if (m_layoutMargins.contains(layout))
return;
QMargins m = layout->contentsMargins();
m_layoutMargins[layout] = m;
layout->setContentsMargins(0, 0, 0, 0);
}
void CollapsibleGroupBox::expandLayout(QLayout *layout)
{
for (QObject *o : layout->children()) {
QLayout *l = qobject_cast<QLayout *>(o);
if (l == nullptr)
continue;
if (m_layoutMargins.contains(l))
expandLayout(l);
}
if (m_layoutMargins.contains(layout)) {
QMargins m = m_layoutMargins[layout];
layout->setContentsMargins(m);
}
}
レイアウトを隠して他に触れてみましたか?これはすべての子供を隠す仕事をするべきです。 –
また、折りたたんだ高さや幅について心配していますか?あなたはスクリーンショットを持っていますか? –
この時点で私は高さのみを心配しています。 'QLayout'は' setVisible() 'メソッドを持たないようです。異なるサイズの 折りたたみグループボックス:https://imgur.com/NqqvJwq ピーク:のhttp:// imgur http://imgur.com/tg4jSAw デザイナー HVLに示すこれらのウィジェットのスクリーンショットについては – user1134621