2015-06-16 48 views
1

使用PyQt5,我試圖得到一個自定義對話框(包含一個簡單的QListWidget)來返回一個值。 我知道以前有類似的問題,但不知何故,我似乎沒有得到工作的答案。PyQt自定義對話框 - 如何獲取返回值?

自定義對話框是在這個類:

class ListSelection(QDialog): 
    def __init__(self, item_ls, parent=None): 
     super(ListSelection, self).__init__(parent) 
     self.result = "" 
     #================================================= 
     # listbox 
     #================================================= 
     self.listWidget = QListWidget() 
     for item in item_ls: 
     w_item = QListWidgetItem(item) 
     self.listWidget.addItem(w_item) 
     self.listWidget.itemClicked.connect(self.OnSingleC lick) 
     self.listWidget.itemActivated.connect(self.OnDoubl eClick) 
     layout = QGridLayout() 
     row=0 
     layout.addWidget(self.listWidget,row,0,1,3) #col span=1, row span=3 
     #================================================= 
     # OK, Cancel 
     #================================================= 
     row +=1 
     self.but_ok = QPushButton("OK") 
     layout.addWidget(self.but_ok ,row,1) 
     self.but_ok.clicked.connect(self.OnOk) 

     self.but_cancel = QPushButton("Cancel") 
     layout.addWidget(self.but_cancel ,row,2) 
     self.but_cancel.clicked.connect(self.OnCancel) 

     #================================================= 
     # 
     #================================================= 
     self.setLayout(layout) 
     self.setGeometry(300, 200, 460, 350) 

    def OnSingleClick(self, item): 
     self.result = item.text() 

    def OnDoubleClick(self, item): 
     self.result = item.text() 
     self.close() 
     return self.result 

    def OnOk(self): 
     if self.result == "": 
      QMessageBox.information(self, "Error", 
      "One item must be selected") 
      return 
     self.close() 
     return self.result 

    def OnCancel(self): 
     self.close() 

    def GetValue(self): 
     return self.result 

這是調用函數做什麼:

def SomeFunction() 
    ls = ['apples','bananas','melons'] 
    lb = ListSelection(ls) 
    if lb.exec_(): 
     value = lb.GetValue() 
     print(value) 

的問題是,這並沒有捕獲任何價值。

謝謝!

回答

2

exec_函數不會返回True,所以您從不打印該值。

根據文檔,它返回一個int int QDialogCode。我用下面的代碼進行測試,並將其返回0(評估爲False

def SomeFunction(): 
    ls = ['apples','bananas','melons'] 
    lb = ListSelection(ls) 
    returnCode=lb.exec_() 
    print(returnCode) 
    value = lb.GetValue() 
    print(value) 

所以只要不把一個if,它會打印出值。

編輯:

我想正確的行爲是打印值,如果用戶按OK,打印什麼如果用戶按取消。因此,可以使用QDialog.done(int),整數是QDialogCode。這樣你可以保留你的if聲明。

+1

OP要忽略用戶取消的情況。所以正確的測試方法是:'if lb.exec_()== QDialog.Accepted'。 – ekhumoro

+0

問題解決!另外,使用'QDialog.done(int)'而不是'QDialog.close()'實際上是一個重要的提示。 – Karpov

+3

@Karpov。更好:使用['accept()'](http://doc.qt.io/qt-4.8/qdialog.html#accept)和['reject()'](http://doc.qt.io /qt-4.8/qdialog.html#reject),而不是'close()'。 – ekhumoro