QTableWidget からすべての行を削除しようとしています。これが私が試したことです。
for ( int i = 0; i < mTestTable->rowCount(); ++i )
{
mTestTable->removeRow(i);
}
テーブルに2つの行がありました。しかし、これは単一の行を削除しただけです。理由は、テーブルサイズを固定してテーブルを作成しなかった可能性があります。 rowCount() のQtドキュメントには、
このプロパティは、テーブル内の行数を保持します。
デフォルトでは、行と列のカウントなしで構築されたテーブルの場合、このプロパティには値0が含まれます。
その場合、テーブルからすべての行を削除する最良の方法は何ですか?
行カウントを0に設定するだけです:
mTestTable->setRowCount(0);
QTableWidgetItem
内部モデルコードでわかるように、removeRows
を呼び出すことにより、QTableWidget
sを自動的に削除します。
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);
}
QTableWidget
はわかりませんが、コードに論理的な欠陥があるようです。ループを回るときに、mTestTable->rowCount()
の値を減らしていることを忘れています。 1行削除すると、i
が1になり、mTestTable->rowCount()
も1になるため、ループが停止します。
私はこのようにします
while (mTestTable->rowCount() > 0)
{
mTestTable->removeRow(0);
}
AFAIK setRowCount(0)
は何も削除しません。オブジェクトはまだありますが、表示されなくなります。
yourtable->model()->removeRows(0, yourtable->rowCount());
QTableWidget test;
test.clear();
test.setRowCount( 0);
行を削除する簡単な方法は、行カウントをゼロに設定することです。これは内部でremoveRows()を使用します。
_table->setRowCount(0);
_
コンテンツをクリアしてから、すべての行を削除することもできます。
_table->clearContents();
table->model()->removeRows(0, table->rowCount());
_
両方のスニペットはヘッダーをそのままにします!
ヘッダーも取り除く必要がある場合は、clearContents()
からclear()
に切り替えることができます。
アプリのクラッシュを防ぐために、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);
ビューからヘッダーにないすべてのアイテムを削除します。これにより、すべての選択も削除されます。テーブルの寸法は変わりません。
void QTableWidget::clearContents()
ビュー内のすべてのアイテムを削除します。これにより、すべての選択とヘッダーも削除されます。
void QTableWidget::clear()
コードは最後の行を削除しません。
これを試してください。
int totalRow = mTestTable->rowCount();
for ( int i = 0; i < totalRow ; ++i )
{
mTestTable->removeRow(i);
}
コードでは、初めて、rowCount()
の値は2
であり、i
の値は0
であるため、1
st行を削除し、
ただし、2回目はi
の値が1
で増分されますが、rowCount()
は1になった更新された行カウントを返すため、最後の行は削除されません。
今、あなたが明確になることを願っています。
この投稿を見てください: 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));
}
空のアイテムモデル(QStandardItemModel)をQTableView(myTableView)に追加するだけです。
itemModel = new QStandardItemModel;
ui->myTableView->setModel(itemModel);