如何在PyQt5中自定义QGroupBox标题?

2024-09-30 02:19:06 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一段创建简单QGroupBox的代码:

from PyQt5.QtWidgets import (QApplication, QWidget,
                             QGroupBox, QGridLayout)

class QGroupBoxTest(QWidget):
  def __init__(self):
    super().__init__()
    self.initUI()

  def initUI(self):
    gb = QGroupBox()
    gb.setTitle('QGroupBox title')

    appLayout = QGridLayout()
    appLayout.addWidget(gb, 0, 0)
    self.setLayout(appLayout)

    self.setWindowTitle('QGroupBox test window')
    self.setGeometry(300, 300, 300, 200)

if __name__ == "__main__":

  import sys

  app = QApplication(sys.argv)
  test = QGroupBoxTest()
  test.show()

  sys.exit(app.exec_())

在我看来,输出是这样的:

qgb-1.jpg

现在假设我想给它添加一些样式,我通过在initUI方法中添加以下行来实现:

^{pr2}$

输出如下:

qgb-1.jpg

从图片中可以清楚地看到,标题已经在框架内结束,现在与框架边界重叠。在

所以我有三个问题:

  1. 标题为什么会移动?在
  2. 我如何移动它并把它放在我想要的任何地方(如果可能的话)?在
  3. 如果我只想在不指定border-style属性的情况下舍入边框角呢。假设我希望边框样式保持与第一张图片相同,但有圆角。我该怎么做?在

Tags: testimportselfappinitdefsysgb
2条回答

1)这可能是默认的QT布局,在第一张图片中使用平台样式,它负责边框和标题的位置,当您更改样式表时,您会覆盖某些内容并得到难看的位置。在

2)您可以使用QGroupBox:title控件控制“title”位置,例如:

gb.setStyleSheet('QGroupBox:title {'
                 'subcontrol-origin: margin;'
                 'subcontrol-position: top center;'
                 'padding-left: 10px;'
                 'padding-right: 10px; }')

会导致这样的结果:

title

3)我的建议是为要更改的样式表属性创建不同的字符串,然后组合它们以创建所需的样式。

尽管这个问题已经得到了回答,但我还是会把我对PyQt中的小部件应用样式表的技术的理解贴出来,这部分回答了我最初的问题。我希望有人会发现它有用。在

我认为最好将样式保存在单独的css(qss)文件中:

/*css stylesheet file that contains all the style information*/

QGroupBox {
  border: 1px solid black;
  border-radius: 5px;
}

QGroupBox:title{
  subcontrol-origin: margin;
  subcontrol-position: top center;
  padding: 0 3px 0 3px;
}

python代码如下所示:

^{pr2}$

产生以下输出:

qgb-1.jpg

相关问题 更多 >

    热门问题