假设我有一个QTableWidgetItem项,我只想验证用户输入的数据。例如,用户只在该项中输入一个数字,否则程序将显示一个警告对话框。
我也在that document page上搜索,但我没有找到与 setValidator()功能类似的功能。
如何为该QTableWidgetItem项使用验证器?
谢谢!
答案 0 :(得分:4)
假设您真正想要的是拥有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()
)。它有点冗长但可行。
答案 1 :(得分:2)
我可以想到两种不同的方法来处理这个问题。也可能有其他解决方案。
您可以继承QTableWidgetItem并重新实现setData
函数。如果您选择了无效值,则可以发出错误消息。
您可以继承QStyledItemDelegate,并通过重新实现QWidget
或重新实现createEditor
并在那里检查用户输入,将QValidator添加到编辑器setModelData
。如果数据无效,您可以再次发出错误消息。
检查每个文档,看看哪个更适合您的项目。
答案 2 :(得分:0)
我使用这个解决方案,你在每个单元格中都有一个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);
}
答案 3 :(得分:0)
有一个简单的方法可以实现这一目标。
只需使用QTableWidget的信号之一-cellChanged(int,int);
QObject::connect(m_pTableWidget, SIGNAL(cellChanged(int,int)),
this, SLOT(OnTableWidgetCellChanged(int,int)));
内部插槽函数(OnTableWidgetCellChanged(int row,int column))中,使用带列的开关盒分别验证每个列。
从该特定列的用户获取输入文本,并存储为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
}