ObjectA.Signal.connect(ObjectB.Slot) 不工作。我的理解正确吗?
Posted
技术标签:
【中文标题】ObjectA.Signal.connect(ObjectB.Slot) 不工作。我的理解正确吗?【英文标题】:ObjectA.Signal.connect(ObjectB.Slot) not working. is my understanding correct? 【发布时间】:2019-06-18 13:26:44 【问题描述】:这是我对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
... ..
【问题讨论】:
【参考方案1】:当您执行代码时,您会收到以下消息:
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_())
【讨论】:
以上是关于ObjectA.Signal.connect(ObjectB.Slot) 不工作。我的理解正确吗?的主要内容,如果未能解决你的问题,请参考以下文章
php #ob_start #ob_clean #ob_end_clean