如何在QTableWidgetItem中使用验证器?

时间:2013-08-19 08:45:12

标签: c++ qt qtablewidgetitem

假设我有一个QTableWidgetItem项,我只想验证用户输入的数据。例如,用户只在该项中输入一个数字,否则程序将显示一个警告对话框。

我也在that document page上搜索,但我没有找到与 setValidator()功能类似的功能。

如何为该QTableWidgetItem项使用验证器?

谢谢!

4 个答案:

答案 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。如果数据无效,您可以再次发出错误消息。

检查每个文档,看看哪个更适合您的项目。

QTableWidgetItem

QStyledItemDelegate

答案 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
}