Python PyQt,Don';编辑期间,请不要更改qtablewidgetitem字体

Python PyQt,Don';编辑期间,请不要更改qtablewidgetitem字体,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我尝试更改QTableWidgetItem字体,并完成该操作 但是,在编辑模式下,不要更改字体 (注:我不应该给出相同的样式,所以我不使用qss样式表) 在下面的代码中,如果输入F1键,则增大当前单元格的字体大小 from PyQt5.QtWidgets import * from PyQt5.QtCore import * import sys class MainWindow(QMainWindow): def __init__(self, **kwargs):

我尝试更改QTableWidgetItem字体,并完成该操作

但是,在编辑模式下,不要更改字体

(注:我不应该给出相同的样式,所以我不使用qss样式表)

在下面的代码中,如果输入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_()


在项目上设置字体只会更改该项目的字体,而不会更改其编辑器的字体

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

由于在QTableWidgetItem上设置字体等于设置索引的
Qt.FontRole
,因此您可以通过函数轻松访问它,调用基本实现以获取将要返回的编辑器,并在设置字体时将字体应用于该编辑器

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)
        self.main_layout.addWidget(self.table)
        [[self.table.setItem(row, col, QTableWidgetItem("text")) for row in range(5)] for col in range(5)]
        self.table.setItemDelegate(FontDelegate(self.table))
    # ...
class FontDelegate(QStyledItemDelegate):
def createEditor(自、父、选项、索引):
editor=super().createEditor(父级、选项、索引)
font=index.data(Qt.FontRole)
如果字体不是无:
编辑器.setFont(字体)
返回编辑器
类主窗口(QMainWindow):
# ...
def初始表格(自身):
self.table=QTableWidget(5,5)
self.main_layout.addWidget(self.table)
[[self.table.setItem(行、列、QTableWidgetItem(“文本”)用于范围(5)中的行)]用于范围(5)中的列]
self.table.setItemDelegate(FontDelegate(self.table))
# ...

不相关的注意事项:表应该添加到布局中(正如我在上面代码中所做的),而不仅仅是作为主窗口的子窗口创建。

谢谢,它可以工作。但不是实时的。。。如何解决这个问题?你说的“但不是实时”是什么意思?它的意思是。。。不是马上。(sry,我不会英语)请想办法解释一下。为了查看结果,我更改了当前单元格。我想,出于这个原因,我使用了“table.setEditTriggers(QTableWidget.CurrentChanged)”