【问题标题】:Data Not Showing up in Table数据未显示在表格中
【发布时间】:2019-09-13 21:41:25
【问题描述】:

我正在尝试遵循创建位于此处的表的示例: https://pythonbasics.org/pyqt-table/

完全承认,我是 python 新手,这对我来说有点陌生。

我已编辑我的字典以匹配我的数据,但是当我的计算机上填充该表时,这些值是空白的。

我不知道我哪里出错了。

任何帮助将不胜感激。

以下代码片段:

wb = xlrd.open_workbook(loc)  
sheet = wb.sheet_by_index(0)
x = []
labels = []
for i in range(sheet.nrows-3): 
   print(sheet.row_values(i+3)) 
   x.append(sheet.row_values(i+3))
   labels.append(str(x[i][0])+" "+str(x[i][1]))


z={}
keypieces = range(len(x))
#Making the Z dictionary
for i in keypieces: 
    z[labels[i]] = x[i][4:7]

class TableView(QTableWidget):
def __init__(self, z, *args):
    QTableWidget.__init__(self, *args)
    self.z = z
    self.setz()
    self.resizeColumnsToContents()
    self.resizeRowsToContents()

def setz(self): 
    horHeaders = []
    for n, key in enumerate(sorted(self.z.keys())):
        horHeaders.append(key)
        for m, item in enumerate(self.z[key]):
            newitem = QTableWidgetItem(item)
            self.setItem(m, n, newitem)
    self.setHorizontalHeaderLabels(horHeaders)

def main(args):
    app = QApplication(args)
    table = TableView(z, 3, 6)
    table.show()
    sys.exit(app.exec_())

if __name__=="__main__":
    main(sys.argv)

我的 z 字典如下:

{'LEVEL 6 S1': [24.4999999999989, 5.00000000000394, 1.5],
 'LEVEL 5 S1': [25.4999999999992, 4.99999999999996, 1.5],
 'LEVEL 4 S1': [25.4999999999992, 4.99999999999996, 1.5],
 'LEVEL 3 S1': [25.4999999999992, 3.41666666666662, 1.5],
 'LEVEL 2 S1': [25.4999999999992, 3.91666666666663, 3.0],
 'LEVEL 1 S1': [25.4999999999992, 4.99999999999996, 1.33333333333333]}

我的表格看起来像这样(红色是我希望表格看起来的一个例子):

【问题讨论】:

    标签: python pyqt pyqt5 qtablewidget


    【解决方案1】:

    主要的错误是 QTableWidgetItem 只支持字符串,另一方面你用来访问信息的方法是多余的。他们认为上述解决方案是:

    def setz(self):
        horHeaders = []
        for j, (key, values) in enumerate(sorted(self.z.items())):
            horHeaders.append(key)
            for i, value in enumerate(values):
                newitem = QTableWidgetItem(str(value))
                # or
                # newitem = QTableWidgetItem()
                # newitem.setData(Qt.DisplayRole, value)
                self.setItem(i, j, newitem)
        self.setHorizontalHeaderLabels(horHeaders)
    

    更新:

    如果你想支持数值和字符串,你必须使用角色(Qt::DisplayRole 或 Qt::UserRole):

    import sys
    from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem
    from PyQt5.QtCore import Qt
    
    
    class TableView(QTableWidget):
        def __init__(self, z, *args):
            super(TableView, self).__init__(*args)
            self.z = z
            self.setz()
            self.resizeColumnsToContents()
            self.resizeRowsToContents()
    
        def setz(self):
            horHeaders = []
            for j, (key, values) in enumerate(sorted(self.z.items())):
                horHeaders.append(key)
                for i, value in enumerate(values):
                    newitem = QTableWidgetItem()
                    newitem.setData(Qt.EditRole, value)
                    self.setItem(i, j, newitem)
            self.setHorizontalHeaderLabels(horHeaders)
    
    
    def main(args):
    
        z = {
            "LEVEL 6 S1": [24.4999999999989, 5.00000000000394, 1.5],
            "LEVEL 5 S1": [25.4999999999992, 4.99999999999996, 1.5],
            "LEVEL 4 S1": [25.4999999999992, 4.99999999999996, 1.5],
            "LEVEL 3 S1": [25.4999999999992, 3.41666666666662, 1.5],
            "LEVEL 2 S1": [25.4999999999992, 3.91666666666663, 3.0],
            "LEVEL 1 S1": [25.4999999999992, 4.99999999999996, 1.33333333333333],
        }
    
        app = QApplication(args)
        table = TableView(z, 3, 6)
        table.show()
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main(sys.argv)
    

    如果您希望强制所有创建的列默认支持浮动值,那么您必须在委托中设置适当的编辑器,例如 QDoubleSpinBox

    import sys
    from PyQt5.QtWidgets import (
        QApplication,
        QDoubleSpinBox,
        QStyledItemDelegate,
        QTableWidget,
        QTableWidgetItem,
    )
    from PyQt5.QtCore import Qt
    
    
    class Delegate(QStyledItemDelegate):
        def createEditor(self, parent, option, index):
            DBL_MAX = 1.7976931348623157e308
            editor = QDoubleSpinBox(parent, minimum=-DBL_MAX, maximum=DBL_MAX, decimals=323)
            return editor
    
    
    class TableView(QTableWidget):
        def __init__(self, z, *args):
            super(TableView, self).__init__(*args)
            self.z = z
            self.setz()
            self.resizeColumnsToContents()
            self.resizeRowsToContents()
    
            delegate = Delegate(self)
            self.setItemDelegate(delegate)
    
        def setz(self):
            horHeaders = []
            for j, (key, values) in enumerate(sorted(self.z.items())):
                horHeaders.append(key)
                for i, value in enumerate(values):
                    newitem = QTableWidgetItem()
                    newitem.setData(Qt.EditRole, value)
                    self.setItem(i, j, newitem)
            self.setHorizontalHeaderLabels(horHeaders)
    
    
    def main(args):
    
        z = {
            "LEVEL 6 S1": [24.4999999999989, 5.00000000000394, 1.5],
            "LEVEL 5 S1": [25.4999999999992, 4.99999999999996, 1.5],
            "LEVEL 4 S1": [25.4999999999992, 4.99999999999996, 1.5],
            "LEVEL 3 S1": [25.4999999999992, 3.41666666666662, 1.5],
            "LEVEL 2 S1": [25.4999999999992, 3.91666666666663, 3.0],
            "LEVEL 1 S1": [25.4999999999992, 4.99999999999996, 1.33333333333333],
        }
    
        app = QApplication(args)
        table = TableView(z, 3, 6)
        table.show()
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main(sys.argv)
    

    【讨论】:

    • 谢谢 eylllanesc。我的最终目标是我想在第 3 行下方添加一个额外的行,并让它提示用户输入数字。不确定我是否喜欢只能接受字符串的想法。你知道 tkinter 在接受数字和整数方面是否比 pyqt 更好吗?我还需要研究表单填写后如何与用户输入数据进行交互。
    • @Retug 1) 您希望所有项目都支持数值吗? 2) tkinter 和 pyqt 之间的选择是非常主观的,因为两者具有相同的潜力但方式不同,所以我不会回答这个问题。
    • 我很想同时支持字符串和数值(如果我期望一个字符串并且提供了一个数字,甚至告诉用户他们输入了错误的数据)。
    • 谢谢。您在从表单中获取用户输入并在用户输入上做更多工作方面是否有很多经验(就像我在之前的文章中提到的想要添加空白行 4)?我见过的几个例子是从 pyqt4 时代写的,希望能有一个很好的例子,提示用户在表单中输入,然后在代码中对用户输入数据做更多的工作。
    • @Retug 1) 这些问题不应涉及人们的能力,因为它与 SO 无关,所以我将避免回答这个问题。 2)新行应该允许什么类型的数据:字符串还是浮点数?,一个表单限制用户应该提供什么类型的数据,所以你必须清楚地指出新行应该有什么类型的数据。 3)另一方面,PyQt4 和 PyQt5 之间的许多兼容的东西,你也应该检查 SO 的 Q/A,因为有成千上万的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    相关资源
    最近更新 更多