Jul-22-2020, 10:20 AM
Hi,
I need to check the content of a combobox header in a QTableWidget.
I found some snippets of code which I used to set up the table with the different comboboxes in the header of a QTableWidget but now I want to know what the selection (e.g. text/index) of the combobox is when I change it. How can I achieve this?
The code so far is presented below:
I need to check the content of a combobox header in a QTableWidget.
I found some snippets of code which I used to set up the table with the different comboboxes in the header of a QTableWidget but now I want to know what the selection (e.g. text/index) of the combobox is when I change it. How can I achieve this?
The code so far is presented below:
from PySide2 import QtCore, QtWidgets
import numpy as np
class HorizontalHeader(QtWidgets.QHeaderView):
def __init__(self, values, parent=None):
super(HorizontalHeader, self).__init__(QtCore.Qt.Horizontal, parent)
self.setSectionsMovable(True)
self.comboboxes = []
self.sectionResized.connect(self.handleSectionResized)
self.sectionMoved.connect(self.handleSectionMoved)
def showEvent(self, event):
for i in range(2, self.count()):
if i < len(self.comboboxes):
combo = self.comboboxes[i]
combo.clear()
combo.addItems(["A", "B", 'L', 'T', 'V'])
else:
combo = QtWidgets.QComboBox(self)
combo.addItems(["A", "B", 'L', 'T', 'V'])
self.comboboxes.append(combo)
combo.setGeometry(self.sectionViewportPosition(i), 0, self.sectionSize(i)-4, self.height())
combo.show()
if len(self.comboboxes) > self.count():
for i in range(self.count(), len(self.comboboxes)):
self.comboboxes[i].deleteLater()
super(HorizontalHeader, self).showEvent(event)
def handleSectionResized(self, i):
for i in range(self.count()):
j = self.visualIndex(i)
logical = self.logicalIndex(j)
self.comboboxes[i].setGeometry(self.sectionViewportPosition(logical), 0, self.sectionSize(logical)-4, self.height())
def handleSectionMoved(self, i, oldVisualIndex, newVisualIndex):
for i in range(min(oldVisualIndex, newVisualIndex), self.count()):
logical = self.logicalIndex(i)
self.comboboxes[i].setGeometry(self.ectionViewportPosition(logical), 0, self.sectionSize(logical) - 5, height())
def fixComboPositions(self):
for i in range(self.count()):
self.comboboxes[i].setGeometry(self.sectionViewportPosition(i), 0, self.sectionSize(i) - 5, self.height())
class TableWidget(QtWidgets.QTableWidget):
def __init__(self, columns, *args, **kwargs):
super(TableWidget, self).__init__(*args, **kwargs)
header = HorizontalHeader(self)
self.setRowCount(100)
self.setHorizontalHeader(header)
# self.setRowCount(rows)
self.setColumnCount(columns)
self.setHorizontalHeaderLabels(['Loadcase', 'Step'])
self.columns = columns
self.createTable()
def createTable(self):
start = 0
for loadcase in range(10):
steps = np.random.randint(1, 5)
end = start + steps
print(loadcase, steps, start, end)
for row in range(start, end):
item = QtWidgets.QTableWidgetItem(str(loadcase + 1))
item.setFlags(QtCore.Qt.ItemIsUserCheckable |
QtCore.Qt.ItemIsEnabled)
item.setCheckState(QtCore.Qt.Unchecked)
self.setItem(row, 0, item)
step = 0
for row in range(start, end):
step += 1
item = QtWidgets.QTableWidgetItem(str(step))
self.setItem(row, 1, item)
start = end
self.data = np.random.rand(end, self.columns-2)
for i, row_values in enumerate(self.data):
for j, value in enumerate(row_values):
self.setItem(i, j+2, QtWidgets.QTableWidgetItem(str(round(value,4))))
self.itemClicked.connect(self.handleItemClicked)
self._list = []
def handleItemClicked(self, item):
if item.checkState() == QtCore.Qt.Checked:
if item.row() not in self._list:
self._list.append(item.row())
print(self._list)
else:
if item.row() in self._list:
self._list.remove(item.row())
print(self._list)
def headerItemClicked(self, logicalIndex):
column = self.currentItem().column()
selectedName = self.horizontalHeaderItem(column)
print(selectedName.text())
def scrollContentsBy(self, dx, dy):
super(TableWidget, self).scrollContentsBy(dx, dy)
if dx != 0:
self.horizontalHeader().fixComboPositions()
class App(QtWidgets.QWidget):
def __init__(self):
super(App,self).__init__()
self.createTable()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.table)
self.showMaximized()
def createTable(self):
self.table = TableWidget(16)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
