2

QTableWidgetボタンを押して行を追加できる があります。問題は_table->setSortingEnabled(true);、新しい行を挿入するときに、それがどこにあるかわからないことです。テーブルを並べ替え可能に設定したため、行を追加すると、この行はその位置に移動します (並べ替えられる列によって異なります)。それがどれであるかをどうやって知ることができますか?

アルファベット順に並べ替えられた 1 つの列 (名前) の例:

Name |
------
abc
toto
zozo

次のような行を追加すると:

int newRow = _table->rowCount();

_table->insertRow(newRow);

QTableWidgetItem *item1 = new QTableWidgetItem;
item1->setText("boom");
_table->setItem(newRow, 0, item1);

行は「abc」と「toto」の間になります。

Name |
------
abc
     <<< boom
toto
zozo

ここでは正常に動作しますが、複数の列があり、たとえば試してみると次のようになります。

QTableWidgetItem *item2 = new QTableWidgetItem;
item1->setText("45");
_table->setItem(newRow, 1, item2);

変更される値は、「zozo」の 2 列目の値であり、必要な「boom」ではありません。

問題を例で説明しようとしましたが、役に立てば幸いです。でソートを有効にしている場合、新しい行を追加し、各列のテキストを設定するにはどうすればよいQTableWidgetですか?

編集:非爆発性からの回答(コメント内):

2番目の次のようにする必要がありますQWidgetItem

QTableWidgetItem *item2 = new QTableWidgetItem;
item1->setText("45");
_table->setItem(item1->row(), 1, item2); // change newRow by item1->row()
4

3 に答える 3

2

挿入する前に setSortingEnabled(false) を使用して並べ替えを無効にし、終了後に再度有効にする必要がある場合があります。

于 2015-03-09T06:01:09.200 に答える
1

すべての行のIDを含む非表示の列を作成するため、行を追加するときに、void QTableWidget scrollToItem (const QTableWidgetItem *item , QAbstractItemView::ScrollHint hint=EnsureVisible )テーブルをその行にスクロールするだけです。

アイテムが確実に見えるようにするために、必要に応じてビューをスクロールします。ヒント パラメーターは、操作後に項目を配置する場所をより正確に指定します。

行IDを取得したら、void QTableWidgetItem::setBackground ( const QBrush & brush )次の新しい行が追加されるまで、新しい行の色を(セルごとに)変更することもできます。

これらの両方の提案を行うと、新しく追加された行が確実に表示されます。

于 2013-08-27T15:00:55.707 に答える
0

まず、を使用して新しい行を挿入する必要がありますrowCount

int row = table->rowCount();
table->insertRow(row);

次に、最初 QTableWidgetItemに呼び出す必要がありQTableWidget::setItem(row, item)ますrowCount

table->setItem(row, item);

以降 は最初からQTableWidgetItems使いますが、ソートにより移動した可能性がありますQTableWidgetItem::row()QTableWidgetItem

table->setItem(first_item->row, item);

whenとwhenQTableWidget::setItem(row, item)を使用してループ内から呼び出す例を次に示します。rowindex == 0item[0]index != 0

void App::onAddRow()
{
    std::vector<QTableWidgetItem*> items;

    items.push_back(new QTableWidgetItem("foo"));
    items.push_back(new QTableWidgetItem("bar"));
    items.push_back(new QTableWidgetItem("baz"));
    items.push_back(new QTableWidgetItem("bang"));

    int row = table->rowCount();
    table->insertRow(row);

    for (size_t i = 0; i < items.size(); ++i)
    {
        table->setItem(i == 0 ? row : items[0]->row(), i, items[i]);
    }
}
于 2016-03-23T15:57:42.470 に答える