0

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

  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); 

有任何想法吗?谢谢!

4

3 回答 3

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
  }
}

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

于 2011-05-04T08:14:01.483 回答
0

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

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

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

于 2011-06-19T10:16:32.513 回答
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" );
    }
}
于 2011-05-04T08:25:34.600 回答