Выбранные строки в QTableView, скопируйте в QClipboard

Я думаю, что Вы - ручей без весла здесь. Командная строка имеет предел для аргументов для вызова программы.

у меня есть 2 предложения, которые Вы могли попробовать. Во-первых, до запущения junit тестов, можно позволить script/ant_task создать БАНКИ различных классов на пути к классу. Тогда можно поместить Банки на путь к классу, который должен быть короче.

Иначе Вы могли попробовать, должен создать antscript для выполнения JUNIT, у МУРАВЬЯ не должно быть такого предела для записей пути к классу.

15
задан Sid S 12 May 2018 в 01:28
поделиться

7 ответов

Чтобы фактически зафиксировать выбор, вы используете модель выбора представления элемента, чтобы получить список индексов . Учитывая, что у вас есть QTableView * с именем view , вы получите выбор следующим образом:

QAbstractItemModel * model = view->model();
QItemSelectionModel * selection = view->selectionModel();
QModelIndexList indexes = selection->selectedIndexes();

Затем выполните цикл по списку индексов, вызывая model-> data (index) по каждому индексу. Преобразуйте данные в строку, если это еще не сделано, и объедините каждую строку вместе. Затем вы можете использовать QClipboard.setText , чтобы вставить результат в буфер обмена. Обратите внимание, что в Excel и Calc каждый столбец отделяется от следующего новой строкой («\ n»), а каждая строка отделяется табуляцией («\ t»). Вы должны проверить индексы, чтобы определить, когда вы перейдете к следующей строке.

QString selected_text;
// You need a pair of indexes to find the row changes
QModelIndex previous = indexes.first();
indexes.removeFirst();
foreach(const QModelIndex &current, indexes)
{
    QVariant data = model->data(current);
    QString text = data.toString();
    // At this point `text` contains the text in one cell
    selected_text.append(text);
    // If you are at the start of the row the row number of the previous index
    // isn't the same.  Text is followed by a row separator, which is a newline.
    if (current.row() != previous.row())
    {
        selected_text.append('\n');
    }
    // Otherwise it's the same row, so append a column separator, which is a tab.
    else
    {
        selected_text.append('\t');
    }
    previous = current;
}
QApplication.clipboard().setText(selected_text);

Предупреждение : у меня не было возможности попробовать этот код,

26
ответ дан 1 December 2019 в 00:16
поделиться

Что вам нужно сделать, так это получить доступ к текстовым данным в модели, а затем передать этот текст в QClipboard .

Для доступа к текстовым данным в модель, используйте QModelIndex :: data () . Аргументом по умолчанию является Qt :: DisplayRole , то есть отображаемый текст.

После того, как вы получили текст, передайте этот текст в буфер обмена с помощью QClipboard :: setText () .

1
ответ дан 1 December 2019 в 00:16
поделиться

Не могу не заметить, что вы можете упростить свой код, используя конструкцию foreach () и класс QStringList , который имеет удобный join () функция.

void Widget::copy()
{
   QStringList list ;
   foreach ( const QModelIndex& index, tableView->selectedIndexes() )
   {
      list << index.data() ;
   }

   clipboard->setText( list.join( ", " ) ) ;
}
0
ответ дан 1 December 2019 в 00:16
поделиться

Наконец-то я понял, спасибо.

void Widget::copy() {

QItemSelectionModel *selectionM = tableView->selectionModel();
QModelIndexList selectionL = selectionM->selectedIndexes();

selectionL.takeFirst(); // ID, not necessary
QString *selectionS = new QString(model->data(selectionL.takeFirst()).toString());
selectionS->append(", ");
selectionS->append(model->data(selectionL.takeFirst()).toString());
selectionS->append(", ");
selectionS->append(model->data(selectionL.takeFirst()).toString());
selectionS->append(", ");
selectionS->append(model->data(selectionL.takeFirst()).toString());

clipboard->setText(*selectionS);
}

и

connect (tableView, SIGNAL(clicked(QModelIndex)), this, SLOT(copy()));
0
ответ дан 1 December 2019 в 00:16
поделиться

У меня была похожая проблема и оказалась адаптация QTableWidget (что является расширением QTableView) для добавления функциональности копирования / вставки. Вот код, который основывается на том, что было предоставлено кварков выше:

qtablewidgetwithcopypaste.h

// QTableWidget with support for copy and paste added
// Here copy and paste can copy/paste the entire grid of cells
#ifndef QTABLEWIDGETWITHCOPYPASTE_H
#define QTABLEWIDGETWITHCOPYPASTE_H

#include <QTableWidget>
#include <QKeyEvent>
#include <QWidget>

class QTableWidgetWithCopyPaste : public QTableWidget
{
    Q_OBJECT
public:
  QTableWidgetWithCopyPaste(int rows, int columns, QWidget *parent = 0) :
      QTableWidget(rows, columns, parent)
  {}

  QTableWidgetWithCopyPaste(QWidget *parent = 0) :
  QTableWidget(parent)
  {}

private:
  void copy();
  void paste();

public slots:
  void keyPressEvent(QKeyEvent * event);
};

#endif // QTABLEWIDGETWITHCOPYPASTE_H

qtablewidwithcopypyt.cpp

#include "qtablewidgetwithcopypaste.h"
#include <QApplication>
#include <QMessageBox>
#include <QClipboard>
#include <QMimeData>

void QTableWidgetWithCopyPaste::copy()
{
    QItemSelectionModel * selection = selectionModel();
    QModelIndexList indexes = selection->selectedIndexes();

    if(indexes.size() < 1)
        return;

    // QModelIndex::operator < sorts first by row, then by column.
    // this is what we need
//    std::sort(indexes.begin(), indexes.end());
    qSort(indexes);

    // You need a pair of indexes to find the row changes
    QModelIndex previous = indexes.first();
    indexes.removeFirst();
    QString selected_text_as_html;
    QString selected_text;
    selected_text_as_html.prepend("<html><style>br{mso-data-placement:same-cell;}</style><table><tr><td>");
    QModelIndex current;
    Q_FOREACH(current, indexes)
    {
        QVariant data = model()->data(previous);
        QString text = data.toString();
        selected_text.append(text);
        text.replace("\n","<br>");
        // At this point `text` contains the text in one cell
        selected_text_as_html.append(text);

        // If you are at the start of the row the row number of the previous index
        // isn't the same.  Text is followed by a row separator, which is a newline.
        if (current.row() != previous.row())
        {
            selected_text_as_html.append("</td></tr><tr><td>");
            selected_text.append(QLatin1Char('\n'));
        }
        // Otherwise it's the same row, so append a column separator, which is a tab.
        else
        {
            selected_text_as_html.append("</td><td>");
            selected_text.append(QLatin1Char('\t'));
        }
        previous = current;
    }

    // add last element
    selected_text_as_html.append(model()->data(current).toString());
    selected_text.append(model()->data(current).toString());
    selected_text_as_html.append("</td></tr>");
    QMimeData * md = new QMimeData;
    md->setHtml(selected_text_as_html);
//    qApp->clipboard()->setText(selected_text);
    md->setText(selected_text);
    qApp->clipboard()->setMimeData(md);

//    selected_text.append(QLatin1Char('\n'));
//    qApp->clipboard()->setText(selected_text);
}

void QTableWidgetWithCopyPaste::paste()
{
    if(qApp->clipboard()->mimeData()->hasHtml())
    {
        // TODO, parse the html data
    }
    else
    {
        QString selected_text = qApp->clipboard()->text();
        QStringList cells = selected_text.split(QRegExp(QLatin1String("\\n|\\t")));
        while(!cells.empty() && cells.back().size() == 0)
        {
            cells.pop_back(); // strip empty trailing tokens
        }
        int rows = selected_text.count(QLatin1Char('\n'));
        int cols = cells.size() / rows;
        if(cells.size() % rows != 0)
        {
            // error, uneven number of columns, probably bad data
            QMessageBox::critical(this, tr("Error"),
                                  tr("Invalid clipboard data, unable to perform paste operation."));
            return;
        }

        if(cols != columnCount())
        {
            // error, clipboard does not match current number of columns
            QMessageBox::critical(this, tr("Error"),
                                  tr("Invalid clipboard data, incorrect number of columns."));
            return;
        }

        // don't clear the grid, we want to keep any existing headers
        setRowCount(rows);
        // setColumnCount(cols);
        int cell = 0;
        for(int row=0; row < rows; ++row)
        {
            for(int col=0; col < cols; ++col, ++cell)
            {
                QTableWidgetItem *newItem = new QTableWidgetItem(cells[cell]);
                setItem(row, col, newItem);
            }
        }
    }
}

void QTableWidgetWithCopyPaste::keyPressEvent(QKeyEvent * event)
{
    if(event->matches(QKeySequence::Copy) )
    {
        copy();
    }
    else if(event->matches(QKeySequence::Paste) )
    {
        paste();
    }
    else
    {
        QTableWidget::keyPressEvent(event);
    }

}
13
ответ дан 1 December 2019 в 00:16
поделиться

По какой-то причине у меня не было доступа к функции std :: sort, однако я обнаружил, что в качестве изящной альтернативы решению Корвина Джоя функцию сортировки можно реализовать, заменив

 std::sort(indexes.begin(), indexes.end());

на

  qSort(indexes);

Это то же самое, что написать:

 qSort(indexes.begin(), indexes.end());

Спасибо за полезный код, ребята!

4
ответ дан 1 December 2019 в 00:16
поделиться

Осторожнее с последним элементом. Обратите внимание ниже, индексы могут стать пустыми после 'removeFirst()'. Таким образом, 'current' никогда не будет действительным и не должен использоваться в model()->data(current).

  indexes.removeFirst();
  QString selected_text;
  QModelIndex current;
  Q_FOREACH(current, indexes)
  {
  .
  .
  .
  }
  // add last element
  selected_text.append(model()->data(current).toString());

Рассмотрим

  QModelIndex last = indexes.last();
  indexes.removeFirst();
  QString selected_text;
  Q_FOREACH(QModelIndex current, indexes)
  {
  .
  .
  .
  }
  // add last element
  selected_text.append(model()->data(last).toString());
0
ответ дан 1 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: