1

根据标题,如何删除本地创建的多个 QIntValidator 指针对象。我遇到了内存泄漏问题。

我有一个功能如下:

void ABC::setTableDataItems(QStringList headerData)
{
    int row = headerData.size();

    int column = 0;

    if (_txtLineEdit != NULL) {
            delete _txtLineEdit;
            _txtLineEdit = 0;
    }


for (int i = 0; i < row ; i++)
{
    _txtLineEdit = new QLineEdit();
    _txtLineEdit->setMaxLength(_pktStruct[i].ItemDataLength);
    _txtLineEdit->setText(headerData.at(i));
    _pktStruct[i].currentLine = _txtLineEdit;

    QString regExp = "[01]{1,";
    regExp.append(QString("%1").arg(_pktStruct[i].ItemDataLength)).append("}");
    long maxDigit = getMaxValueForDigit( _pktStruct[i].ItemDataLength );

    QIntValidator* decValidator = new QIntValidator( 0, maxDigit, _txtLineEdit      );
    QRegExpValidator* binValidator = new QRegExpValidator(QRegExp(regExp),_txtLineEdit);


    switch (_pktStruct[i].ItemDataType)
    {
    case DATA_TYPE_ASCII:
        break;

    case DATA_TYPE_HEX:
        break;

    case DATA_TYPE_NUM:
        _txtLineEdit->setValidator(decValidator);
        break;

    case DATA_TYPE_BINARY:
        _txtLineEdit->setValidator(binValidator);
        break;

    case DATA_TYPE_MAX:
        break;
    }

    ui->pcusim_cmd_task_tableWidget->setCellWidget(i, column, _txtLineEdit);
    connect(_txtLineEdit, SIGNAL(textChanged(QString)), this, SLOT(on_pcusim_cmd_task_tableWidget_linedit_cellChanged(QString)));
}

 }

在上述函数中,每次调用上述函数时,我都需要在循环之前删除所有动态创建的多个 QIntValidator(在 For Loop 内)。

不知道路。请提供一些建议/想法以进一步进行?

提前致谢

4

1 回答 1

2

你为什么不做

  QValidator* pValidator = NULL;
  switch (_pktStruct[i].ItemDataType)
  {
  case DATA_TYPE_NUM:
    // create the proper int validator here        
    // ...
    pValidator = new QIntValidator(0, maxDigit, _txtLineEdit);
    break;

  case DATA_TYPE_BINARY:
    // create the proper regexp validator here
    // ...
    pValidator = new QRegExpValidator(QRegExp(regExp),_txtLineEdit);        
    break;
  }

  _txtLineEdit->setValidator(pValidator);

这样您就不会创建未使用的验证器。
由于您在构造验证器时将 _txtLineEdit 作为父级传递,因此当它们的父级 QLineEdit 对象被销毁时,它们将被删除。
顺便说一句,setCellWidget()拥有小部件的所有权,所以你不需要delete _txtLineEdit;(假设这是你传递给它的那个,在这种情况下你应该创建一个它们的列表)

于 2013-04-04T09:27:19.887 回答