web-dev-qa-db-ja.com

PyQt QDialog-値を返し、ダイアログから閉じる

私はPyQtのユーザーインターフェイスで作業しており、QDialogを使用しようとするといくつかの問題が発生します。基本的に、メインウィジェットとサブウィジェットがあり、別々の.pyファイルに保存されています。メインウィジェットの特定のボタンをクリックすると、サブウィジェットが開くようにしたいのですが。これはうまく開いているようです。

問題はリターンとクローズで発生します。サブウィジェットに「送信」ボタンがあります。ユーザーがこのボタンをクリックすると、値(入力から作成されたディクショナリ)をメインウィジェットに返し、サブウィジェットを閉じます。私は今持っているコードでこれらのことのいずれかを行うことができないようです。

メインウィジェットの該当するコード(問題が明らかでない場合は、コードを追加して自己完結させることができます):

import SGROIWidget_ui

def retranslateUi(self, ROIGUI):
    #ShowGroupROI is a Push-button
    self.ShowGroupROI.clicked.connect(self.ShowGroupROIFunction)

def ShowGroupROIFunction(self):
    dialog = QDialog()
    dialog.ui = SGROIWidget_ui.Ui_ShowGroupWidget()
    dialog.ui.setupUi(dialog)
    dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    if dialog.exec_():
        roiGroups=dialog.Submitclose()
        print(roiGroups)
        dialog.accept()

Ifステートメントの後にコードを実行することはありません。

私のサブウィジェットからの適切なコード(ここにもう少し含まれます):

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_ShowGroupWidget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)

    def setupUi(self, ShowGroupWidget):
        #sets up Submit button

    def retranslateUi(self, ShowGroupWidget):
        self.Submit.clicked.connect(self.Submitclose)

     def Submitclose(self):
        roiGroups={}
        #roiGroups gets set up here as a dictionary
        #It prints nicely from here so I know it's not the issue

        return roiGroups 
        #I don't know if I can just do a return statement like this?
        self.close()*

*ここでもex.close()を試しましたが、このウィジェットをダイアログとして実行するとexが認識されません。 returnステートメントのためにこの行に到達するようには見えませんが、ユーザーが「送信」を押した後にこのウィジェットを閉じる方法が他にありません。または、私のメインウィジェットのdialog.accept()がそれを処理する必要がありますか?

最後にもう1つ、メインウィジェットを介して実行されているため、サブウィジェットでこれが必要ですか?

if __name__=='__main__':
    app=QtGui.QApplication(sys.argv)
    ex=Ui_ShowGroupWidget()
    ex.show()
    sys.exit(app.exec_())

前もって感謝します!私はPyQtにかなり慣れているので、これが多少読みやすいと思います。

9
Emily C

いくつかの問題があります。 if dialog.exec_():行は、ダイアログがaccept()で終了した場合にのみ成功します。 QDesignerを使用していますか?もしそうなら、別の方法で this を確認してください。 _Ui_ShowGroupWidget_に記述したコードのみが含まれている場合は、QWidgetではなくQDialogを継承する必要があります。次に、self.close()で閉じるのではなく、self.accept()で閉じます。辞書を返すことはできませんが、オブジェクト属性として保存できます。 dialog.exec_()が返されると、その属性にアクセスできます。

それはこのようなものかもしれません:

_def ShowGroupROIFunction(self):
    dialog = SGROIWidget_ui.Ui_ShowGroupWidget()
    if dialog.exec_():
        print(dialog.roiGroups)
_

別のもの:

_...

class Ui_ShowGroupWidget(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.setupUi(self)
        self.roiGroups = {}
        self.Submit.clicked.connect(self.submitclose)

    def setupUi(self, ShowGroupWidget):
        #sets up Submit button

    def submitclose(self):
        #do whatever you need with self.roiGroups    
        self.accept()
_

最後に、_if __name__=='__main__':_は、「このファイルがメインファイルとして実行される場合」という意味です。これは、他のファイルからインクルードして使用する場合とは異なります。だからあなたはそれを削除することができます、しかしそれはそれをテストするために_python ui_mywidget.py_を実行するか、そのファイルで定義されたUiを見ることができるという考えです

12
Smasho