gpt4 book ai didi

python - 通过 QValidator 验证可编辑的 QCombobox 输入是否是目录

转载 作者:行者123 更新时间:2023-12-01 08:39:59 26 4
gpt4 key购买 nike

在将可编辑的 QCombobox 输入添加到 QCombobox 之前,我尝试验证它是否是目录。

from PySide import QtGui, QtCore

class DirValidator(QtGui.QValidator):
def __init__(self, cb_input):
super(DirValidator, self).__init__()
self._input = cb_input

def validate(self, _text, _pos):
_dir = QtCore.QDir(_text)
if self._input.hasFocus(): # ignore validation while editing not complete
return QtGui.QValidator.Acceptable
if QtCore.QDir.exists(_dir):
return QtGui.QValidator.Acceptable
return QtGui.QValidator.Invalid


dir_validator = DirValidator(self.cb_path.lineEdit())
self.cb_path.setValidator(dir_validator)

遗憾的是它无法正常工作,因为当我按回车键时,每个输入仍然会添加到组合框中。有什么建议吗?

编辑:我还尝试在 QLineEdit 上使用验证器,如下所示:

dir_validator = DirValidator(self.cb_path.lineEdit())
self.cb_path.lineEdit().setValidator(dir_validator)

也不起作用。

编辑:它有点工作......但是当我按回车键时“hasFocus”仍然是True,所以它只是接受输入,然后当然将其添加到组合框。如果我摆脱“if self._input.hasFocus():”,如果我输入它,它不接受任何输入......只是粘贴完整的目录路径。所以我需要一种方法来检查编辑是否完成,然后检查它是否是一个目录。据我所知,我只能通过 QValidator 在组合框中检查这一点...因为它会立即将输入添加到框中...然后我才能以任何方式拦截它。

编辑:我确实找到了适合我的情况的解决方案。我刚刚放弃了整个验证器方法。这样做的目的是防止组合框在不是有效目录的情况下创建新项目...我现在所做的是利用 QLineEdit().editingFinished() 信号在完成后验证输入。创建新项目后,如果输入无效,我会再次将其删除,并且它还让我有机会添加错误弹出窗口,告诉用户输入不是目录。

最佳答案

我认为不需要 hasFocus(),因为如果您正在写入 QLineEdit,它显然具有焦点。如果路径不正确,则必须返回 QValidator::Intermediate:

from PySide import QtGui, QtCore

class DirValidator(QtGui.QValidator):
def validate(self, _text, _pos):
_dir = QtCore.QDir(_text)
if _dir.exists():
return QtGui.QValidator.Acceptable
return QtGui.QValidator.Intermediate

if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
combo = QtGui.QComboBox(editable=True)
dir_validator = DirValidator(combo.lineEdit())
combo.setValidator(dir_validator)
combo.show()
sys.exit(app.exec_())

关于python - 通过 QValidator 验证可编辑的 QCombobox 输入是否是目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53557901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com