PyQt自定义对话框 - 如何获取返回值?

时间:2015-06-16 14:20:22

标签: python pyqt

使用PyQt5,我试图获得一个自定义对话框(包含一个简单的QListWidget)来返回一个值。 我知道以前曾经问过类似的问题,但不知怎的,我似乎没有得到解决方案。

自定义对话框在此类中:

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)

问题是,这不会捕获任何值。

谢谢!

1 个答案:

答案 0 :(得分: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,它会打印出值。

修改

我想正确的行为是在用户按下确定时打印该值,如果用户按下取消则不打印任何内容。

因此,您可以使用QDialog.close()而不是QDialog.done(int),而QDialogCode则是if。这样您就可以保留var now = new Date(); var year = now.getFullYear(); var textbox = document.getElementById('txtbxYear'); textbox.value = year;声明。