Откройте второе окно в PyQt - PullRequest
11 голосов
/ 27 ноября 2009

Я пытаюсь использовать 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 ]

18 голосов
/ 03 марта 2010

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

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

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

3 голосов
/ 11 января 2010

Ui_Dialog должен быть свойственным QtGui.QDialog, а не объекту.

class Ui_Dialog(QtGui.QDialog):
    def __init__(self, dbConnection):
        QtGui.QDialog.__init__(self)
        global c
        c = dbConnection
1 голос
/ 28 ноября 2009
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()

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...