Python PyQt自定义小部件未显示

Python PyQt自定义小部件未显示,python,qt,widget,pyqt5,Python,Qt,Widget,Pyqt5,我是PyQt的新手 我试图在一个类中放置一个QTableView,这样我就可以在类中定义它的行为,而不必将它与所有其他代码混合,但是当我这样做时,它就不会显示出来 这是我学习的代码。它是从[]借来的。READAPT将其稍微调整为与Qt5一起使用,并在类中移动了QTableView import sys from PyQt5 import QtGui, QtCore from PyQt5.QtGui import * from PyQt5.QtWidgets import QMainWindow,

我是PyQt的新手

我试图在一个类中放置一个QTableView,这样我就可以在类中定义它的行为,而不必将它与所有其他代码混合,但是当我这样做时,它就不会显示出来

这是我学习的代码。它是从[]借来的。READAPT将其稍微调整为与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()
如果我删除该类并使用

table = QTableView()
table.setModel(tablemodel)
这张表显示没有问题


我缺少什么?

您将
表定义为具有属性
self.view=QTableView
QWidget
。 但是您没有在
上定义布局,因此它将显示为一个空小部件

您必须为
表定义布局,并将视图添加到其中,或者直接将视图添加到主窗口的布局中:

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)
第三种方法是更改
表的定义
:您可以将
QTableView
子类化,而不是
QWidget
(代码未测试):


问题:table.view没有父级。如果您添加
self.view.show()
来测试
Table.initUi()
,您将得到两个小部件,
MyWindow
,其中空表为tmoreau编写的,而
Table.view
为独立的小部件

table.initUi()

(这样就不需要布局)或将table.view添加到由tmoreau编写的布局中


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

是否尝试在不使用
元组的情况下返回数据(直接返回
self.arraydata[row][column]
)?结果相同。没有小部件显示。我只是看到一个空白的窗口。没有网格,没有标题。它是setMinimumSize(300300)定义的300x300,谢谢。我现在看到了错误,这真的很愚蠢。我真丢脸!哈哈
class Table(QTableView):
    def __init__(self, model, parent):
        super(Table,self).__init__(parent)
        self.setMinimumSize(300,300)
        self.setModel(model) 
self.view = QTableView(self)