Уведомления

Группа в Telegram: @pythonsu

#1 Март 19, 2019 12:18:46

LuckyTruck
От: Москва
Зарегистрирован: 2019-03-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

обновление ячеек QtableWidget с помощью ChangeItem.

Добрый день.
Не могу настроить обновление изменённых ячеек в 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)

Офлайн

#2 Март 19, 2019 13:11:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

обновление ячеек QtableWidget с помощью ChangeItem.

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. Как правильно записать строку:
Это всё сложный уровень, не для недельного изучения питона. Суть в том, что при изменении элемента таблицы, сама таблица порождает сигнал, в котором передаётся этот изменённый элемент. Сигнал присоединяется к слоту и в слот попадёт этот элемент таблицы, пришедший с сигналом (сигнал как бы переносит элемент таблицы на себе к слоту). Дальше в слоте можно брать этот элемент и с ним работать.

Вообще, эта звёздочка в описании сигнала имеет отношение к языку C++, на котором ты смотришь документацию, и в питоне она не используется. У тебя документация на C++, а код ты пишешь на питоне. Поэтому тебе надо потренироваться на чём-нибудь простом, чтобы хотя бы в этих вещах разобраться.

LuckyTruck
Питон изучаю всего неделю. Мне нужно приложение для маленького магазинчика.
А малыш пятилетний хочет в космос полететь и даже всерьёз строит у себя космический корабль в комнате из палок от кресла. Ну он это видел в мультике про фиксиков. И что это значит? Это ничего не значит.

Так что ты потренируйся вообще консольную программу сделать хотя бы уровня 2 + 2 = 4, ну или решающую албеграическое уравнение ax^2 + bx + c = 0. И вот если это получится сделать, тогда можно приступать к графическим библиотекам.

Вот тебе пример работы с сигналом спинера
#!/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)

Офлайн

#3 Март 19, 2019 13:17:55

LuckyTruck
От: Москва
Зарегистрирован: 2019-03-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

обновление ячеек QtableWidget с помощью ChangeItem.

Огромное спасибо!!!

Офлайн

#4 Март 19, 2019 13:19:29

LuckyTruck
От: Москва
Зарегистрирован: 2019-03-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

обновление ячеек QtableWidget с помощью ChangeItem.

Так что ты потренируйся вообще консольную программу сделать хотя бы уровня 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)

Офлайн

#5 Март 19, 2019 13:19:52

LuckyTruck
От: Москва
Зарегистрирован: 2019-03-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

обновление ячеек QtableWidget с помощью ChangeItem.

Работает, но не так, как надо пользователю…

Офлайн

#6 Март 19, 2019 13:30:15

LuckyTruck
От: Москва
Зарегистрирован: 2019-03-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

обновление ячеек QtableWidget с помощью ChangeItem.

py.user.next
Но я не думаю, что у тебя получится.
Получится.
Просто если мне покажут, как подколючить ChangeItem к CurrentItem я сделаю это быстрее.
А 2+2 будет четыре. Жаль, что ты не знаешь.
Я думал, ты ас.
А ты удвас.
Тупо перепечатал учебник. Ты, ваще, можешь чё? Али, того, importent?

Отредактировано LuckyTruck (Март 19, 2019 13:33:04)

Офлайн

#7 Март 19, 2019 14:02:17

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2680
Репутация: +  182  -
Профиль   Отправить e-mail  

обновление ячеек QtableWidget с помощью ChangeItem.

LuckyTruck Помещай код в специальный тег, иначе отступы отваливаются. Если нужно редактировать данные в таблице, то лучше использовать QTableView.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#8 Март 19, 2019 15:23:24

LuckyTruck
От: Москва
Зарегистрирован: 2019-03-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

обновление ячеек QtableWidget с помощью ChangeItem.

Rodegast
лучше использовать QTableView.
OK
Попробую…

Спасибо.

Офлайн

#9 Март 19, 2019 15:35:38

LuckyTruck
От: Москва
Зарегистрирован: 2019-03-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

обновление ячеек QtableWidget с помощью ChangeItem.

Значит никто не знает как приручить ChangeItem в QtableWidget&
Жаль…..

Отредактировано LuckyTruck (Март 19, 2019 15:37:10)

Офлайн

#10 Март 19, 2019 15:48:41

LuckyTruck
От: Москва
Зарегистрирован: 2019-03-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

обновление ячеек QtableWidget с помощью ChangeItem.

"Для случаев, когда использование внешней модели избыточно, нужно создавать виджеты, содержащие в наименовании классов Q…Widget. Это экономит время, поскольку модель в этих классах (QTableWidget, QTreeWidget и QListWidget) уже встроена."

А как изменить эту модель? Как обратиться не к виджету, а к модели? И изменится ли данные курсора и базы SQLite соответственно? Или надо будет делать UPDATE?
Я планировал апдейтить только редактируемые записи. Иначе это бегемот будет, а не код.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version