假设我有一个 QTableWidgetItem 项目,我只想验证用户输入的数据。例如,用户只需在该项目中输入一个数字,否则程序将显示一个警告对话框。
我也在那个文档页面上搜索,但我没有找到与setValidator()函数类似的函数。
如何为该 QTableWidgetItem 项使用验证器?
假设我有一个 QTableWidgetItem 项目,我只想验证用户输入的数据。例如,用户只需在该项目中输入一个数字,否则程序将显示一个警告对话框。
我也在那个文档页面上搜索,但我没有找到与setValidator()函数类似的函数。
如何为该 QTableWidgetItem 项使用验证器?
假设您真正想要的是拥有-able 单元格,您可以使用实例QValidate
填充单元格。QLineEdit
这是一个使用 的示例QDoubleValidator
,但任何QValidator
都可以:
QLineEdit *edit = new QLineEdit(ui->myTable);
edit->setValidator(new QDoubleValidator(edit));
ui->myTable->setCellWidget(row, col, edit);
默认情况下,QLineEdit
将填充单元格并用框架绘制。为了保持表格的外观,您可以通过先验调用以下函数来关闭框架:
QLineEdit::setFrame(false);
这个解决方案的一个烦人的事情是你必须打电话给
QWidget* QTableWidget::cellWidget(row, col) const
随后访问每个单元格中的 QLineEdit 实例,这意味着您还必须将指针转换为QLineEdit*
。(见qobject_cast()
)。这有点冗长但可行。
我可以想到两种不同的方法来处理这个问题。可能还有其他解决方案。
您可以继承 QTableWidgetItem 并重新实现该setData
功能。如果您选择了无效值,您可能会发出错误消息。
QWidget
您可以继承 QStyledItemDelegate 并通过重新实现createEditor
或重新实现将 QValidator 添加到编辑器setModelData
并检查那里的用户输入。再一次,如果有无效数据,您可以发出错误消息。
检查每个文档,看看哪个更适合您的项目。
我使用这个解决方案,在每个单元格中都有一个 QLineEdit。验证器用于科学数字(例如 2e-17)
for(int trow=0; trow <= 2; trow++ )
{
for(int tcolumn=0; tcolumn <= 3; tcolumn++ )
{
QLineEdit * tableline = new QLineEdit;
tableline->setValidator( new QDoubleValidator(0, 100, 2, this) );
ui->tableWidget->setCellWidget ( trow, tcolumn, tableline);
}
有简单的方法来实现这一点。
只需使用 QTableWidget 的信号之一 - cellChanged(int,int);
QObject::connect(m_pTableWidget, SIGNAL(cellChanged(int,int)),
this, SLOT(OnTableWidgetCellChanged(int,int)));
在槽函数 (OnTableWidgetCellChanged(int row,int column)) 内部,使用带有 column 的 switch case 来单独验证每一列。
从该特定列的用户获取输入文本,并存储为 QString。现在通过传递 bool 变量将 QString 转换为 int 并检查 bool 变量的状态。如果其为假,则用户输入的数字不是有效数字。示例如下所示:
bool bRetValue = false;
QString strValue = m_pTableWidget->item(row, VALUE_INDEX)->text();
int nValue = strValue.toInt(&bRetValue);
if(bRetValue == false)
{
// show dialog to user to enter only numbers
}
如果要转换为 double 或其他类型,只需将值转换为 qvariant 即可,并且可以遵循相同的过程。
QVariant qvarValue(strValue);
double dVal = qvarValue.toDouble(&bRetValue);
if(bRetValue == false)
{
// show dialog to user to enter only numbers
}
如果您想更具体,可以使用 QRegExp 或 QRegularExpression(Qt5)
QRegularExpression regexp("enter regx here",
QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch regxmatch = regexp.match(strValue);
if (regxmatch.hasMatch())
{
// your functionality
}
else
{
// show dialog to user to enter only numbers
}