Форум сайта python.su
Добрый день.
Не могу настроить обновление изменённых ячеек в QTable.
Настроил перехват клавиши Энтер, но её надо нажимать два раза. После завершения ввода в ячейку и второй раз для срабатывания сигнала PressEnter.
Это не по людски.
def keyPressEvent(self, e):
if e.key() == Qt.Key_Return:
self.edit_row()
Хотел подключить сигнал void QTableWidget::itemChanged(QTableWidgetItem *item)
Но не смог разобраться.
(Мне 60 лет и я живу рядом с деревней Селёвкино. Поэтому тролли будут посланы так далеко, что могут не найти обратной дороги) Питон изучаю всего неделю. Мне нужно приложение для маленького магазинчика. 1С ваще не рулит ни разу. Есть опыт программирования на АЛГОЛ 66 и пр. Может найдётся добрая душа дать ответ на простые вопросы? Мне спросить не у кого… С Ок Гуглом вчера поссорились…)
1. что означает ‘*item’ ? Строка,столбец? Переменная? Значение?
2. Как правильно записать строку:
self.ui.tableWidget_2.itemChanged(QTableWidgetItem *item) {edit_row()}
Я не понимаю, как подключить процедуру “edit_row” при срабатывании сигнала ItemChanged
Буду рад любому совету.
Отредактировано LuckyTruck (Март 19, 2019 12:24:30)
Офлайн
LuckyTruckУказатель на элемент таблицы.
1. что означает ‘*item’ ?
The QTableWidgetItem class provides an item for use with the QTableWidget class.
Table items are used to hold pieces of information for table widgets. Items usually contain text, icons, or checkboxes
LuckyTruckЭто всё сложный уровень, не для недельного изучения питона. Суть в том, что при изменении элемента таблицы, сама таблица порождает сигнал, в котором передаётся этот изменённый элемент. Сигнал присоединяется к слоту и в слот попадёт этот элемент таблицы, пришедший с сигналом (сигнал как бы переносит элемент таблицы на себе к слоту). Дальше в слоте можно брать этот элемент и с ним работать.
2. Как правильно записать строку:
LuckyTruckА малыш пятилетний хочет в космос полететь и даже всерьёз строит у себя космический корабль в комнате из палок от кресла. Ну он это видел в мультике про фиксиков. И что это значит? Это ничего не значит.
Питон изучаю всего неделю. Мне нужно приложение для маленького магазинчика.
#!/usr/bin/env python3
import sys
from PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.spin = QtGui.QSpinBox(self)
self.label = QtGui.QLabel(self)
self.label.move(30, 30)
self.label.resize(100, 20)
self.spin.valueChanged[int].connect(self.slot)
self.setGeometry(500, 500, 200, 100)
self.setWindowTitle('SpinBox + LineEdit')
self.show()
def slot(self, value):
self.label.setText(str(value * 2))
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Отредактировано py.user.next (Март 19, 2019 13:13:28)
Офлайн
Огромное спасибо!!!
Офлайн
Так что ты потренируйся вообще консольную программу сделать хотя бы уровня 2 + 2 = 4
Пока что вот что наваял.
Вроде как не 2+2…
from PyQt5.QtWidgets import QTableWidgetItem from PyQt5.QtWidgets import QWidget, QApplication from PyQt5.QtCore import Qt from qtable import * import sys from PyQt5.QtSql import (QSqlDatabase, QSqlQuery) #and so on. import sqlite3 data = [] class mywindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.view1() # очистка таблицы при клике на кнопку. self.ui.pushButton.clicked.connect(self.view1) nn = 1 self.edit_row() def view1(self): #очистка и перезапись таблицы self.clear() self.conn = sqlite3.connect('str_chek.db') self.c1 = self.conn.cursor() self.c1.execute('''SELECT MAX(cheknum) FROM str_chek''') self.conn.commit() nn = self.c1.fetchone() #print(nn) nn = str(nn) nn = nn.replace(',', '') #print(nn) nn = nn.replace('(', ' ') #print(nn) nn = nn.replace(')', ' ') #print(nn) nn = str(nn) self.conn = sqlite3.connect('str_chek.db') self.c = self.conn.cursor() self.c.execute("SELECT * FROM str_chek WHERE cheknum = '%s' ORDER BY id DESC" % nn) rows = self.c.fetchall() for row in rows: inx = rows.index(row) self.ui.tableWidget_2.insertRow(inx) # add more if there is more columns in the database. self.ui.tableWidget_2.setItem(inx, 0, QTableWidgetItem(str(row[0]))) self.ui.tableWidget_2.setItem(inx, 1, QTableWidgetItem(str(row[1]))) self.ui.tableWidget_2.setItem(inx, 2, QTableWidgetItem(str(row[2]))) self.ui.tableWidget_2.setItem(inx, 3, QTableWidgetItem(str(row[3]))) self.ui.tableWidget_2.setItem(inx, 4, QTableWidgetItem(str(row[4]))) self.ui.tableWidget_2.setItem(inx, 5, QTableWidgetItem(str(row[5]))) #self.ui.tableWidget_2.itemChanged(QTableWidgetItem *item) [edit_row()] def keyPressEvent(self, e): if e.key() == Qt.Key_Return: self.edit_row() def clear(self): self.ui.tableWidget_2.setRowCount(0) def clear_row(self): self.ui.tableWidget_2.setRowCount(0) def edit_row(self): row1 = self.ui.tableWidget_2.currentRow() col = self.ui.tableWidget_2.currentColumn() r = float(row1) if r < 0: #print("List is empty") return else: id1 = self.ui.tableWidget_2.item(row1, 0) id1 = id1.text() cheknum = self.ui.tableWidget_2.item(row1, 1) cheknum = cheknum.text() description = self.ui.tableWidget_2.item(row1,2) description = description.text() quant = self.ui.tableWidget_2.item(row1, 3) quant = quant.text() cost = self.ui.tableWidget_2.item(row1, 4) cost = cost.text() total = self.ui.tableWidget_2.item(row1, 5) total = total.text() str1 = 'UPDATE str_chek SET cheknum=' str2 = str(cheknum) str5 = ', quant=' str6 = str(quant) str3 = ' WHERE id =' str4 = str(id1) #str5 = '"' str0 = str1 + str2 +str5 + str6 + str3 + str4 print(str0) self.c.execute('''{}'''.format(str0)) print(str0) self.conn.commit() print(cheknum) print(description) print(quant) print(cost) print(total) def row_column_clicked(self,row, col, value): row = self.tableWidget.currentRow() col = self.tableWidget.currentColumn() value = self.tableWidget.item(row, col) app = QtWidgets.QApplication([]) win = mywindow() win.show() sys.exit(app.exec())
Отредактировано LuckyTruck (Март 19, 2019 15:22:07)
Офлайн
Работает, но не так, как надо пользователю…
Офлайн
py.user.nextПолучится.
Но я не думаю, что у тебя получится.
Отредактировано LuckyTruck (Март 19, 2019 13:33:04)
Офлайн
LuckyTruck Помещай код в специальный тег, иначе отступы отваливаются. Если нужно редактировать данные в таблице, то лучше использовать QTableView.
Онлайн
RodegastOK
лучше использовать QTableView.
Офлайн
Значит никто не знает как приручить ChangeItem в QtableWidget&
Жаль…..
Отредактировано LuckyTruck (Март 19, 2019 15:37:10)
Офлайн
"Для случаев, когда использование внешней модели избыточно, нужно создавать виджеты, содержащие в наименовании классов Q…Widget. Это экономит время, поскольку модель в этих классах (QTableWidget, QTreeWidget и QListWidget) уже встроена."
А как изменить эту модель? Как обратиться не к виджету, а к модели? И изменится ли данные курсора и базы SQLite соответственно? Или надо будет делать UPDATE?
Я планировал апдейтить только редактируемые записи. Иначе это бегемот будет, а не код.
Офлайн