python 从子部件调用父方法
python call parent method from child widget
我正在尝试从子小部件 treeView
调用父方法 printName
但是得到像
这样的错误
- AttributeError: 'QSplitter' 对象没有属性 'printName'
- QObject::startTimer:QTimer 只能用于以 QThread 启动的线程
为什么 parent 指的是 QSplitter?
TreeView
的父级应该是 compositeWidget
,因为 TreeView
是在 compositeWidget
中创建的
代码:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class MainExample(QMainWindow):
def __init__(self, parent=None):
super(MainExample, self).__init__(parent)
self.initUI()
def initUI(self):
self.mainWidget = compositeWidget(self)
self.setCentralWidget(self.mainWidget)
self.mainWidget.treeView.setPath('D:\DATA')
self.setGeometry(300, 300, 300, 200)
class TreeView(QTreeView):
def __init__(self, parent):
super(TreeView, self).__init__(parent)
self.clicked.connect(self.on_treeView_clicked)
@pyqtSlot(QModelIndex)
def on_treeView_clicked(self, index):
indexItem = self.FileSystemModel.index(index.row(), 0, index.parent())
filePath = self.FileSystemModel.filePath(indexItem)
self.parent().printName(filePath)
#
def setPath(self, path):
self.FileSystemModel = QFileSystemModel()
self.FileSystemModel.setFilter(QDir.Dirs | QDir.NoDotAndDotDot)
self.FileSystemModel.setRootPath(path)
self.setModel(self.FileSystemModel)
index = self.FileSystemModel.index(path)
self.setRootIndex(index)
class compositeWidget(QWidget):
def __init__(self, parent):
super(compositeWidget, self).__init__(parent)
self.treeView = TreeView(self)
self.frame = QFrame()
splitterHorizontal = QSplitter(Qt.Horizontal)
splitterHorizontal.addWidget(self.treeView)
splitterHorizontal.addWidget(self.frame)
splitterHorizontal.setSizes([10, 190])
self.layout = QHBoxLayout(self)
self.layout.addWidget(splitterHorizontal)
self.setLayout(self.layout)
def printName(self):
print 'fileName'
def main():
app = QApplication(sys.argv)
ex = MainExample()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
QTreeView 在 QSplitter 下 在 compositeWidget 下。
您需要致电
self.parent().parent().printName(filePath)
不幸的是,这似乎没有记录在案(这似乎有点疏忽),但与 Qt 中的其他 addWidget()
方法(如 QLayout.addWidget()
)一样,QSplitter.addWidget()
方法通过成为其父项来获取子项的所有权。
这就是 Treeview.parent()
返回 QSplitter
的原因。您应该使用另一种方式来访问您想要的父级(例如,明确存储对您传递给构造函数的父级的引用)
class TreeView(QTreeView):
def __init__(self, parent):
super(TreeView, self).__init__(parent)
self.clicked.connect(self.on_treeView_clicked)
self.composite_widget = parent
@pyqtSlot(QModelIndex)
def on_treeView_clicked(self, index):
indexItem = self.FileSystemModel.index(index.row(), 0, index.parent())
filePath = self.FileSystemModel.filePath(indexItem)
self.composite_widget.printName(filePath)
#
def setPath(self, path):
self.FileSystemModel = QFileSystemModel()
self.FileSystemModel.setFilter(QDir.Dirs | QDir.NoDotAndDotDot)
self.FileSystemModel.setRootPath(path)
self.setModel(self.FileSystemModel)
index = self.FileSystemModel.index(path)
self.setRootIndex(index)
我正在尝试从子小部件 treeView
调用父方法 printName
但是得到像
- AttributeError: 'QSplitter' 对象没有属性 'printName'
- QObject::startTimer:QTimer 只能用于以 QThread 启动的线程
为什么 parent 指的是 QSplitter?
TreeView
的父级应该是 compositeWidget
,因为 TreeView
是在 compositeWidget
代码:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class MainExample(QMainWindow):
def __init__(self, parent=None):
super(MainExample, self).__init__(parent)
self.initUI()
def initUI(self):
self.mainWidget = compositeWidget(self)
self.setCentralWidget(self.mainWidget)
self.mainWidget.treeView.setPath('D:\DATA')
self.setGeometry(300, 300, 300, 200)
class TreeView(QTreeView):
def __init__(self, parent):
super(TreeView, self).__init__(parent)
self.clicked.connect(self.on_treeView_clicked)
@pyqtSlot(QModelIndex)
def on_treeView_clicked(self, index):
indexItem = self.FileSystemModel.index(index.row(), 0, index.parent())
filePath = self.FileSystemModel.filePath(indexItem)
self.parent().printName(filePath)
#
def setPath(self, path):
self.FileSystemModel = QFileSystemModel()
self.FileSystemModel.setFilter(QDir.Dirs | QDir.NoDotAndDotDot)
self.FileSystemModel.setRootPath(path)
self.setModel(self.FileSystemModel)
index = self.FileSystemModel.index(path)
self.setRootIndex(index)
class compositeWidget(QWidget):
def __init__(self, parent):
super(compositeWidget, self).__init__(parent)
self.treeView = TreeView(self)
self.frame = QFrame()
splitterHorizontal = QSplitter(Qt.Horizontal)
splitterHorizontal.addWidget(self.treeView)
splitterHorizontal.addWidget(self.frame)
splitterHorizontal.setSizes([10, 190])
self.layout = QHBoxLayout(self)
self.layout.addWidget(splitterHorizontal)
self.setLayout(self.layout)
def printName(self):
print 'fileName'
def main():
app = QApplication(sys.argv)
ex = MainExample()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
QTreeView 在 QSplitter 下 在 compositeWidget 下。 您需要致电
self.parent().parent().printName(filePath)
不幸的是,这似乎没有记录在案(这似乎有点疏忽),但与 Qt 中的其他 addWidget()
方法(如 QLayout.addWidget()
)一样,QSplitter.addWidget()
方法通过成为其父项来获取子项的所有权。
这就是 Treeview.parent()
返回 QSplitter
的原因。您应该使用另一种方式来访问您想要的父级(例如,明确存储对您传递给构造函数的父级的引用)
class TreeView(QTreeView):
def __init__(self, parent):
super(TreeView, self).__init__(parent)
self.clicked.connect(self.on_treeView_clicked)
self.composite_widget = parent
@pyqtSlot(QModelIndex)
def on_treeView_clicked(self, index):
indexItem = self.FileSystemModel.index(index.row(), 0, index.parent())
filePath = self.FileSystemModel.filePath(indexItem)
self.composite_widget.printName(filePath)
#
def setPath(self, path):
self.FileSystemModel = QFileSystemModel()
self.FileSystemModel.setFilter(QDir.Dirs | QDir.NoDotAndDotDot)
self.FileSystemModel.setRootPath(path)
self.setModel(self.FileSystemModel)
index = self.FileSystemModel.index(path)
self.setRootIndex(index)