Qt 可以隐藏QGroupBox框架但保留它吗';内容是否可见?

Qt 可以隐藏QGroupBox框架但保留它吗';内容是否可见?,qt,groupbox,Qt,Groupbox,我有一个QGroupBox。根据上下文的不同,它的标题可能是redundent(显示在GUI的另一个位置),因此我需要将QGroupBox设置为不在这里……但我必须将其内容保持可见(因此我不想调用QGroupBox::hide()) 我需要在运行时动态执行此操作,并希望避免创建/销毁QGroupBox+重新出租其内容…必须有更简单的方法来执行此操作 到目前为止,我尝试的是: QGroupBox可见: QGroupBox::setTitle(“”)删除文本 QGroupBox::setFlat

我有一个
QGroupBox
。根据上下文的不同,它的标题可能是redundent(显示在GUI的另一个位置),因此我需要将
QGroupBox
设置为不在这里……但我必须将其内容保持可见(因此我不想调用
QGroupBox::hide()

我需要在运行时动态执行此操作,并希望避免创建/销毁
QGroupBox
+重新出租其内容…必须有更简单的方法来执行此操作

到目前为止,我尝试的是:

QGroupBox
可见:

  • QGroupBox::setTitle(“”)
    删除文本
  • QGroupBox::setFlat(true)
    使帧成为单行
我的结论是:


还不算太糟……但还有一行……有没有办法完全隐藏
QGroupBox
框架,但保持其内容可见?

您可以从
QGroupBox
派生您自己的分组框,并重新实现
paintEvent()
方法。应该很简单。原始的
QGroupBox::paintEvent()
如下所示:

void QGroupBox::paintEvent(QPaintEvent *)
{
    QStylePainter paint(this);
    QStyleOptionGroupBox option;
    initStyleOption(&option);
    paint.drawComplexControl(QStyle::CC_GroupBox, option);
}
您需要做的只是在绘制小部件之前修改样式选项:

void CMyGroupBox::paintEvent(QPaintEvent *)
{
    QStylePainter paint(this);
    QStyleOptionGroupBox option;
    initStyleOption(&option);

    // This should disable frame painting.
    option.features = QStyleOptionFrame::None;

    paint.drawComplexControl(QStyle::CC_GroupBox, option);
}

您可以使用
QFrame
+
QGridLayout
(或更复杂的布局组合)+QSS而不是
QGroupBox

仅考虑
QGroupBox
,通过QSS的简单解决方案可能是:

static const char kSavedTitle[] = "_savedTitle";
void hideBoxFrame(QGroupBox * box) {
  box->setProperty(kSavedTitle, box->title());
  box->setTitle(QString());
  box->setStyleSheet("border:none");
}
void showBoxFrame(QGroupBox * box) {
  box->setTitle(box->property(kSavedTitle).toString());
  box->setStyleSheet(QString());
}

下面是一个通过交换小部件和重新租用子部件来实现的示例。它适用于任何具有直接子项的小部件,而不仅仅是
QGroupBox
。它需要对小部件(如
qscrolrea
QMainWindow
)进行特殊的案例处理,这些小部件将子部件包装在一个特殊的子小部件中

有关以编程方式升级小部件的相关讨论,请参阅

//https://github.com/KubaO/stackoverflown/tree/master/questions/group-reparent-36603051
#包括
///将可见小部件替换为隐藏小部件,从而保留
///并使新小部件可见。
无效SwapWidget(QWidget*a、QWidget*b)
{
自动src=a->isVisible()?a:b;
自动dst=a->isVisible()?b:a;
Q_断言(dst->ishiden());
///将孩子们移动到目的地
dst->setLayout(src->layout());
///将父级中的源替换为目标
自动布局=src->parentWidget()->layout();
删除布局->替换小部件(src、dst);
///断开源的连接,否则无法将其重新插入父级。
src->setParent(nullptr);
///只能看到目的地。
src->hide();
dst->show();
}
int main(int argc,字符**argv){
QApplication app{argc,argv};
qw;
QGridLayout wLayout{&w};
QPushButton交换{“交换”};
wLayout.addWidget(&swapBtn);
qnobox;
QGroupBox框{“组”};
wLayout.addWidget(&box);
QGridLayout-boxLayout{&box};
对于(int i=0;i<16;++i)
addWidget(新的QLabel(QString(“Tr%1”).arg(i)),i/8,i%8);
swapBtn.connect(&swapBtn,&QPushButton::clicked,[&]{swapWidgets(&box,&noBox);});
w、 show();
返回app.exec();
}
我的选择:

QGroupBox theBox;
theBox.setFlat(true);
theBox.setStyleSheet("border:0;");

是的,有一个选择,你可以尝试

您可以变形为QFrame,它将保持行为,但使容器无边界


您只需在QDesigner中的组框上单击鼠标右键,然后选择“变形为”选项从中进行选择

我遇到了类似的问题,我最终要做的是将内容放置在QTableWidget中。使用QTablewidget,我可以隐藏所有边框。@MasterAler:
QComboBox::setStyleSheet(“边框:无”)工作得非常完美。如果你加上这个作为答案,我很乐意接受。@KubaOber:只是希望找到更琐碎的东西。@user3183610:
QGroupBox
可以更改,
QTableWidget
不能…这是一个选项,但是设置起来比应用MasteralElectually评论的样式表更困难,这个解决方案实现起来与s差不多简单,但它的显著优点是不隐藏所有子窗口小部件的框架。设置
border:0
样式表虽然简单,但无条件地将该样式应用于所有子窗口小部件。那太糟糕了。虽然稍微不那么简单,但该解决方案没有这些关键缺陷。那很好。对于PyQt版本,我该怎么做?我不确定如何更改方法,因为模块没有逻辑<代码>def paintEvent(self,a0:QtGui.QPaintEvent)->无:…
不错的选择。但是QFrame不允许在栏上显示标题(“我的屏幕截图中的Emulator 0”)。但这似乎是使用标签实现这一点的最简单方法
QGroupBox theBox;
theBox.setFlat(true);
theBox.setStyleSheet("border:0;");