QT 支持多行粘贴的表格

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

MyTableView.h

#ifndef MYTABLEVIEW_H
#define MYTABLEVIEW_H

#include 
#include

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

}

在ui中如何使用这个类?

首先你在ui中想要的区域,先放上一个QTableView,
QT 支持多行粘贴的表格_第1张图片有个提然后在这个位置右键,提升为。
QT 支持多行粘贴的表格_第2张图片
然后输入QTableView的 子类名,添加。右下角提升即可。
QT 支持多行粘贴的表格_第3张图片

你可能感兴趣的:(c++qt,qt,excel,开发语言)