如何自定义QTreeWidget表头的字体
使用:
tree=QtGui.QTreeWidget()
tree.setHeaderLabels(['Column 1','Column 2','Column 3'])
tree.setColumnWidth(0, 48)
tree.setColumnWidth(1, 48)
tree.setColumnWidth(2, 48)
QTreeWidget
被创建了。它的列标题被命名,并且设置了标题的横向大小。
现在我想自定义标题的字体大小。
font = QtGui.QFont()
font.setPointSize(8)
tree.headerItem().setFont(0, font)
但是像这样使用的 .setFont
并没有对标题的字体大小产生任何明显的效果。
我也尝试过:
tree.headerItem().setFont(0, font)
tree.headerItem().setFont(1, font)
tree.headerItem().setFont(2, font)
但也没有成功。请问应该用什么方法来调整 QTreeWidget
列标题的字体大小呢?
后续编辑:
示例1让列标题变大,但字体大小没有变化(?!):
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
tree=QtGui.QTreeWidget()
tree.setHeaderLabels(['One','Two','Tree','Four','Five'])
font=QtGui.QFont()
font.setPointSize(24)
tree.header().setFont(font)
tree.show()
sys.exit(app.exec_())
示例2尝试使用 QSS,结果字体大小依然没有变化:
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
tree=QtGui.QTreeWidget()
tree.setHeaderLabels(['One','Two','Tree','Four','Five'])
tree.header().setStyleSheet('font: bold 24px; font-size: 32pt; font-family: Courier;')
tree.setStyleSheet('font: bold 24px; font-size: 32pt; font-family: Courier;')
tree.show()
sys.exit(app.exec_())
示例3使用了 setHeaderItem,但也没有成功:
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
tree=QtGui.QTreeWidget()
font=QtGui.QFont()
font.setPointSize(36)
item=QtGui.QTreeWidgetItem()
item.setText(0,'Column name')
item.setFont(0,font)
tree.setHeaderItem(item)
tree.show()
sys.exit(app.exec_())
示例5通过主窗口:
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
mainWindow=QtGui.QMainWindow()
mainWidget=QtGui.QWidget()
mainWindow.setCentralWidget(mainWidget)
mainLayout = QtGui.QVBoxLayout()
mainWidget.setLayout(mainLayout)
mainWindow.setStyleSheet('QWidget { font: bold italic large "Times New Roman" }')
tree=QtGui.QTreeWidget()
tree.setHeaderLabels(['One','Two','Tree','Four','Five'])
mainLayout.addWidget(tree)
mainWindow.show()
sys.exit(app.exec_())
编辑 #2
我刚在另一台机器(OSX)上运行了这些示例代码。令我惊讶的是,代码正常工作,标题字体设置得很好。有趣的是,为什么在一台Mac上能工作而在另一台上却不行呢?这可能是 sip
的问题吗?Qt版本?PyQt版本?这里是截图:


3 个回答
假设你想让整个标题的字体保持一致,你可以这样做:
tree.header().setFont(font)
QTreeWidget
的列标题字体是可以调整的。
如果你是从遥远的未来来到这里,最简单的方法就是在你应用的 QMainWindow
小部件的样式表中,使用 QHeaderView::section
选择器来设置样式。这样做可以把所有的样式集中到一个样式表中,并且可以在 Qt (Creator|Designer) 中立即预览这些样式。
...啥意思?
具体来说,假设你在使用 Qt (Creator|Designer):
- 在你应用的 对象 树视图中,右键点击
QMainWindow
小部件。 - 左键点击 更改样式表... 菜单项。
复制并粘贴以下 QSS:
QTreeWidget QHeaderView::section { font-size: 8pt; }
点击 确定。
好了! Qt 的样式表(QSS)非常强大。很多时候,它们是以跨平台和向前兼容的方式完成特定美观任务的唯一手段。...这其实有点糟糕。
最后要注意,上面提到的 QTreeWidget
父选择器在这个情况下是可选的,但它允许你只为一个树形小部件设置样式,而不是为所有树形小部件设置样式(例如,QTreeWidget#muh_widget QHeaderView::section
,为对象名为 muh_widget
的单个树形小部件设置列标题样式)。
再告诉我更多吧,先生!
当然可以,亲爱的先生。你还可以查看:
这可能只需要用QSS就能解决这个问题: