Python Pyside6 QtableView Удаление записи модели данныхPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python Pyside6 QtableView Удаление записи модели данных

Сообщение Anonymous »

У меня вопрос по поводу удаления записей из базы данных. Данные отображаются в QTableView и сортируются по дате. Проблема в том, что если я использую текущий индекс QTableView как «строку», неправильные записи будут удалены, поскольку в базе данных они отсортированы по-разному. Например, я нажимаю на первую строку и получаю индекс 0, но в базе данных под индексом 0 сохраняется другая запись. Как мне заставить его щелкнуть запись в QTableView и удалить ее?
Я использую Pyside6 и Sqlite. Для манипуляций с базой данных, таких как загрузка, удаление, сортировка, вставка и т. д., я использую QtSql и QSqlRelationalTableModel. Я не использую SQL-запросы SQL или QtSql, я полагаюсь на модель данных.
Спасибо!
WINDOW

Код: Выделить всё

# IMPORT PACKAGES AND MODULES
# ///////////////////////////////////////////////////////////////

import sys
import os
import datetime

# IMPORT DATABASE MODULES
# ///////////////////////////////////////////////////////////////
from test_database import DataBaseConnector as dbc
from PySide6 import QtSql
from ui_main import Ui_MainWindow

# IMPORT DELEGATE FOR CONVERTING DISPLAYED DATE
# ///////////////////////////////////////////////////////////////
from delegate import DateFormatDelegate, AlignDelegate

# IMPORT QT CORE
# ///////////////////////////////////////////////////////////////
from qt_core import *

class MainWindow(QMainWindow):

def __init__(self):
super().__init__()

# SETUP MAIN WINDOw
# Load widgets from "gui\uis\main_window\ui_main.py"
# ///////////////////////////////////////////////////////////////
self.ui = Ui_MainWindow()
self.ui.setupUi(self)

self.incomeViewSearch()
self.ui.pb_inc_del.clicked.connect(self.deleteIncome)

# MESSAGES
# ///////////////////////////////////////////////////////////////
def okayMessage(self, text):
QMessageBox.information(self, "Datensatz",
f"{text}")

def failMessage(self, text):
QMessageBox.critical(self, "Datensatzfehler", f"{text}")

# DATA LOAD FILTERED INCOME
# ///////////////////////////////////////////////////////////////
def incomeViewSearch(self):
# data model for income table
mod_income_search = None
# VARIABLES FOR THE FILTER SO NOT GET SOOOOO LONG :)

# CHECK IF THE FILTER TOGGLE IS CHECKED

start_date = "1752-09-14"  # VERY FIRST DATE
end_date = "9999-12-31"  # VERY LAST DATE
# RUN THE FILTER WITHOUT DATE SET FROM VERY PAST TO INFINITY
mod_income_search = dbc().incomeViewSearch(filter_begin=start_date, filter_end=end_date,)

mod_income_search.select()
self.ui.tbl_income.setModel(mod_income_search)
self.ui.tbl_income.setItemDelegateForColumn(1, DateFormatDelegate('dd.MM.yyyy'))
# self.ui.load_pages.tbl_income.setItemDelegateForColumn(2, AlignDelegate())
self.ui.tbl_income.setColumnHidden(0, True)
for i in range(mod_income_search.columnCount()):
# https://stackoverflow.com/questions/69912374/how-to-set-a-pyside6-qtablewidget-column-width-to-15pt
self.ui.tbl_income.horizontalHeader().setMinimumSectionSize(175)
self.ui.tbl_income.horizontalHeader().setSectionResizeMode(i, QHeaderView.ResizeToContents)
self.ui.tbl_income.horizontalHeader().setStretchLastSection(True)

# DELETE INCOME
# ///////////////////////////////////////////////////////////////
def deleteIncome(self):
rows = sorted(set(index.row() for index in
self.ui.tbl_income.selectedIndexes()))

print(rows)
for row in rows:
print(f'Row {row} is selected')
dbc().deleteIncome(row)

# SETTINGS WHEN TO START
# Set the initial class and also additional parameters of the "QApplication"  class
# ///////////////////////////////////////////////////////////////
if __name__ == "__main__":
# APPLICATION
# ///////////////////////////////////////////////////////////////
app = QApplication(sys.argv)
window = MainWindow()
window.show()
# EXEC APP
# ///////////////////////////////////////////////////////////////
sys.exit(app.exec())
БАЗА ДАННЫХ

Код: Выделить всё

import os
import sys
import datetime

############### import ##################
from PySide6 import QtSql, QtCore
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QMessageBox

class DataBaseConnector:

# INIT
# //////////////////////////////////////////////////////////////
def __init__(self):
self.database = None
self.model = None
self.dbdriver = "QSQLITE"
self.dbname = "test_expense.db"
self.connect_db()

"""
connects to the database need two arguments database driver and database name
"""

# CONNECT DATABASE
# //////////////////////////////////////////////////////////////
def connect_db(self):
"""

:return: DB Connection
"""
if not os.path.isfile(self.dbname):
QMessageBox.critical(None, "Fehler", "Keine Datenbankverbindung!\n"
f"Bitte prüfen, ob die Datenbank {self.dbname} vorhanden ist.")
sys.exit()
else:
self.database = QtSql.QSqlDatabase.addDatabase(self.dbdriver)
self.database.setDatabaseName(self.dbname)
self.model = QtSql.QSqlRelationalTableModel()
# print(self.dbname)
return True

# CREATE INCOME MODEL
# //////////////////////////////////////////////////////////////
def incomeViewSearch(self, filter_begin="", filter_end=""):
"""

@param filter_begin:
@param filter_end:
@param filter_amount:
@param filter_category:
@param filter_note_txt:
@return:
"""
# data model for income table
self.model.setTable("income")
# if filter_begin:
#     """
#     This is an other way but it does not work
#     """

"""
# This is working but no relations and delegates
self.mod_income_search.setQuery("SELECT * FROM income where inc_date >= '" + map + "' and inc_date 

Подробнее здесь: [url]https://stackoverflow.com/questions/79218968/python-pyside6-qtableview-data-model-delete-record[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Python Pyside6 QtableView Удаление записи модели данных
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Python Pyside6 QtableView Удаление записи модели данных
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Python Pyside6 QtableView Удаление записи модели данных
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Python Pyside6 QtableView Модель данных отображает данные в формате локали
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Python Pyside6 QtableView Модель данных отображает данные в формате локали
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»