【问题标题】:how to get the pyqt qtreeview item child using double click event?如何使用双击事件获取 pyqt qtreeview 项目子项?
【发布时间】:2015-04-16 15:59:43
【问题描述】:

我正在使用 PyQt4 和 python 2.7.9。我有一个包含来自 Oracle 数据库的数据的 QTreeView。代码是这样的:

model = QStandardItemModel(0,1)
self.treeMedia.setModel(model)
for rowalb in self.SELECT_TREE_ALBUM(codus):
    nodeItem = QStandardItem(str(rowalb[1]).decode('utf-8'))
    for rowph in self.SELECT_TREE_PHOTO(int(rowalb[0])):
        childItem = QStandardItem(str(rowph[0]))
        childItem.setEditable(False)
        nodeItem.insertRows(0, [childItem])
    nodeItem.setEditable(False)
    model.appendRow(nodeItem)
model.setHorizontalHeaderLabels(['Data'])

SELECT_TREE_ALBUM(codus是专辑所有者的id)和SELECT_TREE_PHOTO是从数据库返回数据的函数。rowalb1是专辑的名字,rowalb[0]是ID,rowalb[0 ] 用于获取此相册的照片。图片显示此视图:

我想使用双击事件获取 childItem 数据(例如 1491475964461012、1491475821127693、1491475631127712、1491475141127761 或 1480407552234520)。我尝试将这些代码放入构造函数中:

self.treeMedia.doubleClicked.connect(self.treeMedia_doubleClicked)

然后我添加了函数:

def treeMedia_doubleClicked(self,index):
    item = self.treeMedia.model().item(index.row(),index.column())
    strData = item.data(0).toPyObject()
    #self.treeMedia.currentIndex()
    print('' + str(strData))

但有时我会看到 nodeItem 信息(例如“terror”或“fotos de perfil”)和其他一些我收到此错误:“AttributeError: 'NoneType' object has no attribute 'data'”。可能是什么问题?是填写 qtreeview 的问题吗?还是使用索引时双击事件功能的问题?请帮我。提前致谢。

【问题讨论】:

    标签: python-2.7 pyqt4 qtreeview qstandarditemmodel qstandarditem


    【解决方案1】:

    如果有人在寻找答案。

    def treeMedia_doubleClicked(self,index):
        item = self.treeView.selectedIndexes()[0]
        print item.model().itemFromIndex(index).text()
    

    【讨论】:

    • 非常感谢 没关系。我一直在寻找解决方案
    • 这可能不是正确的解决方案,例如考虑多选的情况,必须有一种使用索引的方法。
    • 这是获取模型的一种奇怪且不必要的方法!您从树视图开始,然后获取第一个选定项目的 QModelIndex 并在其上调用 model()。这是毫无意义的间接,甚至可能没有任何选定的项目(尽管双击时这很棘手),在这种情况下它会崩溃。你可以只使用self.treeview.model(),甚至index.model()index 也已经是QModelIndex!)。
    • @JKAbrams 它确实使用index 进行索引,selectedIndices()[0] 只是让模型索引到(尽管不是最好的方法)。
    【解决方案2】:

    我意识到这有点断章取义,但在这里为任何其他路人发帖......

    在 pyside6 中这些都可以工作

    def treeMedia_doubleClicked(self, index):
        print(self.name_of_model.filePath(index))
    

    def treeMedia_doubleClicked(self, index):
        print(index.model().filePath(index))
    

    【讨论】:

      猜你喜欢
      • 2018-04-06
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多