2017-01-11 12 views
1

Я пытаюсь создать графический интерфейс вокруг некоторого кода, который у меня уже есть. Я понимаю, как это сделать при создании GUI вручную, но я застрял, добавляя это в код python, созданный Qt Designer и pyuic. В качестве примера, я бы нужна кнопка, которая позволит пользователю указывать на файл, который вручную я делаю как таковой, и это работает: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 Designer код программы останавливается перед достижением диалога с файлом.

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) Читать комментарии в верхней части сгенерированного файла: '# WARNING! Все изменения, внесенные в этот файл, будут потеряны! '. (2) Прочитайте документы PyQt: [Использование Qt Designer] (http://pyqt.sourceforge.net/Docs/PyQt4/designer.html). (3) Запустите код в среде, которая может отображать трассировки Python. – ekhumoro

ответ

1

Согласно documentation:

QString GetOpenFileName (QWidget родительском = None, QString подпись = '', директории QString = '', QString фильтр = '', опции Options = 0)

QString GetOpenFileName (QWidget родитель = Отсутствует, QString заголовок = '', каталог QString = ' », QString фильтр =„“, QString selectedFilter = „“, опции Опции = 0)

Вам необходимо пройти в качестве родителя виджета или None, в вашем случае я не от типа объекта.

Вы должны изменить

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

в

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

Я действительно не люблю использовать pyuic до тех пор, как я могу избежать. Есть более простой способ попробовать, это уменьшает ваш код. Предположим, что ваш файл UI называется something.ui, и вы назвали свою кнопку в Qt Designer somebutton, то код будет:

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_()) 

Обратите внимание, что если у вас есть QDialog заменить QMainWindow с QDialog. Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^