PyQt, не изменять шрифт qtablewidgetitem во время редактирования

#python #pyqt #pyqt5

#python #pyqt #pyqt5

Вопрос:

Я попытался изменить шрифт QTableWidgetItem и завершить это.

Но в режиме редактирования не меняйте шрифт.

(PS. Я не должен указывать тот же стиль, поэтому я не использую таблицу стилей 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_()
 

введите описание изображения здесь

введите описание изображения здесь

Ответ №1:

Установка шрифта для элемента просто изменяет шрифт для этого элемента, а не для его редактора.

Что вам нужно сделать, это создать делегат элемента (который является объектом, который отвечает за отображение элементов и обеспечивает взаимодействие с базовой моделью, включая соответствующий редактор).

Поскольку установка шрифта для 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)
        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))
    # ...
 

Несвязанное примечание: таблица должна быть добавлена в макет (как я сделал в приведенном выше коде), а не просто создана как дочерний элемент главного окна.

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

1. Спасибо, это работает. но не в реальном времени… как это решить ..?

2. Что вы подразумеваете под «но не в реальном времени»?

3. Это значит… не сразу. (сри, я не знаю английского)

4. Пожалуйста, найдите способ объяснить себя.

5. Чтобы увидеть результат, я меняю текущую ячейку. Я думаю, причина в том, что я использовал «таблицу. setEditTriggers(QTableWidget. currentChanged)»