gpt4 book ai didi

python - ObjectA.Signal.connect(ObjectB.Slot) 不起作用。我的理解正确吗?

转载 作者:行者123 更新时间:2023-12-01 07:42:04 25 4
gpt4 key购买 nike

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

单击时,向 setRootIndex() 发出数据(QModelIndex)。 enter image description here

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

treeView.clicked.connect(listView.setRootIndex)

这是我的用户界面: enter image description here

代码:

... ...
# 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
... ..

最佳答案

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

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_())

关于python - ObjectA.Signal.connect(ObjectB.Slot) 不起作用。我的理解正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56650268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com