假设我有一个QTableWidgetItem项目,我只想验证用户输入的数据。例如,用户只能在该项中输入数字,否则程序将显示警告对话框。
我还在该文档页面上搜索,但没有找到类似于setValidator()函数的功能。
我如何为该QTableWidgetItem项目使用验证器?
我还在该文档页面上搜索,但没有找到类似于setValidator()函数的功能。
我如何为该QTableWidgetItem项目使用验证器?
假设你真正想要的是具有 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*
。(参见 qobject_cast()
)。这有点冗长但可行。setData
函数。如果输入无效值,您可以发出错误消息。createEditor
向编辑器QWidget
添加一个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)));
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
}
QVariant qvarValue(strValue);
double dVal = qvarValue.toDouble(&bRetValue);
if(bRetValue == false)
{
// show dialog to user to enter only numbers
}
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
}