Qt

QTableWidget을 Excel로 복사 붙여넣기 커스텀 클래스만들기

Qt쓰는 사람 2018. 6. 22. 16:03

//.cpp


#include <QApplication>
#include <QClipboard>
#include <QShortcut>
#include <QModelIndex>
#include <QModelIndexList>
#include <QDebug>
#include "TableExcelStyleWidget.h"


struct TableExcelStyleWidget::privateStruct
{
    QScopedPointer<QShortcut> mCopyShortcut;
};

TableExcelStyleWidget::TableExcelStyleWidget(QWidget *parent) :
    QTableWidget(parent),
    d(new privateStruct)
{
    this->initVariables();
    this->initSignalSlot();


    QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
    sizePolicy.setHorizontalStretch(0);
    sizePolicy.setVerticalStretch(0);
    sizePolicy.setHeightForWidth(this->sizePolicy().hasHeightForWidth());

    this->setSizePolicy(sizePolicy);
}

TableExcelStyleWidget::~TableExcelStyleWidget()
{
}

void TableExcelStyleWidget::initVariables()
{
    d->mCopyShortcut.reset(new QShortcut(this));
    d->mCopyShortcut->setKey(Qt::CTRL + Qt::Key_C);


    this->setAlternatingRowColors(true);
//    this->setSelectionBehavior(QAbstractItemView::SelectRows);
    //this->sortItems()
}

void TableExcelStyleWidget::initSignalSlot()
{
    connect(d->mCopyShortcut.data(), SIGNAL(activated()), this, SLOT(onEmittedCopyShortCut()));
}

void TableExcelStyleWidget::onEmittedCopyShortCut()
{
    auto modelItems  = this->selectedIndexes();
    std::sort(modelItems.begin(), modelItems.end());

    int prevRow = 0;
    QString clipBoardString;

    foreach(auto currentItem, modelItems)
    {
        if(!clipBoardString.isEmpty())
        {
            if(currentItem.row() == prevRow)
                clipBoardString.append("\t");
            else
                clipBoardString.append("\n");
        }

        clipBoardString.append(currentItem.data().toString());
        prevRow = currentItem.row();
    }

    auto clipBoard = QApplication::clipboard();
    clipBoard->setText(clipBoardString);
}




//.h


#ifndef TABLE_EXCEL_STYLE_WIDGET_H
#define TABLE_EXCEL_STYLE_WIDGET_H

#include <QTableWidget>
#include <QScopedPointer>

class TableExcelStyleWidget : public QTableWidget
{
private:
    Q_OBJECT

    struct privateStruct;
public:
    explicit TableExcelStyleWidget(QWidget* parent = nullptr);
    virtual ~TableExcelStyleWidget();

private:
    void initVariables();
    void initSignalSlot();


private slots:
    void onEmittedCopyShortCut();

private:
    QScopedPointer<privateStruct> d;
};

#endif // TABLE_EXCEL_STYLE_WIDGET_H