rscder-pub/rscder/gui/result.py
2022-05-12 20:39:32 +08:00

98 lines
3.9 KiB
Python

import logging
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, QMessageBox, 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
self.no_change = False
def clear(self):
self.tablewidget.clear()
def onChanged(self, row, col):
if self.is_in_set_data or self.no_change:
return
if col == 3:
self.no_change = True
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)
# logging
logging.info(item_idx, item_status)
self.result.update({'row':item_idx, 'value':item_status})
self.no_change = False
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 save(self):
if self.result is None:
return
self.result.save()
def on_result(self, layer_id, result_id):
self.is_in_set_data = True
result = Project().layers[layer_id].results[result_id]
if result != self.result:
self.save()
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