QTableWidget实现复制粘贴

36 篇文章 9 订阅

原文:http://beself.top/2020/02/16/qtablewidget-copy-paste/
QTableWidget控件似乎没有复制粘贴的功能可以直接用,所以做的时候实现了一下

  1. 要实现复制粘贴功能的前提都是要选中表中的内容
  2. 添加相关事件

复制代码

// 复制选中内容
void JInfoManger::copySelectFromTable()
{
    QList<QTableWidgetSelectionRange> sRangeList = TableAccount->selectedRanges();
    for(const auto &p : qAsConst(sRangeList)) {
//        qDebug() << "leftColumn:" << p.leftColumn() << ", rightColumn:" << p.rightColumn();
//        qDebug() << "topRow:" << p.topRow() << "bottomRow:" << p.bottomRow();
//        qDebug() << "rowCount:" << p.rowCount() << ", columnCount:" << p.columnCount();
        QString str;
        for (auto i = p.topRow(); i <= p.bottomRow(); i++) {
            QString rowStr;
            for (auto j = p.leftColumn(); j <= p.rightColumn(); j++) {
                QTableWidgetItem* item = TableAccount->item(i, j);
                if(item != nullptr) {
                    if(j == p.leftColumn())
                        rowStr = item->text() + "\t";
                    else if (j == p.rightColumn())
                        rowStr = rowStr + item->text() + "\n";
                    else
                        rowStr = rowStr + item->text() + "\t";
                }
                else {
                    break;
                }
            }
            str += rowStr;
        }
        clipBoard->setText(str);
    }
}

粘贴代码

// 粘贴,从选中的第一个单元格开始
void JInfoManger::pasteToTable()
{
    QList<QTableWidgetSelectionRange> sRangeList = TableAccount->selectedRanges();
    for(const auto &p : qAsConst(sRangeList)) {
        QString str = clipBoard->text();
//        str.replace(",", "\t");
//        str.replace(";", "\t");
        int ColCnt = TableAccount->columnCount();
        QList<QString> RowStr = str.split("\n");
        int x = p.topRow();
        for(const auto &Row : qAsConst(RowStr)) {
            if(!Row.isEmpty()) {
                QList<QString> ColStr = Row.split("\t");
                int y = p.leftColumn();
                for(const auto &Col : qAsConst(ColStr)) {
                    QTableWidgetItem* item = TableAccount->item(x, y);
                    if(item == nullptr)
                        TableAccount->setItem(x, y, new QTableWidgetItem(Col));
                    else
                        TableAccount->item(x, y)->setText(Col);
                    if(y + 1 == ColCnt)
                        break;
                    ++y;
                }
                if(x + 1 == TableAccount->rowCount())
                    TableAccount->setRowCount(TableAccount->rowCount() + 1);
                ++x;
            }
        }
    }
}
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
可以通过重载QTableWidget的keyPressEvent()函数来实现多个单元格的复制粘贴。以下是一个示例代码: ```c++ void MyTableWidget::keyPressEvent(QKeyEvent *event) { if (event->matches(QKeySequence::Copy)) { // 复制 QList<QTableWidgetItem*> items = this->selectedItems(); if (!items.isEmpty()) { QString text; for (int i = 0; i < items.count(); i++) { QTableWidgetItem* item = items.at(i); text += item->text(); if (i < items.count() - 1) { text += '\t'; } } QApplication::clipboard()->setText(text); } } else if (event->matches(QKeySequence::Paste)) { // 粘贴 QString text = QApplication::clipboard()->text(); QStringList rows = text.split('\n'); int startRow = this->currentRow(); int startColumn = this->currentColumn(); for (int i = 0; i < rows.count(); i++) { if (startRow + i >= this->rowCount()) { this->setRowCount(startRow + i + 1); } QStringList columns = rows.at(i).split('\t'); for (int j = 0; j < columns.count(); j++) { if (startColumn + j >= this->columnCount()) { this->setColumnCount(startColumn + j + 1); } QTableWidgetItem* item = new QTableWidgetItem(columns.at(j)); this->setItem(startRow + i, startColumn + j, item); } } } else { QTableWidget::keyPressEvent(event); } } ``` 这个示例代码中,当用户按下“复制”快捷键时(默认为Ctrl+C),程序会将所有选中的单元格的文本拼接在一起,并用制表符分隔,然后将结果放入剪贴板中。 当用户按下“粘贴”快捷键时(默认为Ctrl+V),程序会从剪贴板中读取文本,并将其按行和列分割成多个单元格。然后程序会将这些单元格插入到当前单元格的右侧和下方。 如果用户按下的不是“复制”或“粘贴”快捷键,则会调用基类的keyPressEvent()函数,以便处理其他键盘事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ALONE_WORK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值