web-dev-qa-db-ja.com

QTableWidgetからすべての行を削除する方法

QTableWidget からすべての行を削除しようとしています。これが私が試したことです。

for ( int i = 0; i < mTestTable->rowCount(); ++i )
{
    mTestTable->removeRow(i);
}

テーブルに2つの行がありました。しかし、これは単一の行を削除しただけです。理由は、テーブルサイズを固定してテーブルを作成しなかった可能性があります。 rowCount() のQtドキュメントには、

このプロパティは、テーブル内の行数を保持します。

デフォルトでは、行と列のカウントなしで構築されたテーブルの場合、このプロパティには値0が含まれます。

その場合、テーブルからすべての行を削除する最良の方法は何ですか?

33
vinayan

行カウントを0に設定するだけです:

mTestTable->setRowCount(0);

QTableWidgetItem内部モデルコードでわかるように、removeRowsを呼び出すことにより、QTableWidgetsを自動的に削除します。

void QTableModel::setRowCount(int rows)
{
    int rc = verticalHeaderItems.count();
    if (rows < 0 || rc == rows)
        return;
    if (rc < rows)
        insertRows(qMax(rc, 0), rows - rc);
    else
        removeRows(qMax(rows, 0), rc - rows);
}
74
alexisdm

QTableWidgetはわかりませんが、コードに論理的な欠陥があるようです。ループを回るときに、mTestTable->rowCount()の値を減らしていることを忘れています。 1行削除すると、iが1になり、mTestTable->rowCount()も1になるため、ループが停止します。

私はこのようにします

while (mTestTable->rowCount() > 0)
{
    mTestTable->removeRow(0);
}
28
john

AFAIK setRowCount(0)は何も削除しません。オブジェクトはまだありますが、表示されなくなります。

yourtable->model()->removeRows(0, yourtable->rowCount());
11
damkrat
QTableWidget test;
test.clear();
test.setRowCount( 0);
5
Alex Gurkin

行を削除する簡単な方法は、行カウントをゼロに設定することです。これは内部でremoveRows()を使用します。

_table->setRowCount(0);
_

コンテンツをクリアしてから、すべての行を削除することもできます。

_table->clearContents();
table->model()->removeRows(0, table->rowCount());
_

両方のスニペットはヘッダーをそのままにします!

ヘッダーも取り除く必要がある場合は、clearContents()からclear()に切り替えることができます。

3
Jens A. Koch

アプリのクラッシュを防ぐために、QTableViewからすべての信号を切断します。

// Deselects all selected items
ui->tableWidget->clearSelection();

// Disconnect all signals from table widget ! important !
ui->tableWidget->disconnect();

// Remove all items
ui->tableWidget->clearContents();

// Set row count to 0 (remove rows)
ui->tableWidget->setRowCount(0);
2
Rémi Debord

ビューからヘッダーにないすべてのアイテムを削除します。これにより、すべての選択も削除されます。テーブルの寸法は変わりません。

void QTableWidget::clearContents()

ビュー内のすべてのアイテムを削除します。これにより、すべての選択とヘッダーも削除されます。

void QTableWidget::clear()
0
user2076767

コードは最後の行を削除しません。

これを試してください。

int totalRow = mTestTable->rowCount();
for ( int i = 0; i < totalRow ; ++i )
{
       mTestTable->removeRow(i);
}

コードでは、初めて、rowCount()の値は2であり、iの値は0であるため、1st行を削除し、

ただし、2回目はiの値が1で増分されますが、rowCount()は1になった更新された行カウントを返すため、最後の行は削除されません。

今、あなたが明確になることを願っています。

0
AB Bolim

この投稿を見てください: http://forum.qt.io/topic/1715/qtablewidget-how-to-delete-a-row

QList<QTableWidgetItem*> items = table.findItems(.....);
QMap<int, int> rowsMap;
for(int i = 0; i < items.count(); i++{
  rowsMap[items.at(i).row()] = -1; //garbage value
}
QList<int> rowsList = rowsMap.uniqueKeys();
qSort(rowsList);

//Now go through your table and delete rows in descending order as content would shift up and hence cannot do it in ascending order with ease.
for(int i = rowList.count() - 1; i >= 0; i--){
  table.removeRow(rowList.at(i));
}
0
d.danailov

空のアイテムモデル(QStandardItemModel)をQTableView(myTableView)に追加するだけです。

itemModel = new QStandardItemModel;
ui->myTableView->setModel(itemModel);
0
Alex