Как получить данные из QTableView, нажав клавишу ввода в PyQt5 - PullRequest
0 голосов
/ 03 апреля 2020

Я делаю приложение с PyQt5 и сталкиваюсь с некоторыми проблемами. Я хочу выбрать данные из QTableView, нажав клавишу Enter, и отобразить их в QLineEdit. Я сделал это с сигналами doubleClicked, но я все еще хочу отобразить данные в QLineEdit двумя способами, а затем закрыть диалоговое окно QTableView сразу после нажатия клавиши Enter или двойного щелчка. Вот мой код:

import sys 
import os
from PyQt5 import QtCore, QtGui, QtWidgets, uic


class Application(QtWidgets.QMainWindow):
    def __init__(self):
        super(Application, self).__init__()
        self.mainwindow = uic.loadUi('test.ui', self)

        self.mainwindow.pushButton.clicked.connect(self.table)

    def table(self):
        self.table = QtWidgets.QTableView()

        data = [
            [2, 3, 5], 
            [23, 4, 5],
            [2, 6, 7],
            [0, 3, 5]
        ]

        self.model = TableModel(data)
        self.table.setModel(self.model)

        self.table.doubleClicked.connect(self.on_click)

        self.table.show()

    def on_click(self, signal):
        row = signal.row()  # RETRIEVES ROW OF CELL THAT WAS DOUBLE CLICKED
        column = signal.column()  # RETRIEVES COLUMN OF CELL THAT WAS DOUBLE CLICKED
        cell_dict = self.model.itemData(signal)  # RETURNS DICT VALUE OF SIGNAL
        cell_value = cell_dict.get(0)  # RETRIEVE VALUE FROM DICT

        index = signal.sibling(row, 0)
        index_dict = self.model.itemData(index)
        index_value = index_dict.get(0)
        print(
            'Row {}, Column {} clicked - value: {}\n'.format(row, column, cell_value))

        self.mainwindow.lineEdit.setText('%s' %cell_value)

class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        self._data = data

    def data(self, index, role):
        if role == QtCore.Qt.DisplayRole:
            return self._data[index.row()][index.column()]

    def rowCount(self, index):

        return len(self._data)

    def columnCount(self, index):

        return len(self._data[0])

if __name__ == '__main__':
    application = QtWidgets.QApplication(sys.argv)
    window = Application()
    window.show()
    application.exec_()

И мой Gui:

enter image description here

Позвольте мне объяснить немного: при нажатии при нажатии кнопки отображается таблица данных, а затем я хочу выбрать данные в таблице, нажав клавишу ввода, после чего отобразит данные в QlineEdit и закроет таблицу

1 Ответ

3 голосов
/ 03 апреля 2020

Лог c должен обнаружить нажатие клавиши, например, используя eventFilter, а затем получить QModelIndex выбранного элемента:

class Application(QtWidgets.QMainWindow):
    def __init__(self):
        super(Application, self).__init__()
        uic.loadUi("test.ui", self)

        self.pushButton.clicked.connect(self.table)

        self.table = QtWidgets.QTableView()
        self.table.doubleClicked.connect(self.write_text)
        self.table.installEventFilter(self)

    def table(self):
        data = [[2, 3, 5], [23, 4, 5], [2, 6, 7], [0, 3, 5]]
        self.model = TableModel(data)
        self.table.setModel(self.model)
        self.table.show()

    def write_text(self, index):
        row, column, cell_value = index.row(), index.column(), index.data()
        print("Row {}, Column {} clicked - value: {}".format(row, column, cell_value))
        self.lineEdit.setText("%s" % cell_value)
        self.table.close()

    def eventFilter(self, obj, event):
        if obj is self.table and event.type() == QtCore.QEvent.KeyPress:
            if event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
                indexes = self.table.selectedIndexes()
                if indexes:
                    self.write_text(indexes[0])
        return super(Application, self).eventFilter(obj, event)
...