2

我有一个QTableWidget可以通过按下按钮添加行的方法。问题是我有_table->setSortingEnabled(true);,当我插入新行时,我不知道它在哪里。因为由于我已将表格设置为可排序,所以当我添加一行时,该行将移动到它的位置(取决于对哪一列进行排序)。那我怎么知道是哪一个呢?

一列(名称)按字母顺序排序的示例:

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”第二列的值,而不是我想要的“boom”。

我试图用一个例子来解释这个问题,我希望它有所帮助。那么如何添加一个新行,如果我在我的QTableWidget?

编辑:来自非爆炸性的回答(在评论中):

只需要对第二个进行如下操作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);

这是从循环中调用的示例QTableWidget::setItem(row, item),您可以在其中使用rowwhenindex == 0item[0]when 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 回答