如何在 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切换及方法详解(不定时更新)