문제

QMainWindow의 버튼을 클릭 할 때 PYQT를 사용하여 사용자 정의 QDialog 창을 표시하려고합니다. 다음과 같은 오류가 계속됩니다.

$ 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__ 기본 클래스의 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()

작은 팁 : UI 클래스를 위젯 (레이아웃 포함)으로 변경할 수 있습니다. 그리고 아마도 문제는 당신의 것입니다 __init__ 해야한다 __init__(self, parent=None, dbConnection)

기존에서 새 위젯을 만들 때 하나의 pyqt는 그것을 기존의 어린이로 설정하려고 시도 할 수 있기 때문입니다. (따라서 추가 부모 매개 변수를 갖도록 모든 초기를 변경하십시오 (두 번째 위치에 있어야 함)).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top