порядок выбранных строк / строк в selectedItems QTableView - PullRequest
0 голосов
/ 04 мая 2011

Я использую 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); 

Есть идеи? Спасибо!

Ответы [ 3 ]

0 голосов
/ 04 мая 2011

Этот алгоритм, который я написал, должен помочь:

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" );
    }
}
0 голосов
/ 19 июня 2011

Не совсем ответ, но некоторая дополнительная информация, которую я обнаружил:

Кажется, что порядок, в котором выбранные элементы возвращаются функцией selectedItems(), является порядком, в котором они были выбраны.

Кроме того, если для свойства selectionBehavior QTableWidget установлено значение SelectRows, выбранные элементы возвращаются в том порядке, в котором были выбраны строки.Например, для таблицы 2x3, где строки нумеруются «A», «B», а столбцы нумеруются «1», «2», «3»: если вы выберете «B2», а затем «A1», то выбранные элементы будутвозвращается как: B1, B2, B3, A1, A2, A3.

0 голосов
/ 04 мая 2011

Вместо этого вы можете использовать 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
  }
}

Примечание: я не знаю о проблемах производительности для этого подхода.Вы можете проверить это.

...