PyQt TableView вставка вычисления из предыдущих 2 строк в последнем столбце - PullRequest
0 голосов
/ 27 января 2019

У меня есть простое представление Qtableview, в котором пользователь вставляет даты в базу данных sqlite. Я использую настраиваемый делегат в столбцах 3 и 4 для прямой вставки даты и времени. Я хотел бы динамически вставить в столбец 5, т. Е. Суммарную дельту времени. На рисунке ниже я вставил вручную 01:00 час, но я хотел бы, чтобы он был автоматическим. Виртуальный столбец в QTableView? , и я использовал его раньше, но это создает виртуальный столбец и не вставляет его в БД. Должен ли я поэтому использовать QSqlQuery и затем вставить его в итоговый столбец или лучше использовать само представление таблицы? enter image description here

Код пока:

from PyQt5.QtWidgets import QMainWindow, QApplication, QStyledItemDelegate, QDateTimeEdit, QHeaderView
from PyQt5.QtCore import pyqtSlot, QDateTime, Qt, QAbstractItemModel,QModelIndex, QDateTime
from datetime import datetime,timedelta

import sys


import essai_find
from essai_find_db import *


class MainWindow(QMainWindow, essai_find.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.DB = essaiFindDb()
        self.db_model = QSqlRelationalTableModel()
        self.db_model.setTable('Pilots_exp')
        self.db_model.setEditStrategy(QSqlRelationalTableModel.OnFieldChange)
        self.db_model.setRelation(2, QSqlRelation('Aircraft', 'immatriculation', 'immatriculation'))
        self.db_model.select()
        self.tableView.setModel(self.db_model)
        self.tableView.setColumnHidden(0, True)

        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.custom_delegate = customDelegate()
        self.tableView.setItemDelegateForColumn(3, self.custom_delegate)
        self.tableView.setItemDelegateForColumn(4, self.custom_delegate)

        self.label.setText(str(self.hours_minutes()))

def get_tot_hours(self):
    """select dates from database """
    query1 = QSqlQuery("SELECT date_time1,date_time2 FROM Pilots_exp")
    liste = []
    while query1.next():
        date1 = query1.value(0)
        date2 = query1.value(1)
        essai = datetime.strptime(date2, "%Y/%m/%d %H:%M") - datetime.strptime(date1, "%Y/%m/%d %H:%M")
        liste.append(essai)
    total = sum(liste, timedelta())
    return total

def hours_minutes(self):
    """conversion of time delta get_tot_hours to hours"""
    td = self.get_tot_hours()
    print(td)
    resultat = td.days * 24 + td.seconds // 3600
    print(resultat)
    return resultat

def get_hours_diff(self):
    query1 = QSqlQuery("SELECT date_time1,date_time2 FROM Pilots_exp")
    result = []
    while query1.next():
        date1 = query1.value(0)
        date2 = query1.value(1)
        diff = datetime.strptime(date2, "%Y/%m/%d %H:%M") - datetime.strptime(date1, "%Y/%m/%d %H:%M")
        result.append(str(diff))
    return result


@pyqtSlot()
def on_pushButton_clicked(self):
    self.add_record()

def add_record(self):
    row = self.db_model.rowCount()
    self.db_model.insertRow(row)


class customDelegate(QStyledItemDelegate):
    """DELEGATE INSERT CUSTOM DATEEDIT IN CELL """

def __init__(self, parent=None):
    super(customDelegate, self).__init__(parent)

def createEditor(self, parent, option, index):
    date_edit = QDateTimeEdit(parent)
    date_edit.setDisplayFormat("yyyy/MM/dd HH:mm")
    date_edit.setDateTime(QDateTime.currentDateTime())

    date_edit.setCalendarPopup(True)
    return date_edit

def setModelData(self, editor, model, index):
    value = editor.dateTime().toString("yyyy/MM/dd HH:mm")
    model.setData(index, value)

def setEditorData(self, editor, index):
    value = index.model().data(index, Qt.EditRole)
    qdate = QDateTime().fromString(value, "yyyy/MM/dd HH:mm")
    editor.setDateTime(qdate)


if __name__ == '__main__':
    try:
        app = QApplication(sys.argv)
        form = MainWindow()
        # app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
        form.show()
        app.exec_()
        sys.exit(0)
    except NameError:
        print("Name Error: ", sys.exc_info()[1])
    except SystemExit:
        print("Closing Window....")
    except Exception:
        print(sys.exc_info()[1])

БД очень проста:

from PyQt5.QtSql import *


class essaiFindDb():
def __init__(self):
    self.db = QSqlDatabase.addDatabase("QSQLITE")
    self.db.setDatabaseName("essai_find_database.db")

    self.db.open()

    query = QSqlQuery()
    query.exec_('''CREATE TABLE Pilots_exp(id INTEGER PRIMARY KEY UNIQUE , pilot_1 TEXT,aircraft TEXT,
     date_time1 TEXT, date_time2 TEXT, total TEXT)''')

    query.exec_(
        '''CREATE TABLE Aircraft(id INTEGER PRIMARY KEY, immatriculation TEXT)''')

    query.exec_()

    self.db.commit()
    self.db.close()


if __name__ == '__main__':
    essaiFindDb()
...