2015-11-16 42 views
0

這裏是我的代碼:如何包裝一個QFileDialog和QPushButton對象中的

from PyQt5.QtCore import (
    QDir 
) 
from PyQt5.QtWidgets import(
    QApplication,QDialog, 
    QVBoxLayout,QGridLayout,QPushButton,QFileDialog 
) 

class DicAsk(object): 
    def __init__(self): 
     super(DicAsk, self).__init__() 
     self.button = QPushButton("ButtonB") 
     self.button.clicked.connect(self.browse) 
     # self.button.clicked.connect(lambda:QFileDialog.getExistingDirectory(None, "Find Files", 
     #  QDir.currentPath())) 
    def browse(self): 
     directory = QFileDialog.getExistingDirectory(None, "Find Files", 
      QDir.currentPath()) 

class Window(QDialog): 
    def __init__(self, parent=None): 
     super(Window, self).__init__(parent) 
     buttonA = QPushButton("ButtonA") 
     buttonA.clicked.connect(self.browse) 

     dicAsk = DicAsk() 

     mainLayout = QVBoxLayout() 
     mainLayout.addWidget(buttonA) 
     mainLayout.addWidget(dicAsk.button) 
     self.setLayout(mainLayout) 

    def browse(self): 
     directory = QFileDialog.getExistingDirectory(None, "Find Files", 
      QDir.currentPath()) 

if __name__ == '__main__': 
    import sys 
    app = QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 

有窗口兩個按鈕:「按鈕a」和「按鈕B」。 按鈕A工作正常,它可以成功打開QFileDialog

按鈕B在類中定義,應該像按鈕A一樣工作,但不會打開QFileDialog。如果將browse方法更改爲lambda函數,它將起作用。爲什麼browse方法不起作用?

回答

2

問題是DicAsk未定義爲PyQt對象。它只被定義爲一個基本的python類,所以它的方法不能是插槽。 DicAsk.browse單擊按鈕B時從不會調用。

真正的問題是,您不保留對dicAsk的引用。它在Window.__init__本地定義,然後銷燬。您仍然可以使用dicAsk.buttton因爲它被添加到佈局(window成爲dicAsk.button父,所以保持一個參考按鈕)

要解決這個問題,你可以保持一個參考與self.dicAsk=DicAsk(),或修改類有一個父:

class DicAsk(QtCore.Qobject): 
    def __init__(self,parent): 
     super(DicAsk, self).__init__(parent) 

#in Window 
dicAsk=DicAsk(self) 

另一種方式來解決您的問題是繼承QPushButton

class MyButton(QPushButton): 
    def __init__(self,parent=None): 
     super(MyButton, self).__init__(parent) 
     self.setText("ButtonB") 
     self.clicked.connect(self.browse) 

    def browse(self): 
     print("browse") 

它更有意義,因爲你想要的是一個定製按鈕。

+1

這是不正確的 - *任何* python callable都可以用作插槽。 OPs例子唯一的問題是它們沒有保留對'dicAsk'的引用(當它被添加到佈局時,按鈕將被重新設置)。但是你可能是正確的,子類化'QPushButton'更合理。 – ekhumoro

+0

確實我的不好。我以爲我只通過使用'QObject'修復了這個例子,但我實際上也添加了'self.dicAsk'。我會編輯我的答案,謝謝。 – Mel

+0

謝謝,這是一個完美的答案。 – user1021531

相關問題