PyQt,在编辑期间不要更改 qtablewidgetitem 字体

PyQt, Don't change qtablewidgetitem font during editing

我尝试更改 QTableWidgetItem 字体,并完成了。

但是,在编辑模式下,不改变字体。

(PS。我不应该给same style,所以我不用qss style sheet)

下面的代码,如果输入F1键,放大当前单元格的字体大小。

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

class MainWindow(QMainWindow):
    
    def __init__(self, **kwargs):
        super().__init__()
        self.init_main()
        self.init_table()        
        self.resize(500,500)
        self.show()
        
    def init_main(self):
        self.main_widget = QWidget()
        self.main_layout = QHBoxLayout()
        self.main_widget.setLayout(self.main_layout)
        self.setCentralWidget(self.main_widget)
        
    def init_table(self):
        self.table = QTableWidget(5, 5, self)
        self.table.resize(500, 500)
        # init QTableWidgetItem in QTableWidget (5 x 5),
        [[self.table.setItem(row, col,QTableWidgetItem("text")) for row in range(5)] for col in range(5)]
        
    def keyPressEvent(self, e):
        # If input F1, resize font-size in current item.
        if e.key() == Qt.Key_F1:
            cur = self.table.currentItem()
            font = cur.font()
            font.setPointSize(30)
            cur.setFont(font)

if __name__ == "__main__":
    app = QCoreApplication.instance()
    if app is None:
        app = QApplication(sys.argv)
    window = MainWindow()
    app.exec_()

设置一个项目的字体只会改变那个项目的字体,而不是它的编辑器

您需要做的是创建一个项目委托(这是一个对象,负责显示 项目并提供与底层模型的交互,包括适当的编辑器) .

由于在 QTableWidgetItem 上设置字体等于设置索引的 Qt.FontRole,您可以轻松地从 createEditor() 函数访问它,调用基本实现以获取正在运行的编辑器返回,如果设置了字体,则应用该字体。

class FontDelegate(QStyledItemDelegate):
    def createEditor(self, parent, opt, index):
        editor = super().createEditor(parent, opt, index)
        font = index.data(Qt.FontRole)
        if font is not None:
            editor.setFont(font)
        return editor

class MainWindow(QMainWindow):
    # ...
    def init_table(self):
        self.table = QTableWidget(5, 5)
        <b>self.main_layout.addWidget(self.table)</b>
        [[self.table.setItem(row, col, QTableWidgetItem("text")) for row in range(5)] for col in range(5)]
        <b>self.table.setItemDelegate(FontDelegate(self.table))</b>
    # ...

不相关的注意事项:table 应该添加到布局中(就像我在上面的代码中所做的那样),而不仅仅是作为主要 window 的子项创建.