Открыть второе окно в 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"), чтобы быть глобальным лучшим способом получить информацию в эти функции?

3 ответов


Я делал так в прошлом, и я могу сказать, что это работает. предполагая, что ваша кнопка называется "Button"

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___ ??? Использовать вместо:

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

нужно позвонить __init__ methon из базового класса (имя в скобках' ()')

QDialog имеют два полезных маршрута:

exec_()
show()

сначала дождитесь закрытия диалога, а затем вы можете получить доступ к любому диалогу формы поля. Второе показать диалог, но не ждите, поэтому для правильной работы вы должны установить некоторые соединения слота / сигналов для ответа на диалоговые действия.

например. для 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 может попытаться установить его как дочерние элементы существующего. (Поэтому измените все init, чтобы иметь дополнительный Родительский параметр (должен быть на второй позиции)).