Использование кучи в QTableWidget в Qt - PullRequest
0 голосов
/ 07 февраля 2012

Я пытаюсь подчеркнуть, что моя программа, которая в основном обновляет с другим числом строк, QTableWidget

Каждый раз, когда я делаю какое-то действие, я хочу изменить размер таблицы, но перед этим, если захочучтобы очистить его и вместе с ним содержимое его ячейки.

Что я испытываю, так это то, что куча, отслеживаемая из моего монитора ресурсов, только увеличивается.

Это часть кода, которую я запускаю, когдаЯ нажимаю кнопку в моем приложении:

MyClass::updateTable(int nrows)
{
    ui->tableWidget->clearContents(); // this is to free the memory but the heap always grows
    for (int i=0; i<nrows; i++)
    {
        // I don't like this new I don't know when the destructor is called here!!
        QTableWidgetItem *item = new QTableWidgetItem();
        item->setText("SOMETEXT");
        ui->tableWidget->setItem(i,0,idItem);
    }
}

количество строк, указанное в int nrows, является очень переменным числом (от 10 до 10 ^ 5).

Как мнеочистить память полностью из кучи?

1 Ответ

0 голосов
/ 08 февраля 2012

Это новое необходимо.Странно то, что clearContents () должен избавиться от них.Другая функция, которую вы можете использовать, - это функция clear (), но единственное различие между этими двумя заключается в том, что clear сначала удалит заголовки, а затем вызовет clearContents (), которая и выполняет фактическое удаление элементов.

На самом деле, посмотрите на код для этих функций:

void QTableModel::clear()
{
    for (int j = 0; j < verticalHeaderItems.count(); ++j) {
        if (verticalHeaderItems.at(j)) {
            verticalHeaderItems.at(j)->view = 0;
            delete verticalHeaderItems.at(j);
            verticalHeaderItems[j] = 0;
        }
    }
    for (int k = 0; k < horizontalHeaderItems.count(); ++k) {
        if (horizontalHeaderItems.at(k)) {
            horizontalHeaderItems.at(k)->view = 0;
            delete horizontalHeaderItems.at(k);
            horizontalHeaderItems[k] = 0;
        }
    }
    clearContents();
}

void QTableModel::clearContents()
{
    for (int i = 0; i < tableItems.count(); ++i) {
        if (tableItems.at(i)) {
            tableItems.at(i)->view = 0;
            delete tableItems.at(i); //Your item should get deleted here
            tableItems[i] = 0;
        }
    }
    reset();
}

Вы уверены, что это то место, где у вас есть утечка?

...