PyQt - QTabWidget - 移动选项卡时的选项卡文本字体
我有一个带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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。