我有一个QTableView,我想验证用户输入.如果用户在单元格中插入无效值QTableView,我想突出显示该单元格并禁用a QPushButton.
我怎样才能做到这一点?我可以用QValidator吗?
QLineEdit有一个信号QLineEdit::editingFinished在用户完成编辑时发出,例如按Enter键.但是,如果设置了验证器或输入掩码,则editingFinished仅在输入有效时才会发出.
但是,无论输入的有效性如何,我如何对完成编辑的用户做出反应?我是否必须手动检查输入,返回,小部件失去焦点等?
原因是:我想创建一个自定义小部件,用于使用a编辑数字QDoubleValidator.当用户完成编辑并且输入无效(范围错误,空文本......)时,我想将其重置为某个有效的默认值.像这样的东西:
class NumberEdit: public QLineEdit
{
public:
NumberEdit(double min, double max)
{
setValidator(new QDoubleValidator(min, max, 10));
setText(QString::number(min));
connect(this, /* this is the problem */, [this, min]() {
if(!hasAcceptableInput())
setText(QString::number(min)); // Reset to valid number
});
}
};
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Qt 4.2中的行编辑框中应用验证器,但它无法正常工作:
QDoubleValidator *haha= new QDoubleValidator(this);
haha->setBottom(0.00);
haha->setDecimals(2);
haha->setTop(100.00);
get_line_edit()->setValidator(haha);
Run Code Online (Sandbox Code Playgroud)
要么
QDoubleValidator *haha= new QDoubleValidator(0.00,100.00,2,this);
Run Code Online (Sandbox Code Playgroud)
无论如何,我仍然可以进入我想要的任何价值.
但是,如果我切换到QIntValidator它,它的工作原理!
所以我去谷歌并进行了一些搜索,很多人过去常常遇到同样的问题.这是一个错误吗?或者应该有其他一些我应该做的设置?
我正在尝试使用QValidator后代(实际上在 PyQt5 中,但这无关紧要)来验证一系列行编辑。
一小段摘录是:
class IPv4(QWidget):
def __init__(self):
super(IPv4, self).__init__()
uic.loadUi('ipv4.ui', self)
self.address.inputMask = ''
rx = QRegularExpression(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
self.address.setValidator(QRegularExpressionValidator(rx, self.address))
self.netmask.setValidator(QRegularExpressionValidator(rx, self.netmask))
self.gateway.setValidator(QRegularExpressionValidator(rx, self.gateway))
self.broadcast.setValidator(QRegularExpressionValidator(rx, self.broadcast))
self.dns1.setValidator(QRegularExpressionValidator(rx, self.dns1))
self.dns2.setValidator(QRegularExpressionValidator(rx, self.dns2))
self.on_dhcp_clicked(self.dhcp.isChecked())
Run Code Online (Sandbox Code Playgroud)
这如宣传的那样有效,但用户没有得到任何反馈,因为尝试输入“错误”字符只会丢弃它们。
除了挂钩QLineEdit.textChanged信号并“手动”进行验证(即:不设置验证器,否则错误text不会改变并且不会发出信号)之外,我没有找到任何提供反馈的方法。首选的反馈是更改行编辑的边框颜色。
这在某种程度上违背了验证器本身的目的。似乎我错过了一些东西,因为我看不到如何触发反馈QValidator.
处理这个问题的“标准方法”是什么?
在我的一个项目中,我有一系列QLineEdit小部件,它们应该接受位于特定范围内的双数。由于某些原因我无法使用QDoubleSpinBox。
现在我用来QDoubleValidator检查我的号码是否在给定范围内。不幸的是,只有在给出editingFinished时才会发出信号。QValidatorQValidator::Acceptable
现在假设我可能有一系列这样的QLineEdit小部件。在其中一个小部件中,我输入了错误的数字,然后将焦点切换到另一个小部件。用户在QLineEdit.
相反,我想要的行为是将焦点设置到包含错误输入的小部件并发出警告。
由于某些原因,我未能实现此功能。即使在我查阅了 Qt 文档之后。
这是我的完整代码。
ValidatedDoubleEditorWidget.h
#pragma once
#include <QWidget>
namespace Ui {
class validatedDoubleEditorWidget;
}
class QDoubleValidator;
class ValidatedDoubleEditorWidget : public QWidget {
Q_OBJECT
public:
ValidatedDoubleEditorWidget(double min, double max, double value);
double getValue() const;
void setValue(const double value);
private slots:
void on_lineEdit_editingFinished();
protected:
virtual void focusOutEvent(QFocusEvent *event) override;
virtual void focusInEvent(QFocusEvent *event) override;
private:
Ui::validatedDoubleEditorWidget* mWidget = nullptr;
double mValue = 0.; …Run Code Online (Sandbox Code Playgroud) 我希望QLineEdit只接受没有任何小数的数字.它应该接受'456'而不是'456.3434'.它不应该允许小数.任何人都可以给出一些指示,我该怎么做.
我尝试使用QIntValidator,但它仍然允许输入小数点,当我从QLinEdit转换文本时它返回零(因为文档说,如果转换失败,它将返回零).
我也尝试使用QRegExpValidator(QRegExp("[0-9]"),但它只允许一个数字.最大数量没有限制,我如何指定QRegExp,最小值为0,最大值为undefined,如果QRegExpValidator是实现它的唯一方法吗?
谢谢
qt ×6
qvalidator ×6
qlineedit ×3
c++ ×2
focus ×1
pyqt ×1
pyqt5 ×1
python ×1
qtableview ×1
regex ×1
validation ×1