2015-06-16 2 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, поэтому вы никогда не печатаете значение.

Согласно документации, оно возвращает QDialogCode, int. Я тестировал на код ниже, и возвращает 0 (которые оценивают в False)

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

Так просто не положить if, и он будет выводить значение.

Edit:

Я предполагаю, что правильное поведение было бы напечатать значение, если пользователь нажимает кнопку ОК, и печать ничего, если пользователь нажимает кнопку Отмена.

Таким образом, вместо использования QDialog.close() вы можете использовать QDialog.done(int), причем целое число равно QDialogCode. Таким образом, вы можете сохранить свой оператор if.

+1

OP хочет игнорировать случай, когда пользователь отменяет. Итак, правильный способ тестирования: 'if lb.exec_() == QDialog.Accepted'. – ekhumoro

+0

Проблема решена! Кроме того, использование 'QDialog.done (int)' вместо 'QDialog.close()' действительно является важным советом. – Karpov

+3

@ Карпов. Еще лучше: используйте ['accept()'] (http://doc.qt.io/qt-4.8/qdialog.html#accept) и ['reject()'] (http://doc.qt.io /qt-4.8/qdialog.html#reject), а не 'close()'. – ekhumoro

Смежные вопросы