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

Как получить индексы выделенных строк в QTableView?

15.10.2020, 23:21. Показов 8145. Ответов 9

Студворк — интернет-сервис помощи студентам
Мне нужно получить выделенные строки в таблице. Затем я хочу удалить в базе данных строки с айди, которые равны этим индексам. То, что нашёл, не работает:

Python
1
2
3
4
5
6
7
8
indices = self.table.selectionModel().selectedRows()
        for index in sorted(indices):
            self.model.removeRow(index.row())
 
        with sq.connect("base.db") as con:
            cur = con.cursor()
 
            cur.execute("""DELETE FROM chessplayers WHERE rowid == rows""")
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.10.2020, 23:21
Ответы с готовыми решениями:

Как получить индексы выделенных строк в DGV
Нужно удалить строки из dataGridView. Как получить индексы строк dataGridView если пользователь выделяет сразу несколько строк?

Как получить индексы выделенных элементов в ListBox е?
Как получить индексы выделенных элементов в ListBox е? нужно расчитать выделенные элементы листбокса помогите с этим

Узнать индексы выделенных строк dataGridView
Приветствую всех здесь. Чтоб узнать индекс одной строки dataGridViw есть несколько способов. Вот один из них int index =...

9
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
16.10.2020, 10:24
Цитата Сообщение от KaffLime Посмотреть сообщение
не работает
Уточните, не удаляет строки из QTableView или из базы данных?
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227
16.10.2020, 16:25  [ТС]
С базой данных проблем нет, я пользуюсь "?". А удаление в отображаемой таблице просто для проверки того, что я реально получаю индексы. Строки не удаляются, значит что-то не так. При этом мне нужно подавать в БД непосредственно int, а не какие-то объекты QT-классов
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,761
17.10.2020, 10:17
KaffLime, вы с чем работаете? данные в модели хранятся/изменяются, из TableView не надо ничего удалять
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227
17.10.2020, 18:30  [ТС]
???
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,761
17.10.2020, 20:56
Цитата Сообщение от KaffLime Посмотреть сообщение
???
https://github.com/baoboa/pyqt... amples/sql
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227
17.10.2020, 21:39  [ТС]
Не понимаю. Мне просто надо взять номера выделенных строк и удалить их в базе данных. Я не знаю как получить эти номера, тем более чтобы они хранились как integer
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,761
17.10.2020, 21:55
QTableView с моделью применяется. модель какая?
https://doc.qt.io/qtforpython/... eView.html
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227
17.10.2020, 22:21  [ТС]
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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
from for_mix import Ui_MainWindow
import sys, sqlite3 as sq
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from datetime import datetime
 
 
class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        self._data = data
        self.horizontalHeaderLabels = []
 
    def setHorizontalHeaderLabels(self, horizontalHeaderLabels):
        self.horizontalHeaderLabels = horizontalHeaderLabels
 
    def headerData(self, section, orientation, role=Qt.DisplayRole):
        if (orientation == Qt.Horizontal and role == Qt.DisplayRole and len(
                self.horizontalHeaderLabels) == self.columnCount(None)):
            return self.horizontalHeaderLabels[section]
        return super().headerData(section, orientation, role)
 
    def data(self, index, role):
        if role == Qt.DisplayRole:
            # Get the raw value
            value = self._data[index.row()][index.column()]
 
            # Perform per-type checks and render accordingly.
            if isinstance(value, datetime):
                # Render time to YYY-MM-DD.
                return value.strftime("%Y-%m-%d")
 
            if isinstance(value, float):
                # Render float to 2 dp
                return "%.2f" % value
 
            if isinstance(value, str):
                # Render strings with quotes
                return '"%s"' % value
 
            # Default (anything not captured above: e.g. int)
            return value
 
        if role == Qt.ForegroundRole:
            value = self._data[index.row()][index.column()]
 
            if (
                    (isinstance(value, int) or isinstance(value, float))
                    and value < 0
            ):
                return QtGui.QColor('red')
 
    def rowCount(self, index):
        # The length of the outer list.
        return len(self._data)
 
    def columnCount(self, index):
        # The following takes the first sub-list, and returns
        # the length (only works if all rows are an equal length)
        return len(self._data[0])
 
 
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
 
        self.table = QtWidgets.QTableView()
        self.setWindowTitle("Шахматисты")
        self.resize(800, 600)
 
 
        with sq.connect("base.db") as con:
            cur = con.cursor()
 
            cur.execute("""DROP TABLE IF EXISTS chessplayers""")
 
            cur.execute("""CREATE TABLE IF NOT EXISTS chessplayers (
            Name TEXT,
            Age INTEGER,
            Sex TEXT DEFAULT 'Male',
            Country TEXT,
            Rank TEXT,
            WorldChampion TEXT DEFAULT 'Yes'
            )""")
 
            cur.execute("""INSERT INTO chessplayers VALUES('Hi', 1, 'hello', 'Hello', 'Hello', 'hello')""")
            cur.execute("""INSERT INTO chessplayers VALUES('Hello', 9, 'Hi', 'Go', 'Hello', 'hello')""")
            cur.execute("""INSERT INTO chessplayers VALUES('Hello', 6, 'Man', 'Hi', 'Man', 'hello')""")
            cur.execute("""INSERT INTO chessplayers VALUES('Man', 4, 'Hello', 'Go', 'Go', 'hello')""")
            cur.execute("""INSERT INTO chessplayers VALUES('Go', 8, 'Hello', 'Man', 'Hi', 'hello')""")
 
            cur.execute("""SELECT * FROM chessplayers""")
            result = cur.fetchall()
 
            self.data = result
 
 
        self.model = TableModel(self.data)
        self.model.setHorizontalHeaderLabels(['Name', 'Age', 'Sex', 'Name', 'Age', 'Sex'])
        self.table.setModel(self.model)
        self.table.setMinimumSize(800, 400)
        self.table.setMaximumSize(800, 400)
        self.setCentralWidget(self.table)
        self.button1 = QtWidgets.QPushButton('ИЗМЕНИТЬ', self)
        self.button1.resize(100, 60)
        self.button1.move(30, 420)
        self.button2 = QtWidgets.QPushButton('УДАЛИТЬ', self)
        self.button2.resize(100, 60)
        self.button2.move(30, 500)
        self.button3 = QtWidgets.QPushButton('ДОБАВИТЬ', self)
        self.button3.resize(100, 60)
        self.button3.move(150, 420)
        self.button4 = QtWidgets.QPushButton('СОРТИРОВКА', self)
        self.button4.resize(100, 60)
        self.button4.move(150, 500)
        self.button5 = QtWidgets.QPushButton('НАЙТИ', self)
        self.button5.resize(100, 60)
        self.button5.move(270, 420)
        self.button6 = QtWidgets.QPushButton('ИНФО', self)
        self.button6.resize(100, 60)
        self.button6.move(270, 500)
        self.lineEdit = QtWidgets.QLineEdit(self)
        self.lineEdit.resize(350, 140)
        self.lineEdit.move(400, 420)
        f = self.lineEdit.font()
        f.setPointSize(27)
        self.lineEdit.setFont(f)
        self.button1.clicked.connect(self.change)
        self.button2.clicked.connect(self.remove)
        self.button3.clicked.connect(self.add)
        self.button4.clicked.connect(self.sort)
        self.button5.clicked.connect(self.find_text)
        self.button6.clicked.connect(self.info)
 
    def change(self):
        pass
 
    def add(self):
        with sq.connect("base.db") as con:
            cur = con.cursor()
 
            cur.execute("""INSERT INTO chessplayers VALUES(NULL, NULL, NULL, NULL, NULL, NULL)""")
 
            cur.execute("""SELECT * FROM chessplayers""")
            result = cur.fetchall()
 
            self.data = result
 
            self.model = TableModel(self.data)
            self.model.setHorizontalHeaderLabels(['Name', 'Age', 'Sex', 'Name', 'Age', 'Sex'])
            self.table.setModel(self.model)
 
 
    def remove(self):
 
        #indices = self.table.selectionModel().selectedRows()
        #for index in sorted(indices):
            #self.model.removeRow(index.row())
        rows = 5
 
        with sq.connect("base.db") as con:
            cur = con.cursor()
 
            cur.execute("""DELETE FROM chessplayers WHERE rowid == ?""", (rows,))
 
            cur.execute("""SELECT * FROM chessplayers""")
            result = cur.fetchall()
 
            self.data = result
 
            self.model = TableModel(self.data)
            self.model.setHorizontalHeaderLabels(['Name', 'Age', 'Sex', 'Name', 'Age', 'Sex'])
            self.table.setModel(self.model)
 
    def info(self):
        pass
 
    def find_text(self):
        pass
 
    def sort(self):
 
        with sq.connect("base.db") as con:
            cur = con.cursor()
 
            cur.execute("""SELECT * FROM chessplayers ORDER BY Age""") #if column == 0 ORDER BY Name, etc
            result = cur.fetchall()
 
            self.data = result
 
            self.model = TableModel(self.data)
            self.model.setHorizontalHeaderLabels(['Name', 'Age', 'Sex', 'Name', 'Age', 'Sex'])
            self.table.setModel(self.model)
 
 
app = QtWidgets.QApplication([])
application = MainWindow()
application.show()
 
sys.exit(app.exec())
Добавлено через 6 минут
Вообще оно удаляет через бд, но если так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
row_index = 0
        indices = self.table.selectionModel().selectedRows()
        for index in sorted(indices):
            row_index = index.row()
            #self.model.removeRow(index.row())
 
        rows = row_index
 
        with sq.connect("base.db") as con:
            cur = con.cursor()
 
            cur.execute("""DELETE FROM chessplayers WHERE rowid == ?""", (rows,))
Но фактически при выделении какой-либо строки и нажатии кнопки "УДАЛЕНИЕ" удаляет только первую строку
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,761
17.10.2020, 22:42
Лучший ответ Сообщение было отмечено KaffLime как решение

Решение

используйте лучше стандартные модели, ИМХО лишнюю работу делаете
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
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QTableView, QWidget, QGridLayout, QPushButton, QComboBox,
QFileDialog, QMessageBox, QMenu)
from PyQt5.QtSql import QSqlTableModel, QSqlDatabase, QSqlQuery, QSqlRecord
 
class View(QWidget):
    def __init__(self):
        super().__init__()
        self.dbname = ''
        self.db = QSqlDatabase.addDatabase('QSQLITE')
        self.view = QTableView()
        self.view.horizontalHeader().setSectionResizeMode(1)
        self.btnOpen = QPushButton('Открыть базу данных')
        self.btnOpen.clicked.connect(self.open_db)
        self.box = QComboBox()
        self.box.currentIndexChanged.connect(self.on_index)
        grid = QGridLayout(self)
        grid.setContentsMargins(0,0,0,0)
        grid.addWidget(self.view,0,0,4,4)
        grid.addWidget(self.box,4,0,1,1)
        grid.addWidget(self.btnOpen,4,1,1,1)
        self.model = QSqlTableModel()
        #self.model.setEditStrategy(QSqlTableModel.OnManualSubmit)
        self.model.setEditStrategy(QSqlTableModel.OnRowChange)
 
    def open_db(self):
        dbname,_ = QFileDialog.getOpenFileName(self,'Открыть базу данных',self.dbname,'*.db *.sqlite')
        if not dbname: return
        self.dbname = dbname
        self.db.setDatabaseName(self.dbname)
        if not(self.db.open()):
            QMessageBox.critical(self,"",self.db.lastError().text())
            return
        self.box.clear()
        self.box.addItems(self.db.tables())
    
    def on_index(self):
        table = self.box.currentText()
        self.model.setTable(table)
        if table == 'tbl':
            self.model.setHeaderData(0, Qt.Horizontal, "Вопрос")
            self.model.setHeaderData(1, Qt.Horizontal, "Ответ")
        self.view.setModel(self.model)
        self.model.select()
 
    def contextMenuEvent(self,event):
        pos = self.view.mapToGlobal(event.pos())
        mnu = QMenu()
        mnu.addAction('Open DB').setObjectName('open')
        mnu.addAction('Add record').setObjectName('add')
        mnu.addAction('Delete record').setObjectName('del')
        mnu.addAction('Submit all').setObjectName('submit')
        ret = mnu.exec_(pos)
        if not ret: 
            return
        obj = ret.objectName()
        if obj == 'open':
            self.open_db()
        if obj == 'add':
            row = self.model.rowCount()
            self.model.insertRow(row)
            self.model.setData(self.model.index(row,0),None)
            self.model.submit()
        elif obj == 'del':
            idx = self.view.currentIndex()
            self.model.removeRow(idx.row())
            self.model.submit()
        self.view.setCurrentIndex(self.model.index(-1,-1))
        self.model.select()
        
if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = View()
    w.resize(600,400)
    w.show()
    sys.exit(app.exec_())
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.10.2020, 22:42
Помогаю со студенческими работами здесь

Получить индексы выделенных элементов ListBox
Есть ListBox с привязкой к списку ObservableCollection&lt;T&gt;. Нужно получить индексы выделенных элементов при...

true dbgrid.Как получить значения полей из выделенных строк?
С помощью selbookmark получаю номера выделенных строк. А как мне получить значения полей из этих выделенных записей? Б. спасибо.

DataGrid получить список выделенных строк
Есть DataGrid с названием Table , из которой получаю список выделенных строк таким образом: var selected= Table.SelectedItems; Как...

Как скопировать несколько выделенных строк?
У меня проблема кода я выделяю мышкой несколько строк в datagridview то он всего лишь берёт и копирует одну строку из моих всех выделеных...

Как получить значения выделенных чекбоксов?
Я скорее всего повторяюсь, но не как не могу разобраться:wall: Имеется следующий код print &quot; &lt;form action='add.php'...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru