2023-02-10 21:51:03 +08:00

113 lines
4.6 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 qgis.core import QgsRectangle
from rscder.utils.project import PairLayer, Project, ResultPointLayer
class ResultTable(QtWidgets.QWidget):
on_item_click = pyqtSignal(QgsRectangle)
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(3)
self.tablewidget.setRowCount(0)
self.tablewidget.setHorizontalHeaderLabels(['变化位置(x,y)', '疑似变化概率', '目视判读'])
self.tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.tablewidget.cellClicked.connect(self.onClicked)
# self.tablewidget.cellClicked.connect(self.onClicked)
self.tablewidget.cellChanged.connect(self.onChanged)
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()
self.tablewidget.setColumnCount(3)
self.tablewidget.setRowCount(0)
self.tablewidget.setHorizontalHeaderLabels(['变化位置(x,y)', '疑似变化概率', '目视判读'])
def onChanged(self, row, col):
if self.is_in_set_data or self.no_change:
return
if col == 2:
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)
self.tablewidget.item(row, col).setText('YES')
else:
self.tablewidget.item(row, col).setBackground(Qt.green)
self.tablewidget.item(row, col).setText('NO')
# logging
# logging.info()
self.result.update({'row':item_idx, 'value':item_status})
self.no_change = False
def onClicked(self, row, col):
if col != 0:
return
data = self.result.data[row]
x = data[0]
y = data[1]
xres = self.result.layer_parent.geo[1]
yres = self.result.layer_parent.geo[5]
cell_size = self.result.layer_parent.cell_size
x_min = x - xres * cell_size[0]
x_max = x + xres * cell_size[0]
y_min = y - yres * cell_size[1]
y_max = y + yres * cell_size[1]
extent = QgsRectangle(x_min, y_min, x_max, y_max)
self.on_item_click.emit(extent)
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.show_result(result)
def show_result(self, data:ResultPointLayer):
self.is_in_set_data = True
self.result = data
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('%.3f,%.3f'%(d[0], d[1]))) # X
self.tablewidget.setItem(i, 1, QTableWidgetItem('%.2f'%d[2])) # Y
status_item = QTableWidgetItem('')
if d[3] == 0:
status_item.setBackground(Qt.green)
status_item.setCheckState(Qt.Unchecked)
status_item.setText('NO')
elif d[3] == 1:
status_item.setBackground(Qt.yellow)
status_item.setCheckState(Qt.Checked)
status_item.setText('YES')
self.tablewidget.setItem(i, 2, 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