2017-09-12 22 views
0

私のプログラムには、私の目録システムを含むMainWindowがあります。私は「アイテムを追加」をクリックしたときにポップアップするダイアログウィンドウを追加しました。私は正常にダイアログウィンドウを開くことができますが、私はそれを閉じるように見えることはできません。Python PyQt4でダイアログを閉じることができません

ユーザーがダイアログウィンドウを閉じようとすると、ユーザーが本当にウィンドウを閉じるかどうかを尋ねるメッセージボックスが表示されます。現在、私はself.close()を使用しています。それは、私が偶発的な終了を防ぐために作ったMessageBoxを閉じ、IDEまたはタスクマネージャを使用して終了しない限りダイアログウィンドウを閉じることはありません。ここで

は私のコードスニペットです:

Main.py

class Main(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 

     self.db = Database() 
     self.model = Model(self) 
     self.ui = MainWindow_ui() 
     self.ui.setupUi(self) 
     self.window = Ui_Dialog() 

     self.ui.addItem.clicked.connect(lambda : self.start_Form()) 

    def start_Form(self): 
     window = QtGui.QDialog() 
     self.window.setupUi(window) 
     self.window.show() 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    window = Main() 
    window.showMaximized() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 

AddItem.py(ダイアログウィンドウのコードが含まれています)

def getNumber(): 
    conn = sqlite3.connect('inventory.db') 
    c = conn.cursor() 
    c.execute('SELECT seq FROM sqlite_sequence') 
    itemNumber = c.fetchone()[0] 
    return int(itemNumber) + 1 

class Ui_Dialog(QtGui.QDialog): 
    def __init__(self): 
     QtGui.QDialog.__init__(self) 
     self.setupUi(self) 

    def setupUi(self, Dialog): 
     Dialog.setObjectName(_fromUtf8("Dialog")) 
     Dialog.resize(413, 382) 

     self.buttonBox = QtGui.QDialogButtonBox(Dialog) 
     self.buttonBox.setStandardButtons(
      QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Reset) 
     self.buttonBox.accepted.connect(self.accept) 
     self.buttonBox.rejected.connect(self.reject) 

    def retranslateUi(self, Dialog):  
     self.itemCode.setText(str(getNumber())) 

    def accept(self): 
     row = self.mapper.currentIndex() 
     self.mapper.submit() 
     self.main.model.insertRow(row) 
     self.mapper.setCurrentIndex(row) 

     self.close() 

    def reject(self): 
     ret = QtGui.QMessageBox.question(None, 'Close request', 'Are you sure you want to quit?', 
             QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) 
     if ret == QtGui.QMessageBox.Yes: 
      self.close() 
     else: 
      pass 

答えて

1

あなたaccept()reject()方法が効果的に無限ループを作成しますなぜなら、close()を呼び出すと、それらのメソッドをもう一度呼び出すだけだからです。仮想メソッドをオーバーライドするときは、superを使用して基本クラスの実装を呼び出す必要があります。

class Ui_Dialog(QtGui.QDialog): 
    ... 

    def accept(self): 
     ... 
     super(Ui_Dialog, self).accept() 

    def reject(self): 
     ... 
     if ret == QtGui.QMessageBox.Yes: 
      super(Ui_Dialog, self).reject() 
+0

また、あなたはUi_Dialogでフォームを使用してQSqlRelationalTableModelに新しい行にデータを挿入する方法を知っているのですか? – lloydyu24

+0

@ lloydyu24。新しい質問をしてください。 – ekhumoro

+0

https://stackoverflow.com/q/46129731/7342548 @ekhumoro – lloydyu24

関連する問題