PyQt - QTabWidget - 移动选项卡时的选项卡文本字体

编程语言 2026-07-12

我有一个带QTabWidget的 PyQt应用程序。我已经用以下代码更改了选项卡的字体,效果很好。

tbfont = QFont('Verdana', 14)
tab.setFont(tbfont)

我现在已经用下面的选项把选项卡设为可移动

tab.setMovable(True)

现在我遇到一个奇怪的现象:当我移动选项卡时,选项卡文本会回到另一种字体。一旦它移动到新位置,上面的字体设置就会生效。我无法弄清楚如何让选项卡保持字体更改。把相同的字体应用到tabBar也没有帮助。

tab.tabBar().setFont(tbfont)

一种变通方法是把应用程序字体设置为与tbfont相同。但这会让我以后无法再单独修改tbfont。有没有人知道该怎么实现?下面给出一个最小示例

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QTabWidget
from PyQt5.QtGui import QFont


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QTabWidget Move test')
        self.setGeometry(100, 100, 400, 200)
        main_layout = QGridLayout(self)
        self.setLayout(main_layout)

        # create a tab widget
        tab = QTabWidget(self)

        tbfont = QFont('Verdana', 14)
        tab.setFont(tbfont)
        # First Tab
        tab1 = QWidget(self)

        # Second Tab
        tab2 = QWidget(self)

        # add pane to the tab widget
        tab.addTab(tab1, 'First')
        tab.addTab(tab2, 'Second')
        tab.setMovable(True)

        tab.tabBar().setFont(tbfont)

        main_layout.addWidget(tab, 0, 0, 2, 1)        

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

解决方案

答案是使用样式表,这应该能解决。错误发生的原因是Qt在控件使用拖拽设置创建时忘记复制字体;样式表是在绘制时应用的,因此字体就被固定住了。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QTabWidget
from PyQt5.QtGui import QFont


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QTabWidget Move test')
        self.setGeometry(100, 100, 400, 200)
        main_layout = QGridLayout(self)
        self.setLayout(main_layout)

        tab = QTabWidget(self)

        # Use stylesheet instead of setFont() — persists during drag/move
        tab.setStyleSheet("QTabBar::tab { font-family: Verdana; font-size: 14pt; }")

        tab1 = QWidget(self)
        tab2 = QWidget(self)

        tab.addTab(tab1, 'First')
        tab.addTab(tab2, 'Second')
        tab.setMovable(True)

        main_layout.addWidget(tab, 0, 0, 2, 1)

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

稍后你可以通过创建一个函数来动态更改字体,例如

def change_font(self, family, size):
    self.tab.setStyleSheet(
        f"QTabBar::tab {{ font-family: {family}; font-size: {size}pt; }}"
    )
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章