Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 29, 2019 08:02:23

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с таблицей QTableWidget

Доброе утро форумчане. Есть диалоговое окно и в нем таблица. Вопрос такой как на выбранную строку или ячейку сделать событие? То есть мне надо на выбранной строке нажать на Enter и сделать что-то с ней. У таблицы есть сигнал для каждой строки когда бегаем вверх или вниз table.itemSelectionChanged.connect(self.PositionChanged) но это не то,что мне нужно. Какая функция для этого имеется для работы со строками,также потом после этого и будет понятно как редактировать,удалять строку и прочее по горячим клавишам. Можно с помощью этого def keyPressEvent(self, event): но почему то в диалоговом окне он не работает,а в главном окне работает. Диалоговое окно вызываю из другого модуля,там просто функции,без классов и всего прочее.

Офлайн

#2 Ноя. 29, 2019 09:23:06

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с таблицей QTableWidget

С событием решил проблему table.cellClicked.connect(),но она срабатывает по кнопке мыши. Осталось решить как применить это событие к кнопке,чтобы срабатывала по кнопке например Enter?

Офлайн

#3 Ноя. 29, 2019 11:49:08

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Работа с таблицей QTableWidget

Что-нибудь типа cellPressed там разве нет? Если есть, то можно отловить интересующие клавиши.

Отредактировано Rafik (Ноя. 29, 2019 11:54:22)

Офлайн

#4 Ноя. 29, 2019 12:05:50

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с таблицей QTableWidget

cellPressed есть,но не понял как работает. Эффект один и тот же что и table.cellClicked.connect()

Пример table.cellClicked.connect()
что так

 table.cellClicked.connect(test)
def test(row,col):
print(row)
print(col)

что так.Эффект один и тот же. Обе по клику мыши работают или я не понял для чего применяется pressed
 table.cellPressed.connect(test)
def test(row,col):
print(row)
print(col)

По клику мышки только работает. А вот как по кнопке клавиши? Мышку мне вообще надо запретить использовать в таблице.

Есть пример работы cellPressed?

Отредактировано Ser5+ (Ноя. 29, 2019 12:33:44)

Офлайн

#5 Ноя. 29, 2019 13:46:35

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с таблицей QTableWidget

Вроде понял как все делается примерно так Dialog.keyPressEvent = event и переходим к функции event
только без возврата.

То есть не так

 def event(e):
    print('вошли')
    if e.type()== QtCore.QEvent.KeyPress:
        print("Нажата клавиша на клавиатуре")
        print("Код:", e.key(), ", текст:", e.text())
        if e.key() == 16777220:     #Выбор строки по Enter
            print('enter')
        elif e.key() == 16777216:   #Закрытие по кнопке ESC  
            print('exit')
            #self.close()
    return QtWidgets.QDialog.event(e)

А вот так
 def event(e):
    print('вошли')
    if e.type()== QtCore.QEvent.KeyPress:
        print("Нажата клавиша на клавиатуре")
        print("Код:", e.key(), ", текст:", e.text())
        if e.key() == 16777220:     #Выбор строки по Enter
            print('enter')
        elif e.key() == 16777216:   #Закрытие по кнопке ESC  
            print('exit')
            #self.close()

Только вопрос закрыть окно не могу,то есть обратиться обратно к функции не могу чтобы закрыть диалоговое окно.
То есть такой примерно код
 def FASTMENU(**kwargs):
#здесь создаем окно и внутри его таблицу и прочее
Dialog = QtWidgets.QDialog()
table=QtWidgets.QTableWidget(parent=Dialog)
#бла бла и прочее
#потом событие
Dialog.keyPressEvent = event
def event(e):
    print('вошли')
    if e.type()== QtCore.QEvent.KeyPress:
        print("Нажата клавиша на клавиатуре")
        print("Код:", e.key(), ", текст:", e.text())
        if e.key() == 16777220:     #Выбор строки по Enter
            print('enter')
        elif e.key() == 16777216:   #Закрытие по кнопке ESC  
            print('exit')
            self.close()

Вот вопрос как теперь закрыть это диалоговое окно ни self.close() ни Dialog.close() не хочет закрывать,так как понял что нет доступа больше к той функции FASTMENU. Как попытаться закрыть? пробовал еще добавить elif e.type() == QtCore.QEvent.Close: print(“Окно закрыто”) Но он вообще в это условие не заходит. Уточню что тут нету класса и нету init просто две функции. Главное возврат не работает почету-то еще.
Да и наверно это неправильный способ,так как еще значения надо получать

Отредактировано Ser5+ (Ноя. 29, 2019 13:53:15)

Офлайн

#6 Ноя. 29, 2019 14:07:53

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с таблицей QTableWidget

Хотя чтобы закрыть можно глобальную переменную создать.
Как то так.

 def FASTMENU(**kwargs):
     global Dialog
    Dialog = QtWidgets.QDialog()

Но глобальность плохая практика,вот как то возврат надо делать,Только почему то в event return не работает.
Даже элементарно простые не работают
 def event(e):
     й=5
     return й

А можно ли эту функцию event всунуть в родительскую функцию?То есть вложенность функции например так
 def FASTMENU(**kwargs):
     Dialog = QtWidgets.QDialog()
     table=QtWidgets.QTableWidget(parent=Dialog)
    def event(e):
         print('вошли')
         if e.type()== QtCore.QEvent.KeyPress:
              print("Нажата клавиша на клавиатуре")
              print("Код:", e.key(), ", текст:", e.text())
              if e.key() == 16777220:     #Выбор строки по Enter
                  print('enter')
                  rowID = table.currentIndex().row()
                  print(rowID)
             elif e.key() == 16777216:   #Закрытие по кнопке ESC  
                   print('exit')
                   Dialog.close()

Отредактировано Ser5+ (Ноя. 29, 2019 14:21:06)

Офлайн

#7 Ноя. 30, 2019 20:27:09

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с таблицей QTableWidget

Не добился пока до нормального результата. Никто так и не знает как извлекать данные из таблицы(QTableWidget) по нажатию клавиши? То есть по выбранной строке после нажатия запустить какую то функцию и вернуть результат.

Офлайн

#8 Ноя. 30, 2019 23:34:09

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

Работа с таблицей QTableWidget

Ser5+
Никто так и не знает как извлекать данные из таблицы(QTableWidget)
Это устаревший метод работы с таблицами. Нужно разделять по MVC и делать таблицу в виде модели и представления, связанных контроллером. QTableView().



Офлайн

#9 Дек. 2, 2019 12:11:12

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с таблицей QTableWidget

Добрый день. Что-то я не догнал как делать. Пробовал и QTableView() и QListView() Короче проблема не в этих а именно в событиях. Допустим взял список. Испустил сигнал и вошел в event,но странно что возврат не работает. Мне надо узнать по какой строке нажали и вернуть результат(q) обратно в функцию
FASTMENU2. Как раз из за этого проблемы у меня,не могу правильно испустить сигнал и вернуть результат.

 def FASTMENU2(**kwargs):
    #print(*args)
    tek_zag = kwargs.get("zag")
    tek_s = kwargs.get("s")
    #Создаем диалоговое окно
    Dialog = QtWidgets.QDialog()
    Dialog.setWindowTitle(tek_zag)
    Dialog.resize(250,100)
    #Оставим только кнопку закрытия 'х' у диалога, то без кнопки справка 
    Dialog.setWindowFlags(QtCore.Qt.Dialog | QtCore.Qt.WindowCloseButtonHint);
    SPISOK = QtWidgets.QListView(parent=Dialog)
    mod = QtGui.QStandardItemModel(parent=Dialog)
    lst = tek_s
    for row in range(0,len(tek_s)):
        stroka = QtGui.QStandardItem(tek_s[row])
        mod.appendRow([stroka])
    #Запрет на редактирование ячеек
    SPISOK.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
    #Зададим размеры
    Dialog.setFont(QtGui.QFont('Times', 13))
    #сигнал
    q=SPISOK.clicked.connect(event)
    print(q)
    SPISOK.setModel(mod)
    Dialog.exec_()              #Показываем окно
    result=555
    return result
def event(e):
    print('вошли')
    if e.type()== QtCore.QEvent.KeyPress:
        print("Нажата клавиша на клавиатуре")
        print("Код:", e.key(), ", текст:", e.text())
        if e.key() == 16777220:     #Выбор строки по Enter
            print('enter')
##       rowID = table.currentIndex().row()
           #например 
            stroka=1
##       print(rowID)
        elif e.key() == 16777216:   #Закрытие по кнопке ESC  
            print('exit')
            #Dialog.close()
    #return QtWidgets.QWidget.event(e)
    return stroka

Отредактировано Ser5+ (Дек. 2, 2019 12:18:11)

Офлайн

#10 Дек. 2, 2019 15:06:07

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с таблицей QTableWidget

Сделал проще по сигналу для списка,предыдущий код мудреный. Только почему то возврат значения получить не могу из функции vibor, скорее всего неправильно возвращаю после сигнала в функции FASTMENU

 def FASTMENU(**kwargs):
    tek_zag = kwargs.get("zag")
    tek_s = kwargs.get("s")
    #Создаем диалоговое окно
    Dialog = QtWidgets.QDialog()
    Dialog.setWindowTitle(tek_zag)
    Dialog.resize(250,100)
    #Оставим только кнопку закрытия 'х' у диалога, то без кнопки справка 
    Dialog.setWindowFlags(QtCore.Qt.Dialog | QtCore.Qt.WindowCloseButtonHint);
    #Создадим список QListView
    SPISOK = QtWidgets.QListView(parent=Dialog)
    mod = QtGui.QStandardItemModel(parent=Dialog)
    lst = tek_s
    for row in range(0,len(tek_s)):
        stroka = QtGui.QStandardItem(tek_s[row])
        mod.appendRow([stroka])
    #Запрет на редактирование строк
    SPISOK.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
    #Зададим размеры
    Dialog.setFont(QtGui.QFont('Times', 13))
    #сигнал
    #result = SPISOK.clicked.connect(vibor)     #По мышке
    result = SPISOK.activated.connect(vibor)    #По Enter 
    print(result)
    SPISOK.setModel(mod) 
    Dialog.exec_()              #Показываем окно
    return result
def vibor(index):
    res = format(index.data())
    return res

Отредактировано Ser5+ (Дек. 2, 2019 15:06:43)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version