2015-02-24 16 views
7

PyQt'de bir kullanıcı arabirimi üzerinde çalışıyorum ve QDialog kullanmaya çalışırken birkaç sorunla karşılaşıyorum. Esasen, ayrı bir .px dosyalarında kaydedilmiş bir ana widget ve bir alt widget'ım var; Ana pencere öğesinde belirli bir düğmeyi tıkladığımda alt pencere öğesinin açılmasını isterim. Bu iyi görünüyor.PyQt QDialog - bir değer döndürüp iletişim kutusundan kapatılıyor

Sorun, dönen ve kapanıyor. Alt widget'ımda "gönder" düğmesi var - kullanıcı bu düğmeyi tıkladığında, ana widget’e bir değer (girişlerinden yapılan bir sözlük) döndürmek ve alt parçacığı kapatmak istiyorum. Şu anda sahip olduğum kodla bu gibi şeylerden birini yapamam. Ana widget'ta kod

Uygulanabilir bit (sorun bariz değilse o kendine yeten yapmak için daha fazla ekleyebilirsiniz):

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() 

Ben if deyiminin sonra kod vurmak gibi asla . Eski bu widget çalıştırıldığında tanınmayan burada da) ben ex.close (denedi *

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()* 

ama:

benim alt widget'ından uygulanabilir kodu (daha biraz burada yer alacak) diyalog olarak Geri dönüş bildirimi nedeniyle bu satıra ulaşması gerektiği gibi görünmüyor, ancak kullanıcı "gönder" kelimesine ulaştıktan sonra bu widget'ı nasıl kapatacağımı bilmiyorum. Veya ana widget'ımdaki dialog.accept() öğesi bunu işlemeli mi?

Son bir şey - bunun yerine alt widget'ımda buna ihtiyacım var, çünkü ana widget'ım yerine çalıştırılıyor? peşin

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

teşekkürler! PyQt için oldukça yeniyim, bu yüzden umarım bu biraz okunaklı.

cevap

12

Birkaç sorun var. if dialog.exec_(): satırı yalnızca iletişim kutusu accept() ile çıkarsa başarılı olur. QDesigner ile çalışıyor musunuz? Varsa, farklı bir çalışma şekli için this'u kontrol edin. Eğer Ui_ShowGroupWidget sadece yazdığınız kodu içeriyorsa, QWidget yerine QDialog'u miras almalısınız. Ardından, self.close() ile kapatmak yerine, self.accept() ile kapatın. Bir diktatörlük geri dönemezsiniz, ancak bunu bir nesne özelliği olarak kaydedebilirsiniz. dialog.exec_() döndüğünde, bu özniteliğe erişebilirsiniz.

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

diğeri:

Böyle bir şey olabilir

... 

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() 

Sonunda, if __name__=='__main__': "Bu dosya daha sonra, ana dosya olarak yürütülürse .." demek, sizin de dahil ettiğiniz ve başka birinden kullandığınız durum böyle değildir. Bu yüzden, bunu kaldırabilirsiniz, ancak, test etmek için python ui_mywidget.py'u çalıştırabilmeniz veya bu dosyada tanımlı Ui'yi görebildiğiniz

+0

Bu düzeltildi - çok teşekkürler! –