大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

Qtプログラミング – スプレッドシート編集機能 – コピー、削除、切り取り

株式会社クローバーフィールドの経営理念
著者:津路高広
公開日:2019/12/13
最終更新日:2019/12/13
カテゴリー:技術情報

津路です。
前回では、検索機能を追加しました。
今回は、Editメニューに、コピー、削除、切り取りを実装します。

1.コピースロット
選択中のセルは、selectedRanges関数で取得できます。

QTableWidgetSelectionRange Spreadsheet::selectedRange() const
{
    QList<QTableWidgetSelectionRange> ranges = selectedRanges();
    if(ranges.isEmpty())
        return QTableWidgetSelectionRange();
    return ranges.first();
}

コピースロットでは、これを使って、各行のformulaを改行コードで区切ります。各列は、タブ記号で区切ります。
クリップボードは、QApplication::clipboard()で得られます。

void Spreadsheet::copy()
{
    QTableWidgetSelectionRange range = selectedRange();
    printf("range row:%d %d\n",range.rowCount(),range.columnCount());

    QString str;
    for(int i=0; i<range.rowCount(); ++i)
    {
        if(i>0) str+= "\n";
        for(int j=0; j<range.columnCount(); ++j)
        {
           if(j>0) str+="\t";
           str+= formula(range.topRow()+ i, range.leftColumn() + j);
        }
    }
    QApplication::clipboard()->setText(str);
}

2.削除スロットでは、選択中のセル範囲を、selectedItemsで取得し、それぞれを削除します。

void Spreadsheet::del()
{
    QList<QTableWidgetItem*> items = selectedItems();
    printf("items %d",items.count());
    if(!items.isEmpty()) {
        foreach(QTableWidgetItem *item, items)
            delete item;
        somethingChanged();
    }
}

3.上記関数を使って切り取りを実装します。

void Spreadsheet::cut()
{
    copy();
    del();
}
    上に戻る