首页 > 解决方案 > ObjectA.Signal.connect(ObjectB.Slot) 不工作。我的理解正确吗?

问题描述

这是我对Signal和Slot的理解,对吗?

单击时,向 setRootIndex() 发出数据(QModelIndex)。 在此处输入图像描述

如果正确。那么为什么这段代码不起作用?

treeView.clicked.connect(listView.setRootIndex)

这是我的用户界面: 在此处输入图像描述

代码:

... ...
# model
treeModel=QtWidgets.QFileSystemModel()
listModel=QtWidgets.QFileSystemModel()
treeModel.setRootPath(PATH1)
listModel.setRootPath(PATH2)

# fill data
treeView.setModel(treeModel)
treeView.setRootIndex(treeModel.index(PATH1))
listView.setModel(listModel)
listView.setRootIndex(listModel.index(PATH2))

# connect
treeView.clicked.connect(listView.setRootIndex)

# show window
... ..

标签: pythonpyqt5pyside2qfilesystemmodel

解决方案


执行代码时,您会收到以下消息:

QAbstractItemView::setRootIndex failed : index must be from the currently set model

该消息为我们提供了一个重要线索,QModelIndex 属于一个模型,因此尽管它具有来自另一个模型的另一个 QModelIndex 的相同数据,但它们并不相同。

有两种可能的解决方案:

  • 仅使用一种模型
import os
from PyQt5 import QtCore, QtGui, QtWidgets

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    model = QtWidgets.QFileSystemModel()
    model.setRootPath(QtCore.QDir.rootPath())

    treeView = QtWidgets.QTreeView()
    treeView.setModel(model)
    treeView.setRootIndex(model.index(QtCore.QDir.homePath()))

    listView = QtWidgets.QListView()
    listView.setModel(model)
    listView.setRootIndex(model.index(QtCore.QDir.homePath()))

    treeView.clicked.connect(listView.setRootIndex)

    w = QtWidgets.QWidget()
    hlay = QtWidgets.QHBoxLayout(w)
    hlay.addWidget(treeView)
    hlay.addWidget(listView)
    w.show()

    sys.exit(app.exec_())
  • 使用初始模型的 QModelIndex 信息获取另一个模型的 QModelIndex:
import os
from PyQt5 import QtCore, QtGui, QtWidgets

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    dirModel = QtWidgets.QFileSystemModel()
    dirModel.setRootPath(QtCore.QDir.rootPath())
    dirModel.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Dirs)

    listModel = QtWidgets.QFileSystemModel()
    listModel.setRootPath(QtCore.QDir.rootPath())

    treeView = QtWidgets.QTreeView()
    treeView.setModel(dirModel)
    treeView.setRootIndex(dirModel.index(QtCore.QDir.homePath()))

    listView = QtWidgets.QListView()
    listView.setModel(listModel)
    listView.setRootIndex(listModel.index(QtCore.QDir.homePath()))

    treeView.clicked.connect(
        lambda ix: listView.setRootIndex(
            listModel.index(ix.data(QtWidgets.QFileSystemModel.FilePathRole))
        )
    )

    w = QtWidgets.QWidget()
    hlay = QtWidgets.QHBoxLayout(w)
    hlay.addWidget(treeView)
    hlay.addWidget(listView)
    w.show()

    sys.exit(app.exec_())

推荐阅读