• 2993阅读
  • 3回复

两个关于QTableWidget的问题 [复制链接]

上一主题 下一主题
离线qazaq408
 

只看楼主 倒序阅读 楼主  发表于: 2017-04-05
  1.           QTableWidget类有个清除函函数clearContents(),文档上说这个函数作用是删除除了表头以外所有的items,那我想问下,加入这个QTableWidget上面的item都是动态生成的,即
  1. tableWidgets->setItem(1,1,new QTableWidgetItem("名字");
对于这样生成的item,使用clearContents()函数会不会出现内存泄漏?

2.     程序中关于QTableWidget有个功能,需要知道选中了第几行,所以我用currentRow()函数来获得,文档里关于这个函数的说明是返回当前选中的行的索引,我想请问下如果我没有选中任何行(比如程序的Focus此时不在QTableWidget上,而在另一个编辑框上),此时调用currentRow()他返回什么?
        我做了下测试
  1. lineEdits->setText(QString::number(tableWidget->currentRow()));
   但是当此时行编辑器里什么都没显示,如果我选中了某一个,行编辑器确实会显示选中行的索引

我想问下这个问题怎么解决?或者说,有没有办法知道QTableWidget上有没有行被选中




离线zjmmlab

只看该作者 1楼 发表于: 2017-04-05
1、[slot] void QTableWidget::clearContents()

    Removes all items not in the headers from the view. This will also remove all selections.
    The table dimensions stay the same.
    This function was introduced in Qt 4.2

    文档写得清楚,clearContents() 只是删除了 items,但是保留了空的格子(原来有多少 item 就留下多少格子)。
    如果要不留空白应该用 removeRow() 。不会内存泄漏。

2、currentRow() 只能得到当前选中的某行的索引。
     如果要知道选中了几行以及各行的索引(不一定是连续的),应该用 selectedItems() 。简单写个代码:


      QList<QTableWidgetItem *> items = pTable->selectedItems();
      QList<int> rows;
      foreach (auto *item, items) {
          int row = item->row();
          if (!rows.containts(row))
              rows.append(row);
      }
      rows.count(); // 选中行数
      foreach (auto i, rows) {
           cout << i;  // 各行索引
      }          


离线qazaq408

只看该作者 2楼 发表于: 2017-04-05
回 zjmmlab 的帖子
zjmmlab:1、[slot] void QTableWidget::clearContents()
    Removes all items not in the headers from the view. This will also remove all selections.
    The table dimensions stay the same.
    This function  .. (2017-04-05 19:58) 

第二个问题,我的意思是,当QTableWidget中没有任意一行被选中,比如鼠标点了一下程序别的地方,这时候调用currentRow()他返回值是什么?
离线zjmmlab

只看该作者 3楼 发表于: 2017-04-06
回 qazaq408 的帖子
qazaq408:
第二个问题,我的意思是,当QTableWidget中没有任意一行被选中,比如鼠标点了一下程序别的地方,这时候调用currentRow()他返回值是什么?

返回值为 -1。
快速回复
限100 字节
 
上一个 下一个