Копирование части QTableView - PullRequest
8 голосов
/ 29 июня 2010

Итак, у меня есть вопрос, очень тесно связанный с другим вопросом, который я видел здесь, но когда я попытался поставить свой вопрос там, я не получил ответов, я надеюсь, задав этот вопрос как свежий вопрос, кто-то может мне помочь.По сути, я хочу просто скопировать часть моей таблицы, которую я создал, чтобы я мог вставить ее в файл Excel.Вот что у меня есть:

    QAbstractItemModel *abmodel = ui.tableview->model();
    QItemSelectionModel *model = ui.tableview->selectionModel();
    QModelIndexList list = model->selectionIndexes();
    qSort(list);
    QModelIndex index = list.first();
    for(int i = 0; i < list.size(); i++)
{
    QModelIndex index = list.at(i);
    QString text = abmodel->data(index).toString();
    copy_table.append(text);

    if(index.row() != previous.row())
    {
        copy_table.append('\n');
    }
    else
    {
        copy_table.append('\t');
    }
    previous = index;
}

QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(copy_table);

Это нормально скопирует столбец, но когда я пытаюсь скопировать строку или сказать подтаблицу 2x2, индекс строки испортился, неправильно назначив индекс строки для значений.Есть мысли?

Ответы [ 3 ]

13 голосов
/ 29 июня 2010

Ну, уже разобрался, извините, кто потратил свое время и посмотрел.

void TestCopyTable::on_pushButton_copy_clicked()
{
QAbstractItemModel *abmodel = ui.tableView->model();
QItemSelectionModel * model = ui.tableView->selectionModel();
QModelIndexList list = model->selectedIndexes();

qSort(list);

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

QString copy_table;
QModelIndex last = list.last();
QModelIndex previous = list.first();

list.removeFirst();

for(int i = 0; i < list.size(); i++)
{
    QVariant data = abmodel->data(previous);
    QString text = data.toString();

    QModelIndex index = list.at(i);
    copy_table.append(text);

    if(index.row() != previous.row())

    {
        copy_table.append('\n');
    }
    else
    {
        copy_table.append('\t');
    }
    previous = index;
}

copy_table.append(abmodel->data(list.last()).toString());
copy_table.append('\n');

QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(copy_table);

}

4 голосов
/ 10 июня 2014

Я написал некоторый код на основе Фила для копирования выбора, когда пользователь вводит Control-C.

Я подклассифицировал QTableWidget и переопределял keyPressEvent():

void MyTableWidget::keyPressEvent(QKeyEvent* event) {
    // If Ctrl-C typed
    // Or use event->matches(QKeySequence::Copy)
    if (event->key() == Qt::Key_C && (event->modifiers() & Qt::ControlModifier))
    {
        QModelIndexList cells = selectedIndexes();
        qSort(cells); // Necessary, otherwise they are in column order

        QString text;
        int currentRow = 0; // To determine when to insert newlines
        foreach (const QModelIndex& cell, cells) {
            if (text.length() == 0) {
                // First item
            } else if (cell.row() != currentRow) {
                // New row
                text += '\n';
            } else {
                // Next cell
                text += '\t';
            }
            currentRow = cell.row();
            text += cell.data().toString();
        }

        QApplication::clipboard()->setText(text);
    }
}

Пример вывода(через табуляцию):

foo bar baz qux
bar baz qux foo
baz qux foo bar
qux foo bar baz
0 голосов
/ 18 января 2019

Относительно cdline: QSort (клетка); // Необходимо, иначе они в порядке столбцов в настоящее время (20190118) это приносит предупреждение: Предупреждение: 'qSort>' устарела: используйте std :: sort

поэтому мое решение заменить строку на: станд :: сортировать (cells.begin (), cells.end ()); Скомпилируйте, запустите OK -> пока все хорошо. Но Вопрос: Преимущество этого CDLINE? Я нашел там никого. Сделал несколько тестов с копией из графического интерфейса и разбором его в Excel. Все было хорошо, даже со сценарием 2x2 или другим XxY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...