如何在 Pyside2 的 QTabWidget 中更改特定选项卡的字体?

Posted

技术标签:

【中文标题】如何在 Pyside2 的 QTabWidget 中更改特定选项卡的字体?【英文标题】:How to change the font of a specific tab in QTabWidget in Pyside2? 【发布时间】:2020-10-05 18:58:39 【问题描述】:

触发事件后,我想将特定选项卡的字体更改为使用粗体,而不是非粗体。

qtabwidget.tabs[4].setFontWeight(Bold)

如何做到这一点?

【问题讨论】:

没有单独的“标签”,QTabBar 绘制所有的“标签” 您显然有一个 XY 问题,因为您询问如何实施可能的解决方案(没有人保证它有效):如何获取 QTabWidget 的当前选项卡而不是询问关于根本问题:如何从当前选项卡将字体设置为粗体 谢谢,那么更改特定选项卡的样式表的方法是什么?我应该更新问题吗? 1)你必须重写你的问题,2)要更改字体,不仅可以使用Qt StyleSheet,所以不要问它,而不仅仅是问题:如何更改当前的字体标签? 运行时得到什么:print(QApplication.style(),metaObject().className())? 【参考方案1】:

一种可能的解决方案是使用 QProxyStyle:

import sys

from PySide2 import QtCore, QtGui, QtWidgets


class TabBarStyle(QtWidgets.QProxyStyle):
    def drawControl(self, element, option, painter, widget=None):
        index = -1
        if element == QtWidgets.QStyle.CE_TabBarTab:
            if isinstance(widget, TabBar):
                for i in widget.fonts.keys():
                    if widget.tabRect(i) == option.rect:
                        index = i
                        break
            if index > -1:
                painter.save()
                painter.setFont(widget.fonts[index])
        super(TabBarStyle, self).drawControl(element, option, painter, widget)
        if index > -1:
            painter.restore()


class TabBar(QtWidgets.QTabBar):
    def __init__(self, parent=None):
        super(TabBar, self).__init__(parent)
        self._fonts = dict()

    @property
    def fonts(self):
        return self._fonts


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.tab_widget = QtWidgets.QTabWidget()
        self.setCentralWidget(self.tab_widget)

        self.tab_bar = TabBar()
        self.tabbar_style = TabBarStyle(self.tab_bar.style())
        self.tab_bar.setStyle(self.tabbar_style)
        self.tab_widget.setTabBar(self.tab_bar)

        self.tab_widget.addTab(QtWidgets.QWidget(), "Foo")
        self.tab_widget.addTab(QtWidgets.QWidget(), "Bar")
        self.tab_widget.addTab(QtWidgets.QWidget(), "Baz")

        font = self.tab_widget.font()
        font.setBold(True)
        self.tab_bar.fonts[1] = font
        self.tab_bar.update()


def main():
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("fusion")
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

【讨论】:

非常感谢,您在哪里指定在代码中设置粗体的选项卡?此代码是否设置了特定的标签加粗? 在您最初的问题中,您想更改所选元素的字体...我注意到您也改变了对它的关注,让我更正一下。 是的,不用担心 :) 不知何故在运行代码后我收到此错误:内部 C++ 对象 (Pyside2.QtWidgets.QStyle) 已删除,并崩溃。我复制了所有内容,但只有在 self.tab_bar = TabBar() 处停止时它才不会崩溃。如果我添加下一行,则会发生同样的错误。所以它出于某种原因源于那里。 另外,为什么在其他 GUI 框架中可以用一行代码完成的微不足道的事情,通常需要大量代码来做同样的事情?作为 Qt 专家,您认为这是设计缺陷还是短视?

以上是关于如何在 Pyside2 的 QTabWidget 中更改特定选项卡的字体?的主要内容,如果未能解决你的问题,请参考以下文章

仅为 QTabWidget 中的选项卡显示工具提示,而不是整个小部件

PySide2(PyQt5) 实现tab切换及方法详解(不定时更新)

如何从 QTabWidget 获取小部件?

如何在 QTabWidget 中添加 QToolBar

在 Qt 中,如何通过 qss 自定义如下 QTabWidget?

如何在 QTabWidget 上显示多光标?