Всем привет!
Изучаю pyqt, перевожу на него свой pet-проект. Нужно создать таблицу и выделять ту ячейку, внутри которой находится указатель мыши.
QTableWidget не подходит, поскольку не поддерживает разное форматирование в одной и той же ячейке. Реализовал через QTextDocument.
Проблема в том, что, когда таблица достигает нескольких сот ячеек, выделение занимает несколько секунд. Как такое реализовать на pyqt5/pyqt6?
Это основная проблема, но есть и другие, которые не смог пока решить:
1) Есть вариант не закрашивать ячейку целиком, а просто менять цвет ее границ. Делается ли такое только для одной ячейки?
2) Как ограничить максимальную высоту ячейки? Есть метод setColumnWidthConstraints, а вот метода setColumnHeightConstraints нет.
Вот примерный код:
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import sys
import PyQt5
import PyQt5.QtWidgets
class App(PyQt5.QtWidgets.QWidget):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.set_gui()
def set_gui(self):
self.table = Table()
self.layout = PyQt5.QtWidgets.QVBoxLayout()
self.layout.addWidget(self.table)
self.setLayout(self.layout)
def show(self):
self.showMaximized()
class Table(PyQt5.QtWidgets.QTextEdit):
def __init__(self):
super().__init__()
self.rowno = 0
self.colno = 0
self.set_gui()
def set_gui(self):
self.doc = PyQt5.QtGui.QTextDocument()
self.cursor = PyQt5.QtGui.QTextCursor(self.textCursor())
self.fmt = PyQt5.QtGui.QTextTableFormat()
self.table = self.cursor.insertTable(10,10,self.fmt)
self.fill()
def fill(self):
for rowno in range(10):
for colno in range(10):
cell = self.table.cellAt(rowno,colno)
self.cursor = cell.lastCursorPosition()
self.setTextCursor(self.cursor)
code = '<b>Row</b>: {}. <b>Column</b>: {}'.format(rowno,colno)
self.cursor.insertHtml(code)
def eventFilter(self,source,event):
if event.type() == PyQt5.QtCore.QEvent.MouseMove:
pos = event.pos()
cursor = self.cursorForPosition(pos)
cell = self.table.cellAt(cursor)
if not cell.isValid() or cell.column() == self.colno and cell.row() == self.rowno:
return super().eventFilter(source,event)
self.rowno = cell.row()
self.colno = cell.column()
self.set_cell_bg(cell,'cyan')
cell = self.table.cellAt(self.cursor)
self.set_cell_bg(cell,'white')
self.cursor = cursor
return super().eventFilter(source,event)
def set_cell_bg(self,cell,color):
cell_fmt = cell.format()
cell_fmt.setBackground(PyQt5.QtGui.QColor(color))
cell.setFormat(cell_fmt)
if __name__ == '__main__':
exe = PyQt5.QtWidgets.QApplication(sys.argv)
app = App()
exe.installEventFilter(app.table)
app.show()
sys.exit(exe.exec_())