2014-10-28 40 views
0

我目前正在为我的PyQt GUI实现模型视图体系结构。这是目前我的代码更简单但代表性的版本。PyQt,当按下按钮连接到不同类的方法时,代码永远不会退出__init__

class Model(QtGui.QWidget): 
    def __init__(self): 
     super(Model, self).__init__() 
     self.openDir = '/some/file/dir/' 
    def openFile(self): 
     openFileName = QtGui.QFileDialog.getOpenFileName(None, "Open File",self.openDir,"AllFiles(*.*)") 
     openFile = open(openFileName, 'r') 
     ... 

class View(QtGui.QWidget): 
    def__init__(self): 
    super(View, self).__init__() 
    ... 
    self.button = QtGui.QPushButton("Open") 
    ... 
    self.button.clicked.connect(Model().openFile) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    mainWindow = View() 
    mainWindow.show() 
    sys.exit(app.exec_()) 

所以,当我点击“打开”按钮,我想打电话给ModelopenFile方法,但是当我做单击它,它进入Model.__init__但它从来没有真正进入openFile方法。我需要解决什么问题?


编辑1:修正了所有错误。


编辑2:对于那些面临类似问题的人,这里是Fred S提供的解决方案和固定代码。

class Model(QtGui.QWidget): 
    def __init__(self): 
     super(Model, self).__init__() 
     self.openDir = '/some/file/dir/' 
    def openFile(self): 
     openFileName = QtGui.QFileDialog.getOpenFileName(None, "Open File",self.openDir,"AllFiles(*.*)") 
     openFile = open(openFileName, 'r') 
     ... 

class View(QtGui.QWidget): 
    def__init__(self): 
    super(View, self).__init__() 
    ... 
    self.button = QtGui.QPushButton("Open") 
    ... 
    self.model = Model() 
    self.button.clicked.connect(self.model.openFile) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    mainWindow = View() 
    mainWindow.show() 
    sys.exit(app.exec_()) 

回答

0

嗯,我的机器上没有PyQt4,但我有PySide。以下是我在运行代码时看到的内容:

1)super(Model, self).__init__(parent)崩溃。 “父母”没有定义。

2)open = open(openFileName, 'r')非常糟糕。你正在重新定义一个内置的。

3)self.loadDir似乎不存在。

4)但对于你的问题,如果我改变

self.button.clicked.connect(Model().openFile) 

是:

self.model = Model() 
self.button.clicked.connect(self.model.openFile) 

那么问题似乎解决。但是这在PySide中,所以可能不在PyQt4中。祝你好运。

+0

谢谢你弗雷德!一旦我回到我的机器,我会尝试它。根据你的笔记:1)哎呀,我正在抄录,忘记忽略父母。它应该是'super(Model,self).__ init __()'2)错别字对不起,应该是'openFile = open(openFileName,'r')'3)'self.loadDir == self.openDir' 4)我隐约记得尝试这个,但是当我回到我的机器时我会确定地知道。我在原来的问题中改变了所有这些。 – Krin123 2014-10-28 17:39:18

+0

谢谢Fred!这就像魅力:)你可能可以向我解释为什么self.model.openFile工作,但模型()。openFile不起作用?是否因为你必须首先初始化实例? – Krin123 2014-10-28 20:11:33

+0

LOL我希望我知道如何解决这个问题,而无需反复试验。我已经使用了一年多的pyside,而且我仍然发现我无法解释的奇怪故障。它和PyQt4之间的奇怪差异。 – 2014-10-28 20:22:26

相关问题