从 PyQT5 检索 QtTableWidget 单元格的内容

2023-11-29

我有一些数据想要在QtTableWidget。我希望能够选择表的特定行,并根据所选行执行函数。专栏并不重要。

这是我正在使用的数据示例

Id | Test name    | Owner | Script source
---|-----------   |-------|--------------
 1 | Login        |  1    | test_login_s
 2 | Logout       |  1    | test_logout_s
 3 | User > Edit  |  1    | test_user_edit_s

以下所有代码均从该行开始执行retranslateUI

self.btnRun.clicked.connect(self.run_selected_test)

最初,我尝试了以下方法:

row = self.tblTable.currentRow()
cell = self.tblTable.itemAt(row, 3).text()

这返回1,单元格位于0,0无论选择哪个单元格。看着QTableWidget类参考我注意到itemAt取两个整数并且returns 0 if the specified point is not covered by an item in the table widget.

接下来,我将代码稍微修改为:

cell = self.tblTable.itemAt(1, 1).text()

这并没有解决问题。


为了进一步测试这一点,我决定检查是否currentRow and currentColumn正在按预期更新。

row = self.tblTable.currentRow()
> 4
> 17

column = self.tblTable.currentColumn()
> 0
> 6

我已经能够像这样创建一个解决方法

    if row == 0:
        do_stuff()
    elif row == 1:
        do_stuff()
    elif row == 2:
        do_stuff()
    elif row == 3:

此方法的问题是有超过 80 行。对于任何大于 5 的值来说,这似乎效率很低。


QTableWidgetItem *QTableWidget::item(int row, int column) const

如果已设置,则返回给定行和列的项目;否则返回 0。

Try it:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui  import *
from PyQt5.QtCore import *

class Example(QMainWindow):
    def __init__(self, data):
        super().__init__()
        self.data = data
        self.cols = len(self.data[0])
        self.row, self.col = 0, 0
        self.cell = []

        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)

        self.label = QLabel(alignment=Qt.AlignCenter)

        self.tableWidget = QTableWidget(0, 4)
        self.tableWidget.setHorizontalHeaderLabels(["Id", "Test name", "Owner", "Script source"])
        self.tableWidget.cellClicked.connect(self.cellClick)
        self.setTableWidget()

        self.btnRun = QPushButton("btnRun")
        self.btnRun.clicked.connect(self.run_selected_test)

        lay = QGridLayout(centralWidget)
        lay.addWidget(self.label, 0, 0)
        lay.addWidget(self.tableWidget, 1, 0)  
        lay.addWidget(self.btnRun, 2, 0) 

    def run_selected_test(self):
        self.cell = []
        for col in range(self.cols):
            self.cell.append(self.tableWidget.item(self.row, col).text())        # <---
        self.label.setText("{}".format(" {}  ; "*self.cols).format(*self.cell))

    def cellClick(self, row, col):
        self.row = row
        self.col = col

    def setTableWidget(self):    
        for r, (_id, _name, _owner, _script) in enumerate(self.data):
            it_id     = QTableWidgetItem(_id)
            it_name   = QTableWidgetItem(_name)
            it_owner  = QTableWidgetItem(_owner)
            it_script = QTableWidgetItem(_script)

            self.tableWidget.insertRow(self.tableWidget.rowCount())
            for c, item in enumerate((it_id, it_name, it_owner, it_script)):
                self.tableWidget.setItem(r, c, item)


data = [("1", "Login",       "1", "test_login_s"), 
        ("2", "Logout",      "1", "test_logout_s"), 
        ("3", "User > Edit", "1", "test_user_edit_s")]

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example(data)
    ex.setGeometry(300, 150, 450, 200)
    ex.show()
    sys.exit(app.exec_())

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 PyQT5 检索 QtTableWidget 单元格的内容 的相关文章

随机推荐