2015-02-24 17 views
7

Tôi đang làm việc trên một giao diện người dùng trong PyQt, và tôi chạy vào một vài vấn đề cố gắng sử dụng QDialog. Về cơ bản tôi có một widget chính và một widget phụ, được lưu trong các tệp .py riêng biệt; Tôi muốn tiện ích phụ mở khi tôi nhấp vào một nút nhất định trong tiện ích chính. Điều này dường như được mở tốt.PyQt QDialog - trả về giá trị và đóng cửa từ hộp thoại

Sự cố xảy ra khi trả lại và đóng. Tôi có một nút "gửi" trên tiện ích phụ của tôi - khi người dùng nhấp vào nút này, tôi muốn trả về một giá trị (từ điển được tạo từ đầu vào của họ) cho tiện ích chính và đóng tiện ích phụ. Tôi không thể làm một trong những điều này với mã tôi có ngay bây giờ.

bit Áp dụng mã trong các phụ tùng chính (có thể bổ sung thêm để làm cho nó khép kín nếu vấn đề là không rõ ràng):

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

tôi không bao giờ dường như đánh mã sau if-tuyên bố .

Mã áp dụng từ của tôi phụ tùng (sẽ bao gồm một chút thêm ở đây):

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

* Tôi đã thử ex.close() ở đây là tốt nhưng cũ không được công nhận khi widget này được điều hành như một hộp thoại. Nó không có vẻ như nó sẽ nhận được để dòng này vì tuyên bố trở lại, nhưng tôi không biết làm thế nào khác để đóng tiện ích này sau khi người dùng nhấn "gửi". Hoặc nên dialog.accept() trong widget chính của tôi xử lý?

Một điều cuối cùng - tôi cần điều này trong tôi phụ tùng nào cả, vì nó đang được chạy qua phụ tùng chính của tôi để thay thế?

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

Cảm ơn bạn trước! Tôi khá mới mẻ với PyQt nên hy vọng điều này có phần dễ đọc.

Trả lời

12

Có một số vấn đề. Dòng if dialog.exec_(): sẽ chỉ thành công nếu hộp thoại bị thoát với accept(). Bạn đang làm việc với QDesigner? Nếu có, hãy kiểm tra this để biết cách làm việc khác. Nếu Ui_ShowGroupWidget chỉ chứa mã bạn viết, bạn nên làm cho nó kế thừa QDialog thay vì QWidget. Sau đó, thay vì đóng nó bằng self.close(), bạn đóng nó với self.accept(). Bạn không thể trả về một ma thuật, nhưng bạn có thể lưu nó như là một thuộc tính đối tượng. Khi số tiền trả về dialog.exec_(), bạn có thể truy cập thuộc tính đó.

Nó có thể là một cái gì đó như thế này:

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

Các khác một:

... 

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

Cuối cùng, if __name__=='__main__': có nghĩa là "nếu tập tin này được thực thi như file chính, sau đó ..", đó không phải là trường hợp như bạn đang bao gồm và sử dụng nó từ một số khác. Vì vậy, bạn có thể xóa nó, tuy nhiên, ý tưởng là bạn có thể chạy python ui_mywidget.py để kiểm tra hoặc xem Ui được xác định trên tệp đó

+0

Điều đó đã khắc phục được - cảm ơn bạn rất nhiều! –

Các vấn đề liên quan