Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/92: Рейтинг темы: голосов - 92, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 10
PyQt5

Как удалить выделенную строку из QTableView?

26.05.2020, 20:50. Показов 19856. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть QSqlQueryModel которая вытягивает данные из базы данных и передает их в QTableView. Я знаю что модель QSqlQueryModel только для чтения. Подскажите как удалить выделенную строку из QTableView и обновить модель или на какую модель заменить мою?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  
  def connect_column_calc(self):
        self.temp_calculation = QSqlQueryModel()
        self.temp_calculation.setQuery('SELECT id, number_invoice, inv_date, company_name, '
                                       '(all_sum / 100.0) AS all_sum, signatory FROM calculation')
 
        self.calculation_model = QSortFilterProxyModel()
        self.calculation_model.setSourceModel(self.temp_calculation)
 
        self.inv_tabView.setModel(self.calculation_model)
 
  def del_pushbutton(self):
        if self.inv_tabView.selectionModel().hasSelection():
            for index in self.inv_tabView.selectedIndexes() or []:
                print('Удаляется строка %d...' % index.row())
                self.temp_calculation.setQuery('DELETE FROM calculation WHERE id = %d' % index.row())
                print(self.temp_calculation.lastError().text())
        else:
            QMessageBox.warning(None, 'Ошибка удаления', 'Строки для удаления отсутствуют! \n'
                                                         'Выделите строку и повторите удаление.')
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.05.2020, 20:50
Ответы с готовыми решениями:

Как удалить выделенную строку подтаблицы
добрый день, форумчане. прошу подсказать, уткнулся вроде в простую проблему, но что-то не могу сообразить как сделать Суть...

Как удалить выделенную строку в DBGrid?
Подскажите пожалуйста как удалить выделенную строку в dbgrid. В builder есть какието встроенные функции или нужно писать sql запрос...

Как удалить выделенную строку из DBGrid?
Нужно удалить нажатием на кнопку BitBtn выделенную строку. Попробовала так: DBGrid1.SelectedRows.Delete; не работает; затем...

21
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
27.05.2020, 10:32
Если строку надо удалить из базы, то в качестве модели удобнее использовать QSqlTableModel и метод removeRow.
Если строку достаточно скрыть- то setRowHidden.

Добавлено через 19 минут
В вашем случае моделька (чтобы передать все нужные сигналы обновления QTableView) при удалении должна вызывать чтото типа:
Python
1
2
beginRemoveRows(QModelIndex(), row, row)
endRemoveRows()
чего она делать не будет по умолчанию.
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 10
27.05.2020, 21:19  [ТС]
Подскажите как прикрутить эти сигналы к QSqlQueryModel? Может у вас есть какой-то пример?
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
27.05.2020, 22:14
КМК лучше прикрутить к tableview контекстное меню
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Table(QTableView):
    def __init__(self,parent=None):
        super().__init__()
 
    def contextMenuEvent(self,e):
        if not self.selectedIndexes():
            return
        pos = self.viewport().mapToGlobal(e.pos())
        mnu = QMenu()
        mnu.addAction('Удалить запись').setObjectName('del')
        ret  = mnu.exec_(pos)
        obj = ret.objectName()
        if obj == 'del' :
            row = self.currentIndex().row()
            #тут запрос на удаление
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 10
15.06.2020, 11:09  [ТС]
Написал свою модель, которая наследуется от QSqlQueryModel, но сама функция удаления либо не удаляет выбранную строку, либо удаляет, но всегда последнюю. Подскажите где в ней ошибка.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class NewSqlModel(QSqlQueryModel):
    def __init__(self, parent=None):
        super(NewSqlModel, self).__init__()
        
    def flags(self, index):
        """Предопределим флаги для дальнейшего их редактирования в
            модели"""
        f1 = QSqlQueryModel.flags(self, index)
        if index.column() == 0:
            f1 |= Qt.ItemIsEditable
        return f1
    
    def setData(self, index, value, role=Qt.EditRole):
        """Метод для обновления данных"""
        self.data = QSqlQueryModel.data(self, index, role)
        if index.isValid():
            self.data(index.row(), value)
            self.dataChanged.emit(index, index, role)
            return True
        return False
    
    # Функция с ошибкой
    def removeRows(self, position, index, parent=QModelIndex()):
        """Производим удаление выбранной строки"""
        self.beginRemoveRows(parent, position, position + index - 1)
        self.query = QSqlQuery('DELETE FROM calculation WHERE id = %d' % position)
        self.endRemoveRows()
        return True
0
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
15.06.2020, 13:04
покажите, как вы вызываете removeRows

Добавлено через 2 минуты
для чего в ней используется переменная "index", если sql запрос удаляет всегда 1 строку?
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 10
15.06.2020, 13:25  [ТС]
Цитата Сообщение от kapbepucm Посмотреть сообщение
покажите, как вы вызываете removeRows
Добавлено через 2 минуты
для чего в ней используется переменная "index", если sql запрос удаляет всегда 1 строку?
Вызов функции удаления:
Python
1
2
3
4
5
6
7
8
9
10
11
12
    def del_pushbutton(self):
        """Функция удаляет выделенную строку из БД.
               Запускается через кнопку"""
        if self.inv_tabView.selectionModel().hasSelection():
            for index in self.inv_tabView.selectedIndexes() or []:
                print('Удаляется строка %d...' % index.row())
 
                self.inv_tabView.model().removeRows(index.row(), index.row())
 
        else:
            QMessageBox.warning(None, 'Ошибка удаления', 'Строки для удаления отсутствуют! \n'
                                                         'Выделите строку и повторите удаление.')
Переменную index стал использовать чтобы понять, почему при вызове beginRemoveRows(QModelIndex(), position, position) ничего не происходит. К сожалению это тоже не принесло результата.
0
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
15.06.2020, 16:52
Тут дело в том, что после удаления строки из реальной таблицы БД она не удаляется из кеша QSqlQuery, из которого читает данные NewSqlModel.data()

Добавлено через 2 минуты
напрашивается NewSqlModel.setQuery после удаления или чтото подобное
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 10
15.06.2020, 19:24  [ТС]
Цитата Сообщение от kapbepucm Посмотреть сообщение
Тут дело в том, что после удаления строки из реальной таблицы БД она не удаляется из кеша QSqlQuery, из которого читает данные NewSqlModel.data()
Добавлено через 2 минуты
напрашивается NewSqlModel.setQuery после удаления или чтото подобное
Дело в том что у меня даже не происходит операция удаления выбранной строки из БД.
Т.е. я правильно понял, что нужно повторно выполнить запрос:
Python
1
2
3
self.calculation_model = NewSqlModel()
self.calculation_model.setQuery('SELECT id, number_invoice, inv_date, company_name, '
                                               '(all_sum / 100.0) AS all_sum, signatory FROM calculation')
после выполнения функции удаления?
0
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
15.06.2020, 21:58
Модель заново не надо создавать, только обновить данные в ней.

Цитата Сообщение от troyann Посмотреть сообщение
Дело в том что у меня даже не происходит операция удаления выбранной строки из БД.
может какая нибудь ошибка при выполнении запроса происходит?
0
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
16.06.2020, 11:28
Лучший ответ Сообщение было отмечено troyann как решение

Решение

пример:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QTableView
from PyQt5.QtSql     import QSqlDatabase, QSqlQuery, QSqlQueryModel
from PyQt5.QtCore    import QModelIndex
 
class Model(QSqlQueryModel):
  def removeRows(self, row, count, parent = QModelIndex()):
    self.beginRemoveRows(QModelIndex(), row, row + count - 1)
    query = QSqlQuery()
    query.exec_('DELETE FROM table1 WHERE id = ' + str(row) + ';')
    self.endRemoveRows()
    query.exec_("SELECT * from table1;")
    self.setQuery(query)
    return True
 
class Window(QWidget):
  def __init__(self):
    super().__init__(None)
    self.tableView = QTableView()
    button = QPushButton("remove")
    layout = QVBoxLayout()
    layout.addWidget(self.tableView)
    layout.addWidget(button)
    self.setLayout(layout)
    db = QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName(":memory:")
    db.open()
    query = QSqlQuery()
    query.exec_("CREATE TABLE table1 (id INTEGER, name TEXT);")
    query.exec_("INSERT INTO table1 (id, name) VALUES (0, 'aaa');")
    query.exec_("INSERT INTO table1 (id, name) VALUES (1, 'bbb');")
    query.exec_("INSERT INTO table1 (id, name) VALUES (2, 'ccc');")
    query.exec_("INSERT INTO table1 (id, name) VALUES (3, 'ddd');")
    query.exec_("SELECT * from table1;")
    model = Model()
    model.setQuery(query)
    self.tableView.setModel(model)
    button.clicked.connect(self.del_pushbutton)
  def del_pushbutton(self):
    if self.tableView.selectionModel().hasSelection():
      for index in self.tableView.selectedIndexes() or []:
         self.tableView.model().removeRow(index.row())
 
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
2
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 10
16.06.2020, 12:11  [ТС]
Цитата Сообщение от kapbepucm Посмотреть сообщение
пример:
Спасибо за пример. Я нашел ошибку, почему у меня не происходила операция удаления. Когда я запускал нажатием кнопки операцию удаления, то я передавал функции removeRows индекс, который у нее записан в модели. Однако индекс в модели может отличаться от id в БД. Из-за этого запрос
Python
1
query.exec_('DELETE FROM calculation WHERE id = %d' % position)
работала некорректно.
После того как я стал передавать функции removeRows значение id выбранной строки из БД, запрос стал правильно работать.
0
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
16.06.2020, 12:46
Цитата Сообщение от troyann Посмотреть сообщение
Однако индекс в модели может отличаться от id в БД
я бы даже добавил, что они почти всегда отличаются
СтОит обучить модельку по id находить индекс и наоборот
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 10
18.06.2020, 21:36  [ТС]
Добрался наконец-то до компьютера. Вот мой работающий код, может кому-то пригодится.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class NewSqlModel(QSqlQueryModel):
    def __init__(self, parent=None):
        super(NewSqlModel, self).__init__()
 
    def flags(self, index):
        """Метод возвращает набор констант для элемента /
         с указанным индексом"""
        f1 = QSqlQueryModel.flags(self, index)
        if index.column() == 0:
            f1 |= Qt.ItemIsEditable
        return f1
 
    def setData(self, index, value, role=Qt.EditRole):
        """Метод должен выполнить задачу установки данных /
          и вернуть значение были ли внесены изменения."""
        self.data = QSqlQueryModel.data(self, index, role)
        if index.isValid():
            self.data(index.row(), value)
            self.dataChanged.emit(index, index, role)
            return True
        return False
 
    def removeRows(self, index, count, parent=QModelIndex()):
        """Метод реализует операцию удаления записи из БД. /
        В качестве индекса используется id записи из БД"""
        self.beginRemoveRows(parent, index, index)
        query = QSqlQuery()
        query.exec_('DELETE FROM calculation WHERE id = %d' % index)
        print(query.lastError().text())
        self.endRemoveRows()
        query.exec_('SELECT id, number_invoice, inv_date, company_name, '
                    '(all_sum / 100.0) AS all_sum, signatory FROM calculation')
        self.setQuery(query)
        return True
И подключение таблицы БД к модели и вызов функции удаления.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    def connect_column_calc(self):
        """Функция подключает таблицу к моделе"""
 
        self.calculation_model = NewSqlModel()
        self.calculation_model.setQuery('SELECT id, number_invoice, inv_date, company_name, '
                                        '(all_sum / 100.0) AS all_sum, signatory FROM calculation')
 
    def del_pushbutton(self):
        """Функция удаляет выделенную строку из БД.
            Запускается через кнопку"""
        if self.inv_tabView.selectionModel().hasSelection():
            for index in self.inv_tabView.selectedIndexes() or []:
                print('Удаляется строка %d...' % index.row())
                # Получаем id выделенной строки
                id_row = self.calculation_model.data(self.calculation_model.index(
                    self.inv_tabView.currentIndex().row(), 0))
 
                self.inv_tabView.model().removeRows(id_row)
 
        else:
            QMessageBox.warning(None, 'Ошибка удаления', 'Строки для удаления отсутствуют! \n'
                                                         'Выделите строку и повторите удаление.')
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 10
16.08.2020, 21:02  [ТС]
Что бы не дублировать тему, задам вопрос здесь. К модели в предыдущем ответе решил прикрутить сортировку на основе QSortFilterProxyModel. Сортировка работает, но при попытке удалить строку происходит вылет программы с ошибкой "Process finished with exit code 255". В чем может быть ошибка?
Код функции удаления:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    def del_pushbutton(self):
        """Функция удаляет выделенную строку из БД.
               Запускается через кнопку"""
        if self.start_menu.inv_tabView.selectionModel().hasSelection():
            for index in self.start_menu.inv_tabView.selectedIndexes() or []:
                print('Удаляется строка %d...' % index.row())
                # Получаем номер выделенной строки в tabView
                proxy_index = self.calc_proxy_model.mapToSource(index).row()
                print(proxy_index)
                # Определяем id в БД по номеру строки из модели
                id_row = self.calculation_test_model.data(self.calculation_test_model.index(proxy_index, 0))
 
                self.calculation_test_model.removeRows(id_row, 0)
        else:
            QMessageBox.warning(None, 'Ошибка удаления', 'Строки для удаления отсутствуют! \n'
                                                         'Выделите строку и повторите удаление.')
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
17.08.2020, 01:13
ловите исключение, так трудно сказать
Python
1
2
3
4
try:
        self.calculation_test_model.removeRows(id_row, 0)
except Exception as e:
        print(repr(e))
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 10
17.08.2020, 23:40  [ТС]
Цитата Сообщение от vic5710 Посмотреть сообщение
ловите исключение, так трудно сказать
PythonВыделить код
1
2
3
4
try:
        self.calculation_test_model.removeRows(i d_row, 0)
except Exception as e:
        print(repr(e))
К сожалению исключение словить не удалось. Отладчик крашится на моменте self.setQuery(query) функции removeRows при этом в консоли ничего кроме ошибки 255 так и не выводится.
Функция removeRows:
Python
1
2
3
4
5
6
7
8
9
10
11
12
    def removeRows(self, index, count, parent=QModelIndex()):
        """Метод реализует операцию удаления записи из БД. /
        В качестве индекса используется id записи из БД"""
        self.beginRemoveRows(parent, index, index)
        query = QSqlQuery()
        query.exec_('DELETE FROM calculation WHERE id = %d' % index)
        print(query.lastError().text())
        self.endRemoveRows()
        query.exec_('SELECT id, number_invoice, inv_date, company_name, '
                    '(all_sum / 100.0) AS all_sum, signatory FROM calculation')
        self.setQuery(query)
        return True
0
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
18.08.2020, 09:56
Можете выложить полный код, вырезав всё лишнее, демонстрирующий проблему?
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 10
18.08.2020, 22:43  [ТС]
Цитата Сообщение от kapbepucm Посмотреть сообщение
Можете выложить полный код, вырезав всё лишнее, демонстрирующий проблему?
Вот полный код программы:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
import sys
from start_menu import *
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import QSortFilterProxyModel, QModelIndex, Qt
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
from PyQt5.QtWidgets import (QApplication, QMessageBox, QMainWindow)
 
 
class TableModel(QMainWindow):
    def __init__(self):
        super().__init__()
        self.calc_proxy_model = None
        self.combined_request_model = None
        self.calculation_test_model = None
        self.connect_to_db()
        self.start_menu = Ui_MainWindow()
        self.start_menu.setupUi(self)
        self.connect_column_calc()
        self.table_drawing()
 
    def connect_to_db(self):
        """Функция подключается к существующей базе данных.
        Если база данных остутствует то либо вылетает ошибка
        либо создается новая база данных"""
        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("test.db")
        if not self.db.open():
            QMessageBox.critical(None, ("Не удается открыть базу данных"),
                                 QMessageBox.Cancel)
            return False
 
    def connect_column_calc(self):
        """Функция подключется и импортирует таблицу Расчеты (calculation).
        Присваиваються названия для каждого столбца"""
 
        self.calculation_test_model = NewSqlModel()
        self.calculation_test_model.setQuery('SELECT id, number_invoice, inv_date, company_name, '
                                             '(all_sum / 100.0) AS all_sum, signatory FROM calculation')
        self.proxy_column_calc()
 
    def proxy_column_calc(self):
        self.calc_proxy_model = QSortFilterProxyModel()
        self.calc_proxy_model.setSourceModel(self.calculation_test_model)
 
        # Название столбцов
        self.calc_proxy_model.setHeaderData(1, QtCore.Qt.Horizontal, "Номер счета")
        self.calc_proxy_model.setHeaderData(2, QtCore.Qt.Horizontal, "Дата")
        self.calc_proxy_model.setHeaderData(3, QtCore.Qt.Horizontal, "Предприятие")
        self.calc_proxy_model.setHeaderData(4, QtCore.Qt.Horizontal, "Общая сумма")
        self.calc_proxy_model.setHeaderData(5, QtCore.Qt.Horizontal, "Подписант")
 
    def table_drawing(self):
        """Функция рисует таблицу в TableView,
        и занимается визуальным оформлением таблицы
         (сортировка, компановка, индекс)"""
        self.start_menu.inv_tabView.setModel(self.calc_proxy_model)
        # Сортировка таблицы
        self.start_menu.inv_tabView.setSortingEnabled(True)
 
        # Растягивание столбцов
        header = self.start_menu.inv_tabView.horizontalHeader()
        header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch)
        header.setSectionResizeMode(4, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(5, QtWidgets.QHeaderView.ResizeToContents)
 
        # Отключаем видимость столбцов 0 и 5
        for column_hidden in (0, 5, 6):
            self.start_menu.inv_tabView.hideColumn(column_hidden)
 
        # Передаем индекс ячейки функции
        self.start_menu.inv_tabView.pressed.connect(self.row_select)
 
        self.start_menu.inv_tabView.selectedIndexes()
 
    def row_select(self, index):
        """Функция по номеру счета выбирает данные из БД \
           и выгружает их в таблицу 'Подробнее' """
        select_cell = str(index.sibling(index.row(), 1).data())
        print(select_cell)
        self.combined_request_model = QSqlQueryModel()
        self.combined_request_model.setQuery("SELECT id, num_invoice, name_work_training, (price / 100.0) AS price, "
                                             "quantity, (summa / 100.0) AS summa FROM work_training "
                                             "WHERE num_invoice='%s' UNION " % select_cell +
                                             "SELECT id, num_invoice, name_exec_training, (price / 100.0) AS price, "
                                             "quantity, (summa / 100.0) AS summa FROM executive_training "
                                             "WHERE num_invoice='%s'" % select_cell)
 
        print(self.combined_request_model.lastError().text())
        self.start_menu.detail_tabView.setModel(self.combined_request_model)
 
 
        # Название столбцов в таблице 'Подробнее' и отключение столбцы id
        self.combined_request_model.setHeaderData(1, QtCore.Qt.Horizontal, "Номер счета")
        self.combined_request_model.setHeaderData(2, QtCore.Qt.Horizontal, "Название обучения")
        self.combined_request_model.setHeaderData(3, QtCore.Qt.Horizontal, "Цена")
        self.combined_request_model.setHeaderData(4, QtCore.Qt.Horizontal, "Количество")
        self.combined_request_model.setHeaderData(5, QtCore.Qt.Horizontal, "Сумма")
        self.start_menu.detail_tabView.hideColumn(0)
 
        # Растягивание столбцов
        header = self.start_menu.detail_tabView.horizontalHeader()
        header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(2, QtWidgets.QHeaderView.Stretch)
        header.setSectionResizeMode(3, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(4, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(5, QtWidgets.QHeaderView.ResizeToContents)
 
 
class NewSqlModel(QSqlQueryModel):
    def __init__(self, parent=None):
        super(NewSqlModel, self).__init__()
 
    def flags(self, index):
        """Метод возвращает набор констант для элемента /
         с указанным индексом"""
        f1 = QSqlQueryModel.flags(self, index)
        if index.column() == 0:
            f1 |= Qt.ItemIsEditable
        return f1
 
    def setData(self, index, value, role=Qt.EditRole):
        """Метод должен выполнить задачу установки данных /
          и вернуть значение были ли внесены изменения."""
        self.data = QSqlQueryModel.data(self, index, role)
        if index.isValid():
            self.data(index.row(), value)
            self.dataChanged.emit(index, index, role)
            return True
        return False
 
    def removeRows(self, index, count, parent=QModelIndex()):
        """Метод реализует операцию удаления записи из БД. /
        В качестве индекса используется id записи из БД"""
        self.beginRemoveRows(parent, index, index)
 
        print(index)
 
        query = QSqlQuery()
        query.exec_('PRAGMA foreign_keys = ON')
        query.exec_('DELETE FROM calculation WHERE id = %d' % index)
        print(query.lastError().text())
        self.endRemoveRows()
 
        query.exec_('SELECT id, number_invoice, inv_date, company_name, '
                    '(all_sum / 100.0) AS all_sum, signatory FROM calculation')
        self.setQuery(query)
 
 
class ConnectGui(TableModel):
    def __init__(self):
        super().__init__()
        self.button_interface()
 
    def button_interface(self):
        """Функция подключает модули при нажатии /
            на кнопку (Добавить, Удалить)"""
        self.start_menu.del_pushButton.clicked.connect(self.del_pushbutton)
 
    def del_pushbutton(self):
        """Функция удаляет выделенную строку из БД.
               Запускается через кнопку"""
        if self.start_menu.inv_tabView.selectionModel().hasSelection():
            for index in self.start_menu.inv_tabView.selectedIndexes() or []:
                print('Удаляется строка %d...' % index.row())
                # Получаем id выделенной строки
                proxy_index = self.calc_proxy_model.mapToSource(index).row()
                print(proxy_index)
                id_row = self.calculation_test_model.data(self.calculation_test_model.index(proxy_index, 0))
 
                self.calculation_test_model.removeRows(id_row, 0)
        else:
            QMessageBox.warning(None, 'Ошибка удаления', 'Строки для удаления отсутствуют! \n'
                                                         'Выделите строку и повторите удаление.')
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ConGui = ConnectGui()
    ConGui.show()
    sys.exit(app.exec_())
Так же прикладываю файлы программы.
Вложения
Тип файла: rar run_test.rar (9.3 Кб, 16 просмотров)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
19.08.2020, 00:05
Bash
1
2
3
4
5
6
7
8
9
10
Air:run_test admin$ python3 "test.py"
5-20
 
5-20
 
Удаляется строка 0...
2
77
 
Segmentation fault: 11
сегфолт идет. вангую выход за границы массива

Добавлено через 16 минут
нужна ли вам эта прокси?
http://old.code.mu/sql/order-by.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.08.2020, 00:05
Помогаю со студенческими работами здесь

Как удалить выделенную строку в listbox
Добрый вечер всем. Хочу удалить строку в listbox(привязанную к таблице) и одновременно удалить идентичную строку в таблице Access. Сейчас...

Как удалить выделенную строку в бд через forms?
Есть код: string query = "delete from tbl_users where id=2"; NpgsqlCommand cmd = new NpgsqlCommand(query,...

QTableView как узнать выделенную клетку
здравствуйте, коллеги. третий день знакомлюсь с Qt, потому подозреваю, что задам сейчас очень глупый вопрос. тем не менее: как получить...

Как удалить выделенную строку в DbGrid, если строка результат выборки, объединения 2 таблиц?
Здравствуйте! Как удалить выделенную строку в дбгриде, если строка результат выборки, объединения 2 таблиц? Проставление в гриде...

Удалить выделенную строку
Как можно удалить строку с DstaGrid, которая выделена?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru