Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top