如何自定义QTreeWidget表头的字体

1 投票
3 回答
8713 浏览
提问于 2025-04-18 15:14

使用:

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版本?这里是截图:

enter image description here enter image description here

3 个回答

0

假设你想让整个标题的字体保持一致,你可以这样做:

tree.header().setFont(font)
2

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 的单个树形小部件设置列标题样式)。

再告诉我更多吧,先生!

当然可以,亲爱的先生。你还可以查看:

0

这可能只需要用QSS就能解决这个问题:

http://doc.qt.io/qt-4.8/stylesheet-examples.html

撰写回答