Source code for qtdraw.widget.table_view
"""
TableView widget.
This module provides table view widget.
"""
from PySide6.QtWidgets import QTableWidget, QWidget, QSizePolicy, QHeaderView
from PySide6.QtCore import Qt, QTimer
from qtdraw.widget.custom_widget import MathWidget, Layout
from qtdraw.widget.mathjax import MathJaxSVG
# ==================================================
[docs]
class TableView(QTableWidget):
# ==================================================
def __init__(self, parent=None, data=None, header=None, vertical=False, color="black", size=12, mathjax=None):
"""
Table view (math).
Args:
parent (QWidget, optional): parent.
data (list, optional): table data in LaTeX code without "$".
header (list, optional): header string.
vertical (bool, optional): show vertical number header ?
color (str, optional): color name.
size (int, optional): font size.
"""
super().__init__(parent)
if mathjax is None:
self._mathjax = MathJaxSVG()
else:
self._mathjax = mathjax
if data is None:
data = [[""]]
if not data or not data[0]:
self.setRowCount(0)
self.setColumnCount(0)
return
row = len(data)
column = len(data[0])
if header is not None and len(header) != column:
raise ValueError("Header length must match number of columns.")
self.setRowCount(row)
self.setColumnCount(column)
if header is not None:
self.setHorizontalHeaderLabels(header)
self.horizontalHeader().setStyleSheet("font-weight: bold;")
else:
self.horizontalHeader().setVisible(False)
self.verticalHeader().setVisible(vertical)
for i, r in enumerate(data):
for j, item in enumerate(r):
item = str(item)
if item:
math = MathWidget(self.viewport(), text=item, color=color, size=size, mathjax=self._mathjax)
wrapper = QWidget(self)
layout = Layout(wrapper)
layout.setContentsMargins(10, 10, 10, 10)
layout.addWidget(math)
layout.setAlignment(math, Qt.AlignCenter)
math.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
wrapper.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
self.setCellWidget(i, j, wrapper)
self.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
QTimer.singleShot(0, self.resizeColumnsToContents)
QTimer.singleShot(0, self.resizeRowsToContents)
self.horizontalHeader().setMinimumSectionSize(30)
self.setStyleSheet(
"""
QTableWidget::item:selected {
background-color: LemonChiffon;
}
"""
)