Форум сайта python.su
Доброе утро форумчане. Есть диалоговое окно и в нем таблица. Вопрос такой как на выбранную строку или ячейку сделать событие? То есть мне надо на выбранной строке нажать на Enter и сделать что-то с ней. У таблицы есть сигнал для каждой строки когда бегаем вверх или вниз table.itemSelectionChanged.connect(self.PositionChanged) но это не то,что мне нужно. Какая функция для этого имеется для работы со строками,также потом после этого и будет понятно как редактировать,удалять строку и прочее по горячим клавишам. Можно с помощью этого def keyPressEvent(self, event): но почему то в диалоговом окне он не работает,а в главном окне работает. Диалоговое окно вызываю из другого модуля,там просто функции,без классов и всего прочее.
Офлайн
С событием решил проблему table.cellClicked.connect(),но она срабатывает по кнопке мыши. Осталось решить как применить это событие к кнопке,чтобы срабатывала по кнопке например Enter?
Офлайн
Что-нибудь типа cellPressed там разве нет? Если есть, то можно отловить интересующие клавиши.
Отредактировано Rafik (Ноя. 29, 2019 11:54:22)
Офлайн
cellPressed есть,но не понял как работает. Эффект один и тот же что и table.cellClicked.connect()
Пример table.cellClicked.connect()
что так
table.cellClicked.connect(test) def test(row,col): print(row) print(col)
table.cellPressed.connect(test) def test(row,col): print(row) print(col)
Отредактировано Ser5+ (Ноя. 29, 2019 12:33:44)
Офлайн
Вроде понял как все делается примерно так 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()
Отредактировано Ser5+ (Ноя. 29, 2019 13:53:15)
Офлайн
Хотя чтобы закрыть можно глобальную переменную создать.
Как то так.
def FASTMENU(**kwargs): global Dialog Dialog = QtWidgets.QDialog()
def event(e): й=5 return й
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)
Офлайн
Не добился пока до нормального результата. Никто так и не знает как извлекать данные из таблицы(QTableWidget) по нажатию клавиши? То есть по выбранной строке после нажатия запустить какую то функцию и вернуть результат.
Офлайн
Ser5+Это устаревший метод работы с таблицами. Нужно разделять по MVC и делать таблицу в виде модели и представления, связанных контроллером. QTableView().
Никто так и не знает как извлекать данные из таблицы(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)
Офлайн
Сделал проще по сигналу для списка,предыдущий код мудреный. Только почему то возврат значения получить не могу из функции 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)
Офлайн