基于QTableWidget下的复制与粘贴功能

思路:

复制:通过selectedRanges()获取选择范围,获取该区域文本并设置文本格式,放到剪切板上。

剪切:从剪切板取文本,根据选择的有效行数与列数设置单元格数据。

支持不连续选择单元格数据。

复制与粘贴代码如下:
 

//复制
void MainWindow::copyTextToClipboard(QTableWidget *table)
{
    QString copyText;
    if(table){
        const auto &lstSelectRange = table->selectedRanges();
        bool bHorSel = false;
        bool bVerSel = false;
        int selFlag = 0;
        for(const auto &selectRange : lstSelectRange){
            //跳着选且水平选
            if(selFlag < lstSelectRange.size() - 1){
                if(lstSelectRange[selFlag].leftColumn() == lstSelectRange[selFlag + 1].rightColumn())
                    bHorSel = true;
                //跳着选且垂直选
                else if(lstSelectRange[selFlag].topRow() == lstSelectRange[selFlag + 1].bottomRow()){
                    bVerSel = true;
                }
            }

            for(int iRow = selectRange.topRow(); iRow <= selectRange.bottomRow(); ++iRow){
                QString tempItem;
                int colIndex = 0;
                for(int iCol = selectRange.leftColumn(); iCol <= selectRange.rightColumn(); ++iCol){
                    QTableWidgetItem * pItem = table->item(iRow, iCol);
                    if(pItem){
                        tempItem.append(pItem->text());
                        if(colIndex < selectRange.columnCount() - 1  || (bVerSel && selFlag < lstSelectRange.size() - 1))
                            tempItem.append('\t');
                        ++colIndex;
                    }
                }

                copyText.append(tempItem);
                if(selectRange.rowCount() > 1 || bHorSel)
                   copyText.append('\n');
            }
            ++selFlag;
        }
    }
    qDebug() << copyText;
    QApplication::clipboard()->setText(copyText);
}

//粘贴
void MainWindow::pastTextFromCliboard(QTableWidget *table)
{
   QString pastText = QApplication::clipboard()->text().trimmed();
   if(table){   
       //处理文本
       QStringList &lstText = pastText.split('\n');

       //根据选中的行数取文本
       for(const auto &selectRange : table->selectedRanges()){
           //取有效行数与列数
           int startRowIndex = selectRange.topRow();
           int newRowCnt = table->rowCount() - startRowIndex;
           int startColIndex = selectRange.leftColumn();
           int newColCnt = table->columnCount() - startColIndex;

           //根据有效行取文本
           if(lstText.size() > newRowCnt){
               for(int i = lstText.size() - 1; i >= newRowCnt; --i)
                   lstText.removeAt(i);
           }

           for(auto &item : lstText){
               QStringList &lstItem = QString(item).split('\t');
               qDebug() << lstItem;
               //根据有效列取文本
               if(lstItem.size() > newColCnt){
                   for(int j = lstItem.size() - 1; j >= newColCnt; --j){
                       lstItem.removeAt(j);
                   }
               }

               //设置数据
               for(const auto &text : lstItem){
                   QTableWidgetItem *pItem = table->item(startRowIndex, startColIndex);
                   if(pItem){
                       pItem->setText(text);
                   }else{
                       pItem = new QTableWidgetItem(text);
                       table->setItem(startRowIndex, startColIndex, pItem);
                   }
                   pItem->setTextAlignment(Qt::AlignCenter);

                   ++startColIndex;
               }
               ++startRowIndex;
               startColIndex = selectRange.leftColumn();
           }
       }
   }
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于Qt中的QTreeWidget和QTableWidget,可以通过使用QUndoGroup来实现撤销和恢复功能。以下是一个简单的示例代码: ``` #include <QtWidgets> int main(int argc, char *argv[]) { QApplication app(argc, argv); QUndoGroup undoGroup; // 创建一个 QTreeWidget QTreeWidget treeWidget; // 创建一个 QTableWidget QTableWidget tableWidget; // 绑定 QUndoGroup 到 QTreeWidget QUndoStack *treeUndoStack = new QUndoStack(&undoGroup); treeWidget.setUndoStack(treeUndoStack); // 绑定 QUndoGroup 到 QTableWidget QUndoStack *tableUndoStack = new QUndoStack(&undoGroup); tableWidget.setUndoStack(tableUndoStack); // 添加一些测试数据 treeWidget.setHeaderLabels({"Name", "Value"}); QTreeWidgetItem *root = new QTreeWidgetItem(&treeWidget, {"Root"}); QTreeWidgetItem *child1 = new QTreeWidgetItem(root, {"Child 1", "1"}); QTreeWidgetItem *child2 = new QTreeWidgetItem(root, {"Child 2", "2"}); tableWidget.setColumnCount(2); tableWidget.setRowCount(2); tableWidget.setItem(0, 0, new QTableWidgetItem("Item 1")); tableWidget.setItem(0, 1, new QTableWidgetItem("1")); tableWidget.setItem(1, 0, new QTableWidgetItem("Item 2")); tableWidget.setItem(1, 1, new QTableWidgetItem("2")); // 创建一个撤销操作 QAction *undoAction = undoGroup.createUndoAction(&treeWidget, "Undo"); undoAction->setShortcut(QKeySequence::Undo); QAction *tableUndoAction = undoGroup.createUndoAction(&tableWidget, "Undo"); tableUndoAction->setShortcut(QKeySequence::Undo); // 创建一个重做操作 QAction *redoAction = undoGroup.createRedoAction(&treeWidget, "Redo"); redoAction->setShortcut(QKeySequence::Redo); QAction *tableRedoAction = undoGroup.createRedoAction(&tableWidget, "Redo"); tableRedoAction->setShortcut(QKeySequence::Redo); // 创建一个菜单 QMenu *editMenu = new QMenu("Edit"); editMenu->addAction(undoAction); editMenu->addAction(tableUndoAction); editMenu->addAction(redoAction); editMenu->addAction(tableRedoAction); // 创建一个窗口并显示 QMainWindow window; window.setCentralWidget(&treeWidget); window.setMenuBar(new QMenuBar); window.menuBar()->addMenu(editMenu); window.show(); return app.exec(); } ``` 在上面的代码中,我们创建了一个QUndoGroup对象,并将其绑定到QTreeWidget和QTableWidget上的QUndoStack对象。然后,我们创建了一些测试数据,并创建了一个撤销和重做操作的菜单。最后,我们创建了一个窗口并将其显示出来。 当我们对QTreeWidget和QTableWidget进行更改时,这些更改将被添加到QUndoStack对象中。我们可以使用撤销和重做操作来撤销和恢复这些更改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值