PyQt自定义小部件未显示

3

我是PyQt的新手。

我试图将QTableView放在一个类中,以便我可以在类中定义它的行为,而不会把它与所有其他代码混合在一起,但当我这样做时,它就无法显示。

以下是我正在学习的代码。它是从[Edit table in pyqt using QAbstractTableModel]借来的。稍微改编以适用于Qt5并将QTableView移动到一个类中。

import sys
from PyQt5 import QtGui, QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication, QVBoxLayout, QTableView, QWidget
from PyQt5.QtCore import *

# données à représenter
my_array = [['00','01','02'],
            ['10','11','12'],
            ['20','21','22']]

def main():
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

# création de la vue et du conteneur
class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        tablemodel = MyTableModel(my_array, self)
        table = Table(tablemodel)

        layout = QVBoxLayout(self)
        layout.addWidget(table)
        self.setLayout(layout)

# création du modèle

class Table(QWidget):
    def __init__(self, model):
        super().__init__()
        self.model = model
        self.initUI()

    def initUI(self):
        self.setMinimumSize(300,300)
        self.view = QTableView()
        self.view.setModel(self.model)


class MyTableModel(QAbstractTableModel):
    def __init__(self, datain, parent = None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.arraydata = datain

    def rowCount(self, parent):
        return len(self.arraydata)

    def columnCount(self, parent):
        return len(self.arraydata[0])

    def data(self, index, role):
        if not index.isValid():
            return None
        elif role != Qt.DisplayRole:
            return None
        return (self.arraydata[index.row()][index.column()])

    """
    def setData(self, index, value):
        self.arraydata[index.row()][index.column()] = value
        return True
    def flags(self, index):
        return Qt.ItemIsEditable
    """    

if __name__ == "__main__":
    main()

如果我移除这个 class 并使用

table = QTableView()
table.setModel(tablemodel)
表格显示没有问题。

我错过了什么?


你尝试过直接返回“self.arraydata[row][column]”这个数据而不是返回一个元组吗? - Fabio Menegazzo
相同的结果。没有任何小部件显示。我只看到一个空白窗口。没有网格,没有标题。它是300x300,由setMinimumSize(300,300)定义。 - torels
2个回答

2
你将Table定义为一个带有属性self.view=QTableViewQWidget。 但是你没有为Table定义布局,因此它将显示为空白小部件。
你需要为Table定义一个布局,并将视图添加到其中,或直接将视图添加到主窗口的布局中:
class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        tablemodel = MyTableModel(my_array, self)
        table = Table(tablemodel)

        layout = QVBoxLayout(self)
        layout.addWidget(table.view)  #add view instead of table
        self.setLayout(layout)

第三种方法是更改Table的定义: 您可以子类化QTableView而不是QWidget(未测试代码):
class Table(QTableView):
    def __init__(self, model, parent):
        super(Table,self).__init__(parent)
        self.setMinimumSize(300,300)
        self.setModel(model) 

谢谢。我现在看到错误了,而且真的很愚蠢。我真是太丢人了!哈哈 - torels

2
问题:表格视图没有父级。如果您将self.view.show()添加到测试中Table.initUi(),您将获得两个小部件,一个带有空表的MyWindow,并且table.view作为孤立的小部件。
Table.initUi()中构造table.view时,您可以传递父级。
self.view = QTableView(self) 

如果您不需要布局,则无需添加表格视图或将table.view添加到布局中,如tmoreau所写,然后tableview将被重新父级化。

删除该类具有相同的效果,然后将tableview添加到布局中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接