如何在QTableWidgetItem中使用验证器?

8
假设我有一个QTableWidgetItem项目,我只想验证用户输入的数据。例如,用户只能在该项中输入数字,否则程序将显示警告对话框。
我还在该文档页面上搜索,但没有找到类似于setValidator()函数的功能。
我如何为该QTableWidgetItem项目使用验证器?
4个回答

9

假设你真正想要的是具有 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())。这有点冗长但可行。

不错的解决方法!尽管行编辑器中的第一个单元格(0,0)有点错位。除了第一个单元格之外,每个单元格看起来都很棒,但是第一个单元格似乎太高、太左、太宽和太高了。 - Uroc327

4
我能想到两种不同的方法来处理这个问题。也可能有其他的解决方案。
一种方法是子类化QTableWidgetItem并重新实现setData函数。如果输入无效值,您可以发出错误消息。
另一种方法是子类化QStyledItemDelegate并通过重新实现createEditor向编辑器QWidget添加一个QValidator或重新实现setModelData并检查用户在此输入。同样地,如果存在无效数据,则可以发出错误消息。
请查看每个文档,以确定哪种方法更适合您的项目。
参考链接:QTableWidgetItemQStyledItemDelegate

1

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

1

有一种简单的方法可以实现这个。

只需使用QTableWidget的一个信号 - cellChanged(int,int);

QObject::connect(m_pTableWidget, SIGNAL(cellChanged(int,int)),
                         this, SLOT(OnTableWidgetCellChanged(int,int)));

在插槽函数(OnTableWidgetCellChanged(int row,int column))内,使用switch case语句根据列验证每一列。
从用户那里获取该特定列的输入文本,并将其存储为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
}

这很有帮助,但当用户输入错误时,您无法将项目文本恢复到先前的状态,只能将其设置为默认值。 - Alexander Sobetskiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接