98 lines
3.9 KiB
Python
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 |