QTableView的selectedItems中所选行/行的顺序

时间:2011-05-04 07:23:45

标签: c++ qt qt4 clipboard qtableview

我正在使用QTableWidget并希望将一些单元格复制到剪贴板。似乎QTableWidget仅支持selectedItems方法。 出于某种原因,我将输出作为第一列,然后是第二列。不是:第一行,然后是第二行。这使得在某种程度上难以分离cols / rows。你知道出了什么问题吗?谢谢!

  QList<QTableWidgetItem *> selectedCells(TableView->selectedItems());
  QTableWidgetItem * item;

  mCopyByteArray.clear();

  foreach(item, selectedCells)
  {
    mCopyByteArray.append(item->text());
    mCopyByteArray.append("\r\n");
  }

构建时:

  TableView = new QTableWidget(); /* I know that name somehow is wrong ;) */
  TableView->setColumnCount(2);

  QStringList HHeaderList;
  HHeaderList << "Computer name" << "ServiceTag";
  TableView->setHorizontalHeaderLabels(HHeaderList);
  TableView->verticalHeader()->setVisible(false);
  TableView->setEditTriggers(QTableWidget::NoEditTriggers); 

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:0)

您可以改用QTableWidget::selectedRanges()。小例子:

#include <QList>
#include <QTableWidget>
#include <QTableWidgetSelectionRange>

/...

// you can have more than one selected areas in the table. So you can have more then one
// selected ranges
QList <QTableWidgetSelectionRange*> selectRanges(TableView->selectedRanges());

for (int i =0; i != selectRanges.size(); ++i) {
  QTableWidgetSelectionRange range = selectRanges.at(i);
  int top = range.topRow();
  int bottom = range.bottomRow();
  for (int i = top; i <= bottom; ++i) {
    QTableWidgetItem *item1 = TableView->itemAt(i, 0); //first column item
    QTableWidgetItem *item2 = TableView->itemAt(i, 1); //second column item
    // do desired stuff
  }
}

注意:我不知道这种方法的性能问题。你可以查一下。

答案 1 :(得分:0)

我写的这个算法应该可以解决这个问题:

QList<QTableWidgetItem *> selectedCells(TableView->selectedItems());

mCopyByteArray.clear();

QString text;
int row_count = TableView->rowCount();
int column_count = TableView->columnCount();

for( int i = 0; i < row_count; i++ )
{
    for( int j = 0; j < column_count; j++ )
    {
        text = selectedCells.at( i + j * row_count )->text();

        mCopyByteArray.append( text );
        mCopyByteArray.append( "\r\n" );
    }
}

答案 2 :(得分:0)

不是真正的答案,而是我发现的更多信息:

似乎selectedItems()函数返回所选项目的顺序是它们被选中的顺序。

此外,如果selectionBehavior的{​​{1}}属性设置为QTableWidget,则会按照选择行的顺序返回所选项目。例如,对于2x3表,其中行编号为“A”,“B”,列编号为“1”,“2”,“3”:如果选择B2然后选择A1,则所选项目为返回为:B1,B2,B3,A1,A2,A3。