0

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 まで)。

ヒープからメモリを完全に消去するにはどうすればよいですか?

4

1 に答える 1

0

その新しいものが必要です。奇妙なことに、clearContents()はそれらを取り除く必要があります。使用できる他の関数はclear()関数ですが、これら2つの違いは、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();
}

これがあなたが漏れているところだと確信していますか?

于 2012-02-08T03:57:40.650 に答える