复制 QTableView 的一部分

Posted

技术标签:

【中文标题】复制 QTableView 的一部分【英文标题】:Copying part of QTableView 【发布时间】:2010-06-28 20:03:43 【问题描述】:

所以我有一个与我在这里看到的另一个问题密切相关的问题,但是当我尝试在那里提出我的问题时,我没有得到任何回应,我希望通过提出这个新问题,有人可以帮助我。基本上,我只想复制我创建的表格的一部分,以便可以将其粘贴到 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 子表时,行索引会变得混乱,错误地为值分配行索引。有什么想法吗?

【问题讨论】:

【参考方案1】:

嗯,已经想通了,对不起任何浪费时间看的人。

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

【讨论】:

【参考方案2】:

我根据 Phil 编写了一些代码来在用户键入 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

【讨论】:

一个很好的,可以使用的代码sn-p。 +1 特别是对于单元格的 qSort。那会让我绊倒一段时间 来自***.com/questions/1230222/…:您可以使用 event->matches(QKeySequence::Copy) 而不是手动检查 ctrl + c 啊,听起来更好【参考方案3】:

关于 cdline: qSort(细胞); // 必须的,否则按列顺序 目前(20190118)它带来了一个警告: 警告:'qSort >' 已弃用:使用 std::sort

所以我用以下方式替换该行的解决方案: std::sort(cells.begin(),cells.end()); 编译,运行 OK -> 到目前为止一切顺利。但是问题:这个cdline的好处? 我发现没有人。使用 gui 的副本进行了几次测试并将其解析为 excel。即使是 2x2 或其他 XxY 场景,一切都很好。

【讨论】:

以上是关于复制 QTableView 的一部分的主要内容,如果未能解决你的问题,请参考以下文章

在 QTableView 中复制和粘贴

不允许在 pyside 的 QTableView 中复制/粘贴

我应该使用啥,QTableWidget 或 QTableView? [复制]

如何在 QTableView 中复制和粘贴多行/列(来自 pandas 数据框的数据源)? [复制]

如何复制 - 将 QStandardItemModel 创建的 QTableView 中的多个项目粘贴到文本/excel 文件中?

PyQt:QTableView + QSqlTableModel - 将所有选定的行或列复制并粘贴到记事本或 Excel 中