6

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

我也在那个文档页面上搜索,但我没有找到与setValidator()函数类似的函数。

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

4

4 回答 4

7

假设您真正想要的是拥有-able 单元格,您可以使用实例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())。这有点冗长但可行。

于 2014-02-25T10:55:15.427 回答
3

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

您可以继承 QTableWidgetItem 并重新实现该setData功能。如果您选择了无效值,您可能会发出错误消息。

QWidget您可以继承 QStyledItemDelegate 并通过重新实现createEditor或重新实现将 QValidator 添加到编辑器setModelData并检查那里的用户输入。再一次,如果有无效数据,您可以发出错误消息。

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

QTableWidgetItem

QStyledItemDelegate

于 2013-08-19T08:57:50.863 回答
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);
    }
于 2016-09-28T12:16:30.900 回答
0

有简单的方法来实现这一点。

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

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

在槽函数 (OnTableWidgetCellChanged(int row,int column)) 内部,使用带有 column 的 switch case 来单独验证每一列。

从该特定列的用户获取输入文本,并存储为 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
}
于 2020-07-19T17:34:49.377 回答