2017-01-11 7 views
1

私はすでに持っているコードの周りにGUIを構築しようとしています。私は手動でGUIを構築するときにこれを行う方法を理解していますが、Qt Designerとpyuicによって生成されたPythonコードにこれを追加するとスタックされます。例として、私は手動で私のような行い、これは働く、ユーザーがファイルを指すようにできるようになりますボタンが必要になることがありますカスタムスロットを使ったPyQtは動作しません。Qtデザイナーはいない

import sys 
from PyQt4 import QtGui 


class Example(QtGui.QWidget):  
    def __init__(self): 
     super(Example, self).__init__() 

     self.initUI() 

    def initUI(self):   

     btn = QtGui.QPushButton('Open File', self) 
     btn.setToolTip('This is a <b>QPushButton</b> widget') 
     btn.resize(btn.sizeHint()) 
     btn.move(50, 50)  
     btn.clicked.connect(self.loadFile) 

     self.setGeometry(300, 300, 250, 150) 
     self.show() 

    def loadFile(self): 
     fname = QtGui.QFileDialog.getOpenFileName(self, 'Open file', '/home') 
     # some custom code for reading file and storing it 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

しかし、私はQtのデザイナーで同じことをしようとすると、プログラムはファイルダイアログに到達する前に停止します。

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName(_fromUtf8("Form")) 
     Form.resize(400, 300) 
     self.pushButton = QtGui.QPushButton(Form) 
     self.pushButton.setGeometry(QtCore.QRect(130, 100, 75, 23)) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 

     self.retranslateUi(Form) 
     QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.loadFile) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     Form.setWindowTitle(_translate("Form", "Form", None)) 
     self.pushButton.setText(_translate("Form", "Open File", None)) 

    def loadFile(self): 
     print('loadFile1') 
     fname = QtGui.QFileDialog.getOpenFileName(self, 'Open file', '/home') 
     print('loadFile2') 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    Form = QtGui.QWidget() 
    ui = Ui_Form() 
    ui.setupUi(Form) 
    Form.show() 
    sys.exit(app.exec_()) 

これは、loadFile()内の最初のステートメントだけを出力しますが、ファイルダイアログウィンドウは開きません。私は間違って何をしていますか?

+0

(1)生成されたファイルの先頭にあるコメントを読んでください: '#警告!このファイルのすべての変更は失われます! ' (2)PyQtのドキュメントを読む:[Qt Designerを使う](http://pyqt.sourceforge.net/Docs/PyQt4/designer.html)。 (3)Pythonトレースバックを表示できる環境でコードを実行します。 – ekhumoro

答えて

1

documentationによると:

QStringのGetOpenFileName関数(QWidgetの親=なし、QStringのキャプション= ''、 QStringのディレクトリ= ''、QStringのフィルタ= ''、オプションオプション= 0 )

QStringのGetOpenFileName関数(QWidgetの親=なし、QStringのキャプション= ''、 QStringのディレクトリ= ' 」、フィルタ= QStringの 『『』』、QStringのselectedFilter = を、オプションの選択肢= 0)

あなたはあなたのケースで自己型オブジェクトではありませんが、親としてのウィジェットまたはNoneを渡す必要があります。

あなたは、私が本当にいる限り、私は避けることができるようpyuic使用して好きではない

QtGui.QFileDialog.getOpenFileName(None, 'Open file', '/home') 
0

QtGui.QFileDialog.getOpenFileName(self, 'Open file', '/home') 

を変更する必要があります。簡単な方法で試してみると、コードが減少します。あなたのUIファイルがsomething.uiと呼ばれ、あなたはQTデザイナーsomebuttonに、ボタンを命名していると言う、その後、コードは次のようになります。あなたが持っている場合はQDialogはQDialogでQMainWindowを置き換えること

from PyQt4 import QtCore, QtGui, uic 
Ui_somewindow, _ = uic.loadUiType("something.ui") #the path to your UI 

class SomeWindow(QtGui.QMainWindow, Ui_somewindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     Ui_somewindow.__init__(self) 
     self.setupUi(self) 
     self.somebutton.clicked.connect(self.loadFile) 

    def loadFile(self): 
     print('loadFile1') 
     fname = QtGui.QFileDialog.getOpenFileName(self, 'Open file', '/home') 
     print('loadFile2') 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    window = SomeWindow() 
    window.show() 
    sys.exit(app.exec_()) 

注意。 これが役立つことを願っています。

関連する問題