Python PyQt自定义小部件未显示
我是PyQt的新手 我试图在一个类中放置一个QTableView,这样我就可以在类中定义它的行为,而不必将它与所有其他代码混合,但是当我这样做时,它就不会显示出来 这是我学习的代码。它是从[]借来的。READAPT将其稍微调整为与Qt5一起使用,并在类中移动了QTableViewPython 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,
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)