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_函数 例:ob_start();用法

OB3635/OB2530PAP/OB3398昂宝电子设计

实现静态化

php #ob_start #ob_clean #ob_end_clean

php函数ob_start()ob_end_clean()ob_get_contents()

php关于ob_start('ob_gzhandler')启用GZIP压缩的bug