Откройте второе окно в PyQt
Вопрос
Я пытаюсь использовать pyqt для отображения пользовательского окна QDialog при нажатии кнопки в QMainWindow.Я продолжаю получать следующую ошибку:
$ python main.py
DEBUG: Launch edit window
Traceback (most recent call last):
File "/home/james/Dropbox/Database/qt/ui_med.py", line 23, in launchEditWindow
dialog = Ui_Dialog(c)
File "/home/james/Dropbox/Database/qt/ui_edit.py", line 15, in __init__
QtGui.QDialog.__init__(self)
TypeError: descriptor '__init__' requires a 'sip.simplewrapper' object but received a 'Ui_Dialog'
Я просмотрел несколько онлайн-руководств, но большинство из них ограничиваются показом того, как использовать не встроенное диалоговое окно.Я сгенерировал код как для главного окна, так и для диалогового окна, используя pyuic4.То, что, по моему мнению, должно быть соответствующим кодом, приведено ниже.Чего я здесь не понимаю?
class Ui_Dialog(object):
def __init__(self, dbConnection):
QtGui.QDialog.__init__(self)
global c
c = dbConnection
class Ui_MainWindow(object):
def __init__(self, dbConnection):
global c
c = dbConnection
def launchEditWindow(self):
print "DEBUG: Launch edit window"
dialog = QtGui.QDialog()
dialogui = Ui_Dialog(c)
dialogui = setupUi(dialog)
dialogui.show()
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
conn = sqlite3.connect('meds.sqlite')
c = conn.cursor()
self.ui = Ui_MainWindow(c)
self.ui.setupUi(self)
def main():
app = QtGui.QApplication(sys.argv)
program = StartQT4()
program.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Дополнительный вопрос:поскольку похоже, что вы не можете передавать аргументы в обратных вызовах функций pyqt, является ли лучшим способом получения информации в этих функциях установка чего-либо, что в противном случае передавалось бы как аргумент (плохо названный "c"), как глобального?
Решение
Я делал это в прошлом, и я могу сказать, что это работает. при условии, что ваша кнопка называется «Кнопка»
class Main(QtGui.QMainWindow):
''' some stuff '''
def on_Button_clicked(self, checked=None):
if checked==None: return
dialog = QDialog()
dialog.ui = Ui_MyDialog()
dialog.ui.setupUi(dialog)
dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
dialog.exec_()
Это работает для моего приложения, и я считаю, что оно должно работать и с вашим. надеюсь, это поможет, должно быть довольно просто внести несколько изменений, необходимых для применения его в вашем случае. всем хорошего дня.
Другие советы
Ui_Dialog должен быть свойственным QtGui.QDialog, а не объекту.
class Ui_Dialog(QtGui.QDialog):
def __init__(self, dbConnection):
QtGui.QDialog.__init__(self)
global c
c = dbConnection
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
Почему QtGui.QWidget.__init___
???Используйте insted:
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
Ты должен позвонить __init__
метод из базового класса (имя в скобках '()')
В QDialog есть две полезные процедуры:
exec_()
show()
Сначала дождитесь закрытия диалогового окна, а затем вы сможете получить доступ к любому диалоговому окну формы поля.Второй показывает диалоговое окно, но не ждет, поэтому для правильной работы вы должны установить некоторые соединения slot / signals для ответа на действия диалогового окна.
например.для exec_():
class Dialog(QDialog):
def __init__(self, parent):
QDialog.__init__(parent)
line_edit = QLineEdit()
...
dialog = Dialog()
if dialog.exec_(): # here dialog will be shown and main script will wait for its closing (with no errors)
data = dialog.line_edit.text()
Маленький наконечник:можете ли вы превратить свои классы пользовательского интерфейса в виджеты (с макетами)?И, возможно, проблема в том, что ваш __init__
должно быть __init__(self, parent=None, dbConnection)
Потому что, когда вы создаете новый виджет в существующем, PyQt может попытаться установить его как дочерний по отношению к существующему.(Поэтому измените all init, чтобы у него был дополнительный родительский параметр (должен быть на второй позиции)).