【问题标题】:Python and PyQt: Get Input from QTableWidget?Python 和 PyQt:从 QTableWidget 获取输入?
【发布时间】:2019-03-31 23:55:41
【问题描述】:

所以,我有一个非常简单的问题: 如何从 QTableWidget 获取输入并将其放入某些列表(第一个列表到第一个列表,第二个列表到第二个列表等等...)?

我已经用谷歌搜索了,但还没有真正找到任何东西......

更新:

其实我是这么想的:

self.tableWidget.cellChanged.connect(self.cellchanged)


def cellchanged(self):
    cur = self.tableWidget.currentColumn()
    cur2 = self.tableWidget.currentRow()
    y = children[cur]
    text = self.tableWidget.currentItem().text()
    y.insert(cur2, text)

但是当我更新表格时出现这个错误(它只是显示,它不会伤害程序):

def updatetable(self):
        self.tableWidget.setRowCount(0)
        self.tableWidget.setRowCount(100)
        r=0
        c=0
        for x in children:
            for i in x:
                newItem = QtGui.QTableWidgetItem(i)
                self.tableWidget.setItem(r, c, newItem)
                r += 1
            r = 0
            c += 1

错误:

  if self.tableWidget.currentItem().text():
AttributeError: 'NoneType' object has no attribute 'text'

更新3:

解决了:

    self.tableWidget.cellChanged.connect(self.cellchanged)


def cellchanged(self):
    cur = self.tableWidget.currentColumn()
    cur2 = self.tableWidget.currentRow()
    y = children[cur]
    self.tableWidget.cellActivated.connect(self.cell) 
def cell(self):
    text = self.tableWidget.currentItem().text()
    y.insert(cur2, text)

【问题讨论】:

  • 你能更具体地说明你想要什么吗?当您说“输入”时,您是指当前选择吗?你的意思是任何时候任意行吗?您是否只需要一组列表小部件来反映表格的活动列?还是您只想将整个数据集转储到每列的列表对象中?
  • 我想要的是,每当我在 QTableWidget 中写入内容以保存到列表中时...我有 15 列和 15 个列表,我希望将第一列中的项目保存在第一个列表,第二列中的项目要保存在第二个列表中,依此类推......顺便说一下,如果项目根据它们的行保存在它们的列表中会很有帮助,以便第一行中的项目在第二行中的项目之前...
  • 那么@reclosedev 给出的答案对你来说效率极低。我不想每次更改表格中的单元格时都必须执行此操作。列表将用于什么用途?列表小部件?还是只是数据?您可能希望监听信号并随着单元格的变化进行更新。
  • 我认为如果你更新你的问题来解释用例(你想要解决的实际问题),你可能会得到一个更好的答案,而不是一些通用的方法。
  • 同意@jdi。另外,看起来QTableWidget 应该替换为QTableViewQStandardItemModel(或其他模型)。

标签: python input pyqt qtablewidget


【解决方案1】:

这是一个如何使用 QTableView 和一组 QListView 对象以及单个 QStandardItemModel 的示例。这种方法的好处是您只需要在一个地方维护数据:模型。视图只是反映模型中的任何内容。

在此示例中,每个列表都设置为查看不同的列。观察更改数据时会发生什么。它到处更新。这是因为模型在其数据发生变化时在内部发出信号。视图只是听模型。如果您不想使用 QListView 而只是想要一些基本的列表数据结构,您可以手动连接到模型发出的信号,并按需更新数据。

from PyQt4 import QtCore, QtGui

class Widget(QtGui.QWidget):

    def __init__(self, *args, **kwargs):
        super(Widget, self).__init__(*args, **kwargs)
        self.resize(800,600)

        self.vlayout = QtGui.QVBoxLayout(self)
        self.table = QtGui.QTableView()
        self.vlayout.addWidget(self.table)

        self.hlayout = QtGui.QHBoxLayout()
        self.list1 = QtGui.QListView()
        self.list2 = QtGui.QListView()
        self.list3 = QtGui.QListView()      
        self.hlayout.addWidget(self.list1)
        self.hlayout.addWidget(self.list2)
        self.hlayout.addWidget(self.list3)

        self.vlayout.addLayout(self.hlayout)

        self.model = QtGui.QStandardItemModel(10,10,self)
        self.table.setModel(self.model)

        self.list1.setModel(self.model)
        self.list1.setModelColumn(0)
        self.list2.setModel(self.model)
        self.list2.setModelColumn(1)
        self.list3.setModel(self.model)
        self.list3.setModelColumn(2)

        self.populateTable()

    def populateTable(self):
        for row in xrange(10):
            for col in xrange(10):
                item = QtGui.QStandardItem('%d-%d' % (row, col))
                self.model.setItem(row, col, item)


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication([])
    window = Widget()
    window.show()
    window.raise_()
    sys.exit(app.exec_())

【讨论】:

  • 谢谢,jdi,但我可能需要一些时间才能检查它,因为我正忙着阅读你告诉我的那本书......
  • 学习愉快!希望我们中的一个人给了你一个体面的答案。如果您需要对此进行更多解释,请告诉我。
  • 感谢您的帮助,jdi... 顺便说一句,我阅读了“学习 Python”中关于类的章节:我在程序中所做的一切都是错误的!!!在我看来,在不了解类的情况下尝试创建 GUI 是非常愚蠢的......
  • 如果这解决了您的问题,请不要忘记接受答案。
  • 这仍然是一个悬而未决的问题还是已解决?我在接受答案时遇到问题,但有关于新问题的后续更新。
【解决方案2】:

您需要遍历表。 QTableWidget 包含rowCount() 行。可以使用item(row, column) 方法访问项目。有关填充它的信息,另请参阅 QListWidget documentation

代码可能如下所示:

def copy_table_column_to_list_widget(table, column, list_widget)
    for row in range(table.rowCount()):
        text = table.item(row, column).text()
        list_widget.addItem(QtGui.QListWidgetItem(text))

copy_table_column_to_list_widget(table, 0, list_widget1)
copy_table_column_to_list_widget(table, 1, list_widget2)
# and so on... or write a loop

更新

def table_to_list(table):
    result = []
    num_rows, num_cols = table.rowCount(), table.columntCount()
    for col in range(num_cols):
        rows = []
        for row in range(num_rows):
            item = table.item(row, col)
            rows.append(item.text() if item else '')
        result.append(rows)
    return result

结果将具有以下格式:

[['11', '12', '13'], ['21', '22', '23']]

【讨论】:

  • 实际上,我输入了一个 Python 列表...它说“AttributeError: 'NoneType' object has no attribute 'text'”...
  • 好像是这样的,因为程序打开的时候那个栏目什么都没有,因为我还没有写任何东西……请问这个问题怎么解决?
  • @Antoni4040,请参阅答案中的更新。现在如果表格单元格为空,结果列表将包含空字符串。
【解决方案3】:

使用 PyQt5 更简单...

self.gui.table_widget.cellChanged.connect(self.cell_changed)

@pyqtSlot()
def cell_changed(self):
    try:
        self.cell = self.gui.table_widget.currentItem()
        self.triggered = self.cell.text()
        print(self.triggered)
    except:
        pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2017-03-21
    相关资源
    最近更新 更多