Qt4 在QTreeView的子项上设置小部件
由于,我能够将小部件添加到Qt4 在QTreeView的子项上设置小部件,qt4,pyqt,qtreeview,qabstractitemmodel,Qt4,Pyqt,Qtreeview,Qabstractitemmodel,由于,我能够将小部件添加到视图顶级项的qabstractemview(在我的示例中)的第二列或更高列 但是是否可以将小部件添加到子项中 以下是我尝试过的部分效果良好的方法: #!/usr/bin/env python import os from PyQt4.QtCore import QModelIndex, Qt from PyQt4.QtGui import QApplication, QItemSelectionModel, \ QPus
视图
顶级项的qabstractemview
(在我的示例中)的第二列或更高列
但是是否可以将小部件添加到子项中
以下是我尝试过的部分效果良好的方法:
#!/usr/bin/env python
import os
from PyQt4.QtCore import QModelIndex, Qt
from PyQt4.QtGui import QApplication, QItemSelectionModel, \
QPushButton, QStandardItem, \
QStandardItemModel, QTreeView
from PyQt4.uic import loadUi
class PrvTreeviewNest(QTreeView):
def __init__(self):
super(PrvTreeviewNest, self).__init__()
loadUi('/home/user/yourproject/resource/treeview_nest.ui')
# row can be 0 even when it's more than 0.
self._datamodel = QStandardItemModel(0, 2)
self.setModel(self._datamodel)
for i in range(4):
self._add_widget(i + 1)
self.show()
def _add_widget(self, n):
std_item = QStandardItem('{}th item'.format(n))
self._datamodel.setItem(n, 0, std_item)
node_widget = QPushButton('{}th button'.format(n))
qindex_widget = self._datamodel.index(n, 1, QModelIndex())
self.setIndexWidget(qindex_widget, node_widget)
if n == 2:
std_item_child = QStandardItem('child')
std_item.appendRow(std_item_child)
node_widget_child = QPushButton('petit button')
qindex_widget_child = self._datamodel.index(n, 1, QModelIndex())
self.setIndexWidget(qindex_widget_child, node_widget_child)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
# window = TreeviewWidgetSelectProve()
window = PrvTreeviewNest()
# window = TreeviewWidgetSelectProve()
window.resize(320, 240)
# window.show();
window.setWindowTitle(
QApplication.translate("toplevel", "Top-level widget"))
# window.add_cols()
sys.exit(app.exec_())
有空
您可以在下图中看到,项子项未显示按钮,其父项的按钮被覆盖。显然,我不知道如何为它编写代码
更新)我想出了如何向孩子们添加小部件的方法。足够棘手的是,使用与索引相结合的方法可以完成这项工作。在上面的示例代码中,将\u add\u widget
替换为以下内容:
def _add_widget(self, n):
item_toplevel = QStandardItem('{}th item'.format(n))
self._datamodel.setItem(n, 0, item_toplevel)
widget_toplevel = QPushButton('{}th button'.format(n))
qindex_toplevel = self._datamodel.index(n, 1, QModelIndex())
self.setIndexWidget(qindex_toplevel, widget_toplevel)
if n == 2:
item_child_col0 = QStandardItem('child col0')
item_child_col1 = QStandardItem('child col1')
#item_toplevel.appendRow(item_child_col0)
item_toplevel.insertRow(0, [item_child_col0, item_child_col1])
widget_child = QPushButton('child widget')
qindex_child = item_child_col1.index()
self.setIndexWidget(qindex_child, widget_child)
我相信这不是最好的/理想的设计方式,但似乎对我很有效。我是受@Phlucious的回答启发而提出的。谢谢
您的错误在这一行:
qindex_widget_child = self._datamodel.index(n, 1, QModelIndex())
self.setIndexWidget(qindex_widget_child, node_widget_child)
它为您提供了模型第2行第1列的索引,这是“第2项”,而不是您的孩子。您的孩子在std\u项目的第1行第1列
。在Qt中,尤其是在QStandardItemModel中,子对象的存储是相对于其父对象的,而不是相对于模型的
我对PyQt不太熟悉,无法给出确切的代码,但您应该能够执行以下操作:
qindex_widget_child = std_item_child.index(QModelIndex())
self.setIndexWidget(qindex_widget_child, node_widget_child)
qindex_widget_child = std_item.child(0, 1).index(QModelIndex())
self.setIndexWidget(qindex_widget_child, node_widget_child)
或者像这样:
qindex_widget_child = std_item_child.index(QModelIndex())
self.setIndexWidget(qindex_widget_child, node_widget_child)
qindex_widget_child = std_item.child(0, 1).index(QModelIndex())
self.setIndexWidget(qindex_widget_child, node_widget_child)
谢谢,我最终选择了你的答案,因为我受到启发,在修改我的问题时想出了一个解决办法。就你的想法而言,不幸的是,两者都不起作用;前者在列0上添加小部件。后者的方法不存在(PyQT主要遵循C++ API)。我再次查看代码,并将第二个选项修改为希望更有效的工作。我有点草率。很高兴你能得到一些有用的东西!你的解决方案或多或少是我在C++中所做的,所以我不会说它是马虎的。我不太清楚是否可以调用child(0,1)函数而不首先在那里分配一个子函数!