Как изменить шрифт определенной вкладки в QTabWidget в Pyside2?

#python-2.7 #qt #pyside2 #qtabwidget

#python-2.7 #qt #pyside2 #qtabwidget

Вопрос:

После запуска события я хочу изменить шрифт определенной вкладки, чтобы использовать жирный шрифт, а не не жирный.

 qtabwidget.tabs[4].setFontWeight(Bold)
  

Как это сделать?

Комментарии:

1. Отдельных «вкладок» нет, QTabBar отображает все «вкладки»

2. У вас явно проблема с XY, поскольку вы спрашиваете, как реализовать возможное решение (никто не гарантирует, что оно работает): как получить текущую вкладку QTabWidget вместо того, чтобы спрашивать о основной проблеме: как установить шрифт на жирный шрифт на текущей вкладке

3. Спасибо, так как же изменить таблицу стилей для конкретной вкладки? Должен ли я обновить вопросы?

4. 1) Вы должны переписать свой вопрос, 2) Для изменения шрифта можно использовать не только таблицу стилей Qt, поэтому вместо того, чтобы спрашивать об этом, не только вопросы: как изменить шрифт текущей вкладки?

5. что вы получаете при запуске: 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()
  

Комментарии:

1. Большое спасибо, где вы указываете, какую вкладку выделить жирным шрифтом в коде? Этот код выделяет определенную вкладку жирным шрифтом?

2. В вашем первоначальном вопросе вы хотели изменить шрифт выбранного элемента… Я заметил, что вы тоже изменили свое внимание на это, позвольте мне это исправить.

3. Да не беспокойтесь 🙂

4. Каким-то образом после запуска кода я получаю эту ошибку: внутренний объект C (Pyside2. QtWidgets. QStyle) уже удален и сбой. Я скопировал все, но только это не приведет к сбою, если я остановлюсь на self.tab_bar = TabBar() . Если я добавлю следующую строку, произойдет та же ошибка. Так что по какой-то причине это происходит оттуда.

5. Кроме того, почему что-то тривиальное в других графических интерфейсах, которое можно выполнить с помощью одной строки кода, часто требует много кода для выполнения того же самого? Как эксперт в Qt, считаете ли вы, что это недостаток дизайна или просто недальновидность?