我是PyQt的新手。
我试图将一个QTableView放在一个类中,所以我可以在类中定义它的行为,而不是将它与所有其他代码混合在一起,但是当我这样做时,它只是赢得了' t show。
这是我从中学习的代码。它来自[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()
如果我删除该课程并使用
table = QTableView()
table.setModel(tablemodel)
表格没有问题。
我错过了什么?
答案 0 :(得分:0)
您将Table
定义为QWidget
,其属性为self.view=QTableView
。
但是您没有在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)
答案 1 :(得分:0)
问题:table.view没有父级。如果您将self.view.show()
添加到Table.initUi()
进行测试,那么您将获得两个小部件,{t {1}}在tmoreau写入时为空表,MyWindow
为孤立小部件。
您可以在table.view
table.view
时传递父级
Table.initUi()
(然后你不需要布局)或将table.view添加到tmoreau编写的布局中,Then the tableview is reparented.
删除类具有相同的效果,然后将tableview添加到布局中。