コード例 #1
0
ファイル: main.py プロジェクト: x2wing/BashNIPIneft
class Main(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        # Варианты выбора для ячеек с Combobox
        choices = ['0', '1', '2', '3', '4', '5']
        # номер столбца с QComboBox
        cbox_column = 1

        # Получение данные через класс Backend
        self.backend = Backend(raw_data, 8, 4)
        # Вычисление столбца суммы и накопления
        self.backend.recalculate()
        # Получение ссылки на numpy array
        self.backend_data = self.backend.get_data()

        # Создание модели
        self.model = Model(self.backend_data)
        # изменение данных в модели вызывет перерасчет через метод recalc
        self.model.c.data_changed.connect(self.recalc)

        # создание виджетов таблицы
        self.table_data = QtWidgets.QTableView()
        # подключиние модели к таблице
        self.table_data.setModel(self.model)
        # Установка делегата на второй столбец таблицы
        self.table_data.setItemDelegateForColumn(cbox_column,
                                                 Delegate(self, choices))
        # получаем модель выделения
        self.selectionModel = self.table_data.selectionModel()
        # событие происходящее выделением столбца целчком по шапке таблицы
        self.table_data.horizontalHeader().sectionClicked.connect(
            self.draw_graph)

        # сделать Combobox редактируемым одним щелчком во 2(1) столбце
        for row in range(self.backend_data.shape[0]):
            self.table_data.openPersistentEditor(
                self.model.index(row, cbox_column))

        # создаем виджет графика
        self.matplotlib_widget = MatplotlibWidget(self)

        # Создать кнопки и повесить на них события
        btnLoad = QtWidgets.QPushButton('Load')
        btnSave = QtWidgets.QPushButton('Save')
        btnSave.clicked.connect(lambda: Save()(self.backend_data))
        btnLoad.clicked.connect(self.load_data)

        # btnSave.clicked.connect(app.exit)
        # создаем лайаут для вертикального размещения виджетов
        self.layoutVertical = QtWidgets.QVBoxLayout(self)
        # добавляем виджеты в лайаут
        self.layoutVertical.addWidget(self.table_data)
        self.layoutVertical.addWidget(btnLoad)
        self.layoutVertical.addWidget(btnSave)

        self.layoutVertical.addWidget(self.matplotlib_widget)
        # x = [1, 2, 3, 4, 5]
        # y = [10, 20, 30, 40, 50]
        # self.matplotlib_widget.draw_plot(x, y)

        self.setWindowTitle('Тестовое задание')
        self.setGeometry(50, 50, 800, 800)
        self.show()

    def draw_graph(self):
        """Фильтрует выделение и вызывает отрисовку """

        # Получение индексов выделенных столбцов
        indexes = self.selectionModel.selectedIndexes()
        # Получаем множество из уникальных номеров столбцов
        indexes_selected_column = set((int(data.column()) for data in indexes))
        # Если выделено ровно 2 столбца то вытаскиваем их
        #  данные из numpy array и передаем в отрисовщик
        if len(indexes_selected_column) == 2:
            c1, c2 = sorted(indexes_selected_column)
            x = self.backend_data[..., c1]
            y = self.backend_data[..., c2]
            self.matplotlib_widget.draw_plot(x, y)

    def recalc(self):
        """ перерасчет столбца сумм и накопленя в исходном numpy array"""

        self.backend.recalculate()

    def load_data(self):
        Load()(self.backend_data)
        # self.model.dataChanged()
        self.model.endResetModel()