如何将验证器与QTableWidgetItem一起使用

How to use a validator with QTableWidgetItem?

本文关键字:QTableWidgetItem 一起 验证      更新时间:2023-10-16

假设我有一个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实例,这意味着您还必须将指针强制转换为QLineEdit*。(参见qobject_cast())。这有点冗长,但可行。

我可以想出两种不同的方法来处理这个问题。可能还有其他解决方案。

您可以对QTableWidgetItem进行子类化,并重新实现setData函数。如果获取了无效值,则可能会发出错误消息。

您可以将QStyledItemDelegate子类化,然后通过重新实现createEditor将QValidator添加到编辑器QWidget,或者重新实现setModelData并检查那里的用户输入。同样,如果存在无效数据,则可以发出错误消息。

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

QTableWidgetItem

QStyledItemDelegate

我使用这个解决方案,在每个单元格中都有一个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)));

在slot函数(OnTableWidgetCellChanged(int row,int column))中,使用带列的开关用例来分别验证每一列。

从该特定列的用户处获取输入文本,并存储为QString。现在,通过传递bool变量将该QString转换为int,并检查bool变量的状态。如果为false,则用户输入的数字无效。示例如下:

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
}
相关文章:
  • 没有找到相关文章