如何通过在 PyQt5 中按 Enter 键从 QTableView 获取数据

Posted

技术标签:

【中文标题】如何通过在 PyQt5 中按 Enter 键从 QTableView 获取数据【英文标题】:How to get data from QTableView by pressing Enter Key in PyQt5 【发布时间】:2020-07-15 23:40:27 【问题描述】:

我正在使用 PyQt5 制作应用程序并遇到一些麻烦。我想通过按 Enter 键从 QTableView 中选择数据并将其显示在 QLineEdit 中。我已经用 doubleClicked 信号完成了这些事情,但我仍然想通过两种方式向 QLineEdit 显示数据,然后在按下 Enter 键或双击后立即关闭 QTableView 对话框。 这是我的代码:

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_()

还有我的桂:

让我解释一下:当点击按钮时,它会显示一个数据表,然后我想通过按回车键选择表中的数据,然后它将数据显示到 QlineEdit 并关闭表

【问题讨论】:

为了帮助您解决问题,您需要提供您正在使用的 UI,否则您的 MRE 不是 MRE,因为它不会运行。 【参考方案1】:

逻辑是检测按键,例如使用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)

【讨论】:

但在那之后,我想关闭表格数据对话框,只剩下主窗口。我怎样才能做到这一点?你能告诉我如何实现它吗? 我可以问你一个问题吗? @eyllanesc

以上是关于如何通过在 PyQt5 中按 Enter 键从 QTableView 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

在 PyQt5 中按下时如何切换按钮文本

如何检测在 PyQt5 中按下了动态添加的按钮之一? [复制]

如何检测用户何时在输入字段中按 Enter

如何在 keydown 事件后在文本框中按 enter 删除虚拟键盘

在文本框中按 Enter 时如何触发 HTML 按钮?

如何在extjs组合框中按Enter键获取所选结果的值