QT 支持多行粘贴的表格

从excel表格 中复制,然后选中表格单元格。ctrl+v粘贴。当表格行数不足的时候,会自动补充行。
需要继承QTableView实现这个功能。

MyTableView.h

#ifndef MYTABLEVIEW_H
#define MYTABLEVIEW_H

#include <QWidget>
#include<QTableView>

class MyTableView : public QTableView
{
    Q_OBJECT
public:
    explicit MyTableView(QWidget *parent = nullptr);
    void keyPressEvent(QKeyEvent *event);
    QVariant getData(int row,int column);
signals:

};

#endif // MYTABLEVIEW_H

MyTableView.cpp

MyTableView::MyTableView(QWidget *parent) : QTableView(parent)
{
    QStandardItemModel *model = new QStandardItemModel();
    model->setRowCount(1000);
    model->setColumnCount(1);
    model->setHeaderData(0,Qt::Horizontal,"姓名");
    setModel(model);
    setStyleSheet("QTableView { background-color: white; }"
                      "QTableView::item:selected { color: white; background-color: blue; }"
                      "QTableView::horizontalHeader { background-color: lightgray; }"
                      "QTableView::verticalHeader { background-color: lightgray; }");
    setSelectionMode(QAbstractItemView::ExtendedSelection);
    setSelectionBehavior(QAbstractItemView::SelectItems);
    setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);
    setAlternatingRowColors(true);
    setSortingEnabled(true);
    setWordWrap(false);
    setTabKeyNavigation(true);


}

void MyTableView::keyPressEvent(QKeyEvent *event)
{
    if (event->matches(QKeySequence::Paste)) {
        QClipboard *clipboard = QGuiApplication::clipboard();
        const QMimeData *mimeData = clipboard->mimeData();
        if (mimeData->hasText()) {
            QString text = mimeData->text();
            QStringList rows = text.split(QLatin1Char('\n'), QString::SkipEmptyParts);
            if (rows.count() > 0) {
                QModelIndexList selectedIndexes = selectionModel()->selectedIndexes();
                if (selectedIndexes.count() > 0) {
                    int row = selectedIndexes.at(0).row();
                    int column = selectedIndexes.at(0).column();
                    int maxRow = model()->rowCount();
                    int maxColumn = model()->columnCount();
                    for (int i = 0; i < rows.count(); i++) {
                        if (row + i >= maxRow) {
                            model()->insertRow(row + i);
                        }
                        QStringList values = rows.at(i).split(QLatin1Char('\t'), QString::SkipEmptyParts);
                        for (int j = 0; j < values.count(); j++) {
                            if (column + j >= maxColumn) {
                                continue;
                            }
                            QModelIndex index = model()->index(row + i, column + j);
                            model()->setData(index, values.at(j));
                        }
                    }
                }
            }
        }
    }
    else {
        QTableView::keyPressEvent(event);
    }
         // 更新视图
     viewport()->update();
     return;
}

#include<QDebug>
QVariant MyTableView::getData(int row, int column)
{
    QModelIndex index = model()->index(row, column); // 获取指定单元格的索引
    QVariant data = model()->data(index); // 获取指定单元格的 UserRole 角色数据
    return data;

}

在ui中如何使用这个类?

首先你在ui中想要的区域,先放上一个QTableView,
在这里插入图片描述有个提然后在这个位置右键,提升为。
在这里插入图片描述
然后输入QTableView的 子类名,添加。右下角提升即可。
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值