关于 QTreeView 中项目和信号的信息 - PyQt5

Info about items and signal in QTreeView - PyQt5

QTreeView中有行,每行有两列。 第一列是名称,第二列是预览。

问题:

  1. 如何获得点击行信号?如果通过单击鼠标选择行,如何获取信号?我现在用的是QTreeView.doubleClicked.connect(),请问有什么办法吗?

  2. 我跟进第一个问题。如果我通过单击第二列中的项目来选择如何从第一列中获取项目名称? (如果无法通过单击鼠标执行操作,QTreeView.doubleClicked.connect()如何执行?)

  3. 如何获取项目的类别、子类别、行、列的信息?

感谢提示和帮助。

代码预览:

  1. QTreeView
self.tree = QtWidgets.QTreeView()
self.model = QtGui.QStandardItemModel(self.tree)
self.tree.setDragEnabled(True)
self.tree.doubleClicked.connect(self.getValue)
  1. 正在填充 QTreeView
self.model.setHorizontalHeaderLabels(('Category / Subcategories / Name', 'Preview'))
self.tree.setModel(self.model)
self.tree.setColumnWidth(0, 200)
#root = self.tree.rootIndex()
for row, (keys, vals) in enumerate(self.dataStatObj.items()):
    if row == 0:
        kategorie = keys[0]
        podkategorie = keys[1]
        categoryTV = QtGui.QStandardItem(keys[0])
        subcategoriesTV = QtGui.QStandardItem(keys[1])
        self.model.appendRow(categoryTV)
        for iimg in listImagesNameSuffix:
            if iimg[1] == keys[2]:
                print(iimg[1])
                print(keys[2])
                imgName = iimg[0]
        imgTV = StandardItemObr()
        imgTV.setIcon(QtGui.QIcon(pathToImages + imgName))
        imgTV.setEditable(False)
        nameImgTV = QStandardItem(keys[2])
        nameImgTV.setEditable(False)
        categoryTV.appendRow(subcategoriesTV)
        categoryTV.setEditable(False)
        subcategoriesTV.appendRow([nameImgTV, imgTV])
        subcategoriesTV.setEditable(False)
    ...
    ...
        
self.tree.expandAll()
self.tree.setIconSize(QtCore.QSize(100, 100))
  1. getValue (self.tree.doubleClicked.connect(self.getValue))
def getValue(self, val):
    print(val.data(), 'If I click on the first column, the text will appear.'
                      ' When I click on the second column I need to return the same as for the first column ')
    if val.data() is None:
        print('None')
        print(val.parent(), "PARENT")
  1. 预览

QTreeView 与其他视图(如 QListView 或 QTableView)一样,继承自 QAbstractItemView, and if you look at the Signals section you'll see that there are other signals other than doubleClicked. What you need, obviously, is the clicked 信号。

该信号与大多数其他信号一样,returns 模型索引 (一个 QModelIndex 实例)已被单击,这是一个 object,用于在模型中定位数据,包括其“坐标”:行、列和 parent(最后一个是树模型的基础)。

QModelIndex class 具有各种方便的函数,可以轻松访问与模型的关系:

  • data(),您已经在使用,returns 与模型中特定索引关联的值;它实际上是 model.data(index, role);
  • 的“捷径”
  • parent() 很好解释;与 model.parent(index);
  • 相同
  • sibling(), returns 指定行或列的索引与给定行或列共享相同的 parent;与 model.sibling(row, column, index);
  • 相同

综上所述,如果想获取点击后第一列的数据,需要将函数连接到clicked信号;然后,为了获得任何可能的信息 parent,您可以使用基本的递归函数:

def getValue(self, index):
    if index.column():
        index = index.sibling(index.row(), 0)
        # since Qt 5.11 you can use `index.siblingAtColumn(0)`

    def getValueRecursive(index):
        info = ['"{}" (row {}, col {})'.format(
            index.data(), index.row(), index.column())]
        if index.parent().isValid():
            info.extend(getValueRecursive(index.parent()))
        return info

    print('Index clicked!')
    for indexInfo in reversed(getValueRecursive(index)):
        print(indexInfo)

请注意,clicked 信号显然只适用于 鼠标点击 :如果使用键盘更改当前索引,则不会发出,因此您应该更好地使用 selectionModel of the view and use the selectionChanged or currentChanged 信号。

我强烈建议您仔细耐心地研究您正在使用的classes,包括继承的;例如,如果您正在使用 QTreeView,您应该考虑研究所有关于以下内容的文档:QAbstractItemViewQAbstractScrollAreaQFrameQWidget 最后是 QObject;由于您使用的是模型,因此您还需要了解有关 QModelIndexQAbstractItemModel 的更多信息,并阅读有关 model/view 框架的文档.