如何重新实现QDialog的接受和拒绝插槽?



我正在进行一个GUI项目,其中用户将面临以下QDialog:

class StockSelectorDialog(QDialog, stockselector_ui):
def __init__(self, parent_, *args, **kwargs):
super(StockSelectorDialog, self).__init__(*args, **kwargs)
self.setAttribute(Qt.WA_DeleteOnClose, on=True)
self.setupUi(self)
self.dialogButtonBox.accepted.connect(self.accept)
self.dialogButtonBox.rejected.connect(self.reject)
self.parent_ = parent_
self.symbolsbuffer = parent_.symbols.copy()
self.symbolmodel = SymbolListModel(self)
self.listView.setModel(self.symbolmodel)
self.symbolAddButton.clicked.connect(self.onAddButtonClicked)
self.symbolDeleteButton.clicked.connect(self.onDeleteButtonClicked)
def onAddButtonClicked(self, s):
symbol = self.symbolEdit.text()
if symbol:
self.symbolsbuffer.append(symbol)
self.symbolmodel.layoutChanged.emit()
self.symbolEdit.setText("")
def onDeleteButtonClicked(self, s):
indexes = self.listView.selectedIndexes()
if indexes:
for i in indexes:
del self.symbolsbuffer[i.row()]
self.symbolmodel.layoutChanged.emit()
self.listView.clearSelection()
def accept(self):
self.parent_.symbols = self.symbolsbuffer
self.parent_.onSymbolsChanged()
self.close()
def reject(self):
self.close()

UI文件在这里:https://github.com/danib-prog/stockmarket-helper/blob/master/stockselector.ui

一切都很好,直到我添加了缓冲区系统,为此我不得不重新实现对话框的acceptreject插槽(尽管我对后者不太确定(。现在,对话框在必要时打开,ListView可以很好地使用所有按钮和LineEdit,但我的dialogButtonBox没有响应。

为什么会发生这种情况?这个问题的解决方案是什么?

您不应该为此在对话框上调用close(),主要是因为它会导致自己调用reject();幸运的是,Qt足够聪明,可以防止递归,但问题仍然存在:这两种方法都应该设置对话框的结果,并使用close()done(),以便它们的事件循环正确地从其exec_()中退出。

如果您需要重写类函数来执行默认行为以外的操作,则应始终记住也要调用基实现,以便正确实现预期结果。

def accept(self):
self.parent_.symbols = self.symbolsbuffer
self.parent_.onSymbolsChanged()
super(StockSelectorDialog, self).accept()
def reject(self):
super(StockSelectorDialog, self).reject()

此外,请注意,当使用带有按钮的默认对话框模板创建QDialogButtonBox时,Qt Designer已经连接了该对话框的按钮,因此不应再次连接它们,否则acceptreject将被调用两次。

最新更新