from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt,QModelIndex, pyqtSignal from PyQt5.QtGui import QStandardItemModel, QStandardItem from PyQt5.QtWidgets import (QTableWidgetItem, QTableWidget, QAbstractItemView, QHeaderView, QStyleFactory) from rscder.utils.project import PairLayer, Project, ResultLayer class ResultTable(QtWidgets.QWidget): on_item_click = pyqtSignal(dict) on_item_changed = pyqtSignal(dict) def __init__(self, parent=None): super(ResultTable, self).__init__(parent) # self.tableview = QTableView(self) self.tablewidget = QTableWidget(self) self.tablewidget.setColumnCount(4) self.tablewidget.setRowCount(0) self.tablewidget.setHorizontalHeaderLabels(['X', 'Y', '概率', '变化']) self.tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tablewidget.cellDoubleClicked.connect(self.onDoubleClicked) self.tablewidget.cellClicked.connect(self.onClicked) self.tablewidget.cellChanged.connect(self.onChanged) # self.tablewidget.setModel(self.tableview) # self.tableview layout = QtWidgets.QVBoxLayout(self) layout.addWidget(self.tablewidget) self.setLayout(layout) self.result = None self.is_in_set_data = False def clear(self): self.tablewidget.clear() def onChanged(self, row, col): if self.is_in_set_data: return if col == 3: item_idx = row item_status = self.tablewidget.item(row, col).checkState() == Qt.Checked if item_status: self.tablewidget.item(row, col).setBackground(Qt.yellow) else: self.tablewidget.item(row, col).setBackground(Qt.green) # print(item_idx, item_status) self.result.update({'row':item_idx, 'value':item_status}) def onClicked(self, row, col): if col == 3: self.tablewidget.item(row, col).setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) def onDoubleClicked(self, row, col): x = self.tablewidget.item(row, 0).text() y = self.tablewidget.item(row, 1).text() self.on_item_click.emit({'x':float(x), 'y':float(y)}) def on_result(self, layer_id, result_id): self.is_in_set_data = True result = Project().layers[layer_id].results[result_id] self.result = result self.clear() self.set_data(result) def set_data(self, data:ResultLayer): self.is_in_set_data = True if data.layer_type != ResultLayer.POINT: return self.tablewidget.setRowCount(len(data.data)) # print(len(data.data)) self.tablewidget.setVerticalHeaderLabels([ str(i+1) for i in range(len(data.data))]) for i, d in enumerate(data.data): self.tablewidget.setItem(i, 0, QTableWidgetItem(str(d[0]))) # X self.tablewidget.setItem(i, 1, QTableWidgetItem(str(d[1]))) # Y self.tablewidget.setItem(i, 2, QTableWidgetItem(str(d[2]))) # 概率 status_item = QTableWidgetItem('变化') if d[3] == 0: status_item.setBackground(Qt.green) status_item.setCheckState(Qt.Unchecked) elif d[3] == 1: status_item.setBackground(Qt.yellow) status_item.setCheckState(Qt.Checked) self.tablewidget.setItem(i, 3, status_item) # 变化 self.tablewidget.resizeColumnsToContents() self.tablewidget.resizeRowsToContents() self.tablewidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.tablewidget.verticalHeader().setSectionResizeMode(QHeaderView.Stretch) self.is_in_set_data = False