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

Posted

技术标签:

【中文标题】如何在 PyQt5 中自定义 QGroupBox 标题?【英文标题】:How to customise QGroupBox title in PyQt5? 【发布时间】:2016-10-14 12:54:35 【问题描述】:

这是一段创建简单 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_())

这就是我的输出:

现在假设我想为它添加一些样式,我通过将这一行添加到 initUI 方法来做到这一点:

gb.setStyleSheet("border: 1px solid gray; border-radius: 5px")

这是输出:

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

所以我实际上有三个问题:

    为什么标题移动了? 如何移动它并将其放置在我想要的任何位置(如果可能)? 如果我只是想在不指定边框样式属性的情况下修整边框角怎么办。假设我希望边框样式与第一张图片中的一样,但带有圆角。我该怎么做?

【问题讨论】:

【参考方案1】:

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

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

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

会产生这样的结果:

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

【讨论】:

非常感谢您的回答和有用的提示。至于 css,我更喜欢将所有 css 保存在一个单独的文件中。 是的,这样更好,我只是误解了第三点,抱歉:)【参考方案2】:

即使这个问题已经得到解答,我仍将发布我对在 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 代码如下所示:

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

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

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

    gb.setStyleSheet(self.getStyleSheet("./styles.qss"))

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

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

  def getStyleSheet(self, path):
    f = QFile(path)
    f.open(QFile.ReadOnly | QFile.Text)
    stylesheet = QTextStream(f).readAll()
    f.close()
    return stylesheet

if __name__ == "__main__":

  import sys

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

  sys.exit(app.exec_())

产生以下输出:

【讨论】:

在this answer的第二部分可以找到更简单的加载样式表(用于整个应用程序)的方法。 @ekhumoro 你是说第一个吗? 不,第二个,它将css文件路径插入到传递给QApplication的参数中。实际上只有两行代码。

以上是关于如何在 PyQt5 中自定义 QGroupBox 标题?的主要内容,如果未能解决你的问题,请参考以下文章

pyqt5_站点管理_db_windows

PyQt5-布局综合实例-12

PyQt5总结--index_windows

有没有办法将自定义 QGroupBox 添加到任何小部件/布局?

使用我的 QT5 自定义小部件调整 QGroupBox 大小

pyqt5_站点管理_stcd_windows