【问题标题】:Qt4 - How to add a row in a QTableWidget when sorting is enable?Qt4 - 启用排序时如何在 QTableWidget 中添加一行?
【发布时间】:2013-08-09 16:14:30
【问题描述】:

我有一个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 上启用了排序功能,如何添加新行并为其每一列设置文本?

编辑:非爆炸性的回答(在 cmets 中):

只需要关注第二个QWidgetItem

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

【问题讨论】:

  • 查看QTableWidgetItem::row() 以获取item1 的行
  • 为此使用模型/视图可能更容易,但为什么不将行插入到最后并按最后一列排序呢?

标签: qt4 qtablewidget


【解决方案1】:

您可能需要在插入之前通过 setSortingEnabled(false) 禁用排序,并在完成后重新启用它。

【讨论】:

    【解决方案2】:

    创建将包含每行 id 的隐藏列,因此当您添加行时,只需使用 void QTableWidget scrollToItem (const QTableWidgetItem *item , QAbstractItemView::ScrollHint hint=EnsureVisible ) 将表格滚动到该行。

    如有必要,滚动视图以确保项目可见。这 提示参数更精确地指定项目应该在哪里 位于手术后。

    获得行 ID 后,您还可以使用 void QTableWidgetItem::setBackground ( const QBrush &amp; brush ) 更改新行的颜色(逐个单元格),直到添加下一个新行。

    执行这两个建议将确保您可以看到新添加的行。

    【讨论】:

      【解决方案3】:

      首先你需要使用rowCount插入一个新行

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

      那么对于第一个QTableWidgetItem,您需要使用rowCount

      调用QTableWidget::setItem(row, item)
      table->setItem(row, item);
      

      对于后续 QTableWidgetItems,您使用第一个QTableWidgetItem 中的QTableWidgetItem::row(),这可能由于排序而移动了

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

      这是一个在循环中调用QTableWidget::setItem(row, item) 的示例,其中index == 0 时使用rowindex != 0 时使用item[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]);
          }
      }
      

      【讨论】:

      • 这仅在您按第一列对表格进行排序时才有效。您可以做的是首先插入已排序列的项目并存储该项目的行。然后您可以使用此行插入所有其他项目。我发现禁用和重新启用排序更简单。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2018-12-10
      相关资源
      最近更新 更多