Har*_*ime 9 python tree qt qtreeview
我正在使用Python 2.7和Qt设计器,而且我是MVC的新手:我在Qt中完成了一个View,为我提供了一个目录树列表,以及用于运行的控制器.我的问题是:
给定Qtree视图,如果选择目录,如何获取目录?

代码快照在下面,我怀疑它是SIGNAL(..)虽然我不确定:
class Main(QtGui.QMainWindow):
plot = pyqtSignal()
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# create model
model = QtGui.QFileSystemModel()
model.setRootPath( QtCore.QDir.currentPath() )
# set the model
self.ui.treeView.setModel(model)
**QtCore.QObject.connect(self.ui.treeView, QtCore.SIGNAL('clicked()'), self.test)**
def test(self):
print "hello!"
Run Code Online (Sandbox Code Playgroud)
Ray*_*nda 15
您正在寻找的信号是您的树所拥有的selectionModel所选择的selectionChanged.该信号以所选项作为第一个参数并且取消选择为第二个参数,两者都是QItemSelection的实例.
所以你可能想要改变这一行:
QtCore.QObject.connect(self.ui.treeView, QtCore.SIGNAL('clicked()'), self.test)
Run Code Online (Sandbox Code Playgroud)
至
QtCore.QObject.connect(self.ui.treeView.selectionModel(), QtCore.SIGNAL('selectionChanged()'), self.test)
Run Code Online (Sandbox Code Playgroud)
另外,我建议您使用新的信号和插槽样式.将您的test功能重新定义为:
@QtCore.pyqtSlot("QItemSelection, QItemSelection")
def test(self, selected, deselected):
print("hello!")
print(selected)
print(deselected)
Run Code Online (Sandbox Code Playgroud)
这里有一个有效的例子:
from PyQt4 import QtGui
from PyQt4 import QtCore
class Main(QtGui.QTreeView):
def __init__(self):
QtGui.QTreeView.__init__(self)
model = QtGui.QFileSystemModel()
model.setRootPath( QtCore.QDir.currentPath() )
self.setModel(model)
QtCore.QObject.connect(self.selectionModel(), QtCore.SIGNAL('selectionChanged(QItemSelection, QItemSelection)'), self.test)
@QtCore.pyqtSlot("QItemSelection, QItemSelection")
def test(self, selected, deselected):
print("hello!")
print(selected)
print(deselected)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = Main()
w.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
在PyQt5中有点不同(感谢Carel和saldenisov的评论和aswer.)
...当PyQt从4变为5时,连接从一个对象方法移动到一个作用于该属性的方法
所以相反已知的:
QtCore.QObject.connect(self.ui.treeView, QtCore.SIGNAL('clicked()'), self.test)
Run Code Online (Sandbox Code Playgroud)
现在你写:
class Main(QTreeView):
def __init__(self):
# ...
self.setModel(model)
self.doubleClicked.connect(self.test) # Note that the the signal is now a attribute of the widget.
Run Code Online (Sandbox Code Playgroud)
这是使用PyQt5的示例(由saldenisov提供).
from PyQt5.QtWidgets import QTreeView,QFileSystemModel,QApplication
class Main(QTreeView):
def __init__(self):
QTreeView.__init__(self)
model = QFileSystemModel()
model.setRootPath('C:\\')
self.setModel(model)
self.doubleClicked.connect(self.test)
def test(self, signal):
file_path=self.model().filePath(signal)
print(file_path)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = Main()
w.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
在 PyQt5 中,它可以通过这种方式完成:
from PyQt5.QtWidgets import QTreeView,QFileSystemModel,QApplication
class Main(QTreeView):
def __init__(self):
QTreeView.__init__(self)
model = QFileSystemModel()
model.setRootPath('C:\\')
self.setModel(model)
self.doubleClicked.connect(self.test)
def test(self, signal):
file_path=self.model().filePath(signal)
print(file_path)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = Main()
w.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27378 次 |
| 最近记录: |