私は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にかなり慣れているので、これが多少読みやすいと思います。
いくつかの問題があります。 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を見ることができるという考えです