質問
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")を設定しますそれらの関数に?
解決
私は過去にこのようなことをしましたが、うまくいくと言えます。 ボタンが" 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 ___
???
instedを使用:
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
基本クラスから __ init __
methonを呼び出す必要があります(括弧内の名前 '()')
QDialogには2つの便利なルーチンがあります:
exec_()
show()
最初にダイアログを閉じるまで待つと、フィールドフォームダイアログにアクセスできます。 2番目のダイアログを表示しますが、待つことはありません。そのため、正しく動作するには、ダイアログアクションに応答するスロット/信号接続を設定する必要があります。
eg。 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はそれを既存のウィジェットの子として設定しようとする場合があるためです。 (したがって、すべてのinitを変更して、追加の親パラメーターを使用します(2番目の位置にある必要があります)。