#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, считаете ли вы, что это недостаток дизайна или просто недальновидность?