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

Python 2.7 如何更改Pyside2中QTabWidget中特定选项卡的字体?,python-2.7,qt,pyside2,qtabwidget,Python 2.7,Qt,Pyside2,Qtabwidget,触发事件后,我希望将特定选项卡的字体更改为粗体,而不是非粗体 qtabwidget.tabs[4].setFontWeight(Bold) 如何做到这一点?一种可能的解决方案是使用QProxyStyle: import sys from PySide2 import QtCore, QtGui, QtWidgets class TabBarStyle(QtWidgets.QProxyStyle): def drawControl(self, element, option, pa

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

qtabwidget.tabs[4].setFontWeight(Bold)

如何做到这一点?

一种可能的解决方案是使用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()

一种可能的解决方案是使用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()

没有单独的“制表符”,QTabar绘制所有的“制表符”您显然有XY问题,因为您询问如何实现可能的解决方案(没有人保证它能工作):如何获取QTabWidget的当前制表符,而不是询问潜在问题:如何从当前制表符中将字体设置为粗体谢谢,那么,如何更改特定选项卡的样式表呢?我应该更新这些问题吗?1)你必须重写你的问题,2)要更改字体,不仅可以使用Qt样式表,所以不要只问问题:如何更改当前选项卡的字体?运行时会得到什么:
print(QApplication.style(),metaObject().className())
?没有单独的“选项卡”,QTabBar绘制所有“选项卡”您显然有XY问题,因为您询问如何实现可能的解决方案(没有人保证它有效):如何获取QTabWidget的当前选项卡,而不是询问潜在问题:如何从当前选项卡将字体设置为粗体谢谢,那么,如何更改特定选项卡的样式表呢?我应该更新这些问题吗?1)你必须重写你的问题,2)要更改字体,不仅可以使用Qt样式表,所以不要问问题,而不仅仅是问题:如何更改当前选项卡的字体?运行时得到什么:
print(QApplication.style(),metaObject().className())
?非常感谢,在哪里指定要在代码中设置粗体的选项卡?此代码是否将特定的制表符设置为粗体?在初始问题中,您希望更改所选元素的字体。。。我注意到,你也改变了你的注意力,让我纠正它。是的,不用担心:不知怎么地,在运行代码之后,我得到了这个错误:内部C++对象(PySt2.2.qtWistGo.QStar)已经删除,并崩溃了。我复制了所有内容,但只有在self.tab\u bar=TabBar()处停止时才不会崩溃。如果我添加下一行,同样的错误也会发生。这是出于某种原因而产生的。还有,为什么在其他GUI框架中,可以用一行代码完成的一些琐碎的事情,通常需要很多代码来完成同样的事情?作为Qt方面的专家,您认为这是设计缺陷还是仅仅是短视?非常感谢,您在哪里指定要在代码中设置粗体的选项卡?此代码是否将特定的制表符设置为粗体?在初始问题中,您希望更改所选元素的字体。。。我注意到,你也改变了你的注意力,让我纠正它。是的,不用担心:不知怎么地,在运行代码之后,我得到了这个错误:内部C++对象(PySt2.2.qtWistGo.QStar)已经删除,并崩溃了。我复制了所有内容,但只有在self.tab\u bar=TabBar()处停止时才不会崩溃。如果我添加下一行,同样的错误也会发生。这是出于某种原因而产生的。还有,为什么在其他GUI框架中,可以用一行代码完成的一些琐碎的事情,通常需要很多代码来完成同样的事情?作为Qt的专家,你认为这是一个设计缺陷还是仅仅是短视?