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 的子项创建.
我尝试更改 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 的子项创建.