Table 中未显示数据

Data Not Showing up in Table

我正在尝试按照创建位于此处的 table 的示例进行操作: https://pythonbasics.org/pyqt-table/

完全录取,我是python的新手,这对我来说有点陌生。

我已经编辑了我的字典来匹配我的数据,但是当 table 在我的计算机上填充时,值是空白的。

我不知道哪里出错了。

如有任何帮助,我们将不胜感激。

下面的代码片段:

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]}

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

主要错误是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)