PyQt4 QAbstractListModel - 仅显示第一个数据小部件
PyQt4 QAbstractListModel - Only first data widget is displayed
我正在尝试实施 QAbstractListModel
class 以显示几个类似的小部件。
以下代码显示了我的问题:
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
class Model(QtCore.QAbstractListModel):
def __init__(self, parent=None):
super(QtCore.QAbstractListModel, self).__init__(parent)
self._widgets = []
def headerData(self, section, orientation, role):
""" Returns header for columns """
return "bla"
def rowCount(self, parentIndex=QtCore.QModelIndex()):
""" Returns number of interfaces """
return len(self._widgets)
def data(self, index, role):
""" Returns the data to be displayed """
if role == QtCore.Qt.DisplayRole:
row = index.row()
return self._widgets[row]
def insertRow(self, widget, parentIndex=QtCore.QModelIndex()):
""" Inserts a row into the model """
self.beginInsertRows(parentIndex, 0, 1)
self._widgets.append(widget)
self.endInsertRows()
class Widget(QtGui.QWidget):
def __init__(self, parent=None, name="None"):
super(QtGui.QWidget, self).__init__(parent)
self.layout = QtGui.QHBoxLayout()
self.setLayout(self.layout)
self.checkbox = QtGui.QCheckBox()
self.button = QtGui.QPushButton(self)
self.label = QtGui.QLabel(self)
self.label.setText(name)
self.layout.addWidget(self.checkbox)
self.layout.addWidget(self.button)
self.layout.addWidget(self.label)
class Window(QtGui.QMainWindow):
def __init__(self, parent=None):
super(QtGui.QMainWindow, self).__init__(parent)
self.view = QtGui.QListView(self)
self.model = Model()
self.view.setModel(self.model)
self.setCentralWidget(self.view)
self.model.insertRow(
widget=Widget(self)
)
self.model.insertRow(
widget=Widget(self)
)
self.model.insertRow(
widget=Widget(self)
)
self.model.insertRow(
widget=Widget(self)
)
self.show()
app = QtGui.QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())
有效,列表中有四个可点击条目,但只有其中一个条目实际显示了小部件。这是为什么?
我想这种行为要么是由 data()
引起的,要么是我使用 beginInsertRows()
的方式引起的,但我无法找出错误所在。
ìnsertRow()
函数现在看起来像那样
def insertRow(self, widget, parentIndex=QtCore.QModelIndex()):
""" Inserts a row into the model """
self.beginInsertRows(parentIndex, len(self._widgets), len(self._widgets))
self._widgets.append(widget)
self.endInsertRows()
但是还是不行。
self.beginInsertRows(parentIndex, 0, 1)
0 - 开始
1 - 结束
插入时只刷新第一行
self.beginInsertRows(parentIndex, len(self._widgets), len(self._widgets))
一定是工作。不记得这个方法
self.model.reset()
这会刷新所有列表,没有特定行
实际上,显示了四个小部件。问题是,它们都显示在左上角。如果你在这里输入名称,你可以看到它们重叠,“1”、“2”、“3”、“4”:
修复行号并不能解决问题。小部件将位于正确的行中,但仍将显示在左上角。这是因为 data
应该是 return text for the display role。
要显示简单的小部件,我建议使用 QListWidget
和 setItemWidget 方法。否则你将不得不使用委托。
我正在尝试实施 QAbstractListModel
class 以显示几个类似的小部件。
以下代码显示了我的问题:
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
class Model(QtCore.QAbstractListModel):
def __init__(self, parent=None):
super(QtCore.QAbstractListModel, self).__init__(parent)
self._widgets = []
def headerData(self, section, orientation, role):
""" Returns header for columns """
return "bla"
def rowCount(self, parentIndex=QtCore.QModelIndex()):
""" Returns number of interfaces """
return len(self._widgets)
def data(self, index, role):
""" Returns the data to be displayed """
if role == QtCore.Qt.DisplayRole:
row = index.row()
return self._widgets[row]
def insertRow(self, widget, parentIndex=QtCore.QModelIndex()):
""" Inserts a row into the model """
self.beginInsertRows(parentIndex, 0, 1)
self._widgets.append(widget)
self.endInsertRows()
class Widget(QtGui.QWidget):
def __init__(self, parent=None, name="None"):
super(QtGui.QWidget, self).__init__(parent)
self.layout = QtGui.QHBoxLayout()
self.setLayout(self.layout)
self.checkbox = QtGui.QCheckBox()
self.button = QtGui.QPushButton(self)
self.label = QtGui.QLabel(self)
self.label.setText(name)
self.layout.addWidget(self.checkbox)
self.layout.addWidget(self.button)
self.layout.addWidget(self.label)
class Window(QtGui.QMainWindow):
def __init__(self, parent=None):
super(QtGui.QMainWindow, self).__init__(parent)
self.view = QtGui.QListView(self)
self.model = Model()
self.view.setModel(self.model)
self.setCentralWidget(self.view)
self.model.insertRow(
widget=Widget(self)
)
self.model.insertRow(
widget=Widget(self)
)
self.model.insertRow(
widget=Widget(self)
)
self.model.insertRow(
widget=Widget(self)
)
self.show()
app = QtGui.QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())
有效,列表中有四个可点击条目,但只有其中一个条目实际显示了小部件。这是为什么?
我想这种行为要么是由 data()
引起的,要么是我使用 beginInsertRows()
的方式引起的,但我无法找出错误所在。
ìnsertRow()
函数现在看起来像那样
def insertRow(self, widget, parentIndex=QtCore.QModelIndex()):
""" Inserts a row into the model """
self.beginInsertRows(parentIndex, len(self._widgets), len(self._widgets))
self._widgets.append(widget)
self.endInsertRows()
但是还是不行。
self.beginInsertRows(parentIndex, 0, 1)
0 - 开始 1 - 结束
插入时只刷新第一行
self.beginInsertRows(parentIndex, len(self._widgets), len(self._widgets))
一定是工作。不记得这个方法
self.model.reset()
这会刷新所有列表,没有特定行
实际上,显示了四个小部件。问题是,它们都显示在左上角。如果你在这里输入名称,你可以看到它们重叠,“1”、“2”、“3”、“4”:
修复行号并不能解决问题。小部件将位于正确的行中,但仍将显示在左上角。这是因为 data
应该是 return text for the display role。
要显示简单的小部件,我建议使用 QListWidget
和 setItemWidget 方法。否则你将不得不使用委托。