Qtプログラミング – スプレッドシート編集機能 – コピー、削除、切り取り
津路です。
前回では、検索機能を追加しました。
今回は、Editメニューに、コピー、削除、切り取りを実装します。
1.コピースロット
選択中のセルは、selectedRanges関数で取得できます。
1 2 3 4 5 6 7 | QTableWidgetSelectionRange Spreadsheet::selectedRange() const { QList<QTableWidgetSelectionRange> ranges = selectedRanges(); if(ranges.isEmpty()) return QTableWidgetSelectionRange(); return ranges.first(); } |
コピースロットでは、これを使って、各行のformulaを改行コードで区切ります。各列は、タブ記号で区切ります。
クリップボードは、QApplication::clipboard()で得られます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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で取得し、それぞれを削除します。
1 2 3 4 5 6 7 8 9 10 | void Spreadsheet::del() { QList<QTableWidgetItem*> items = selectedItems(); printf("items %d",items.count()); if(!items.isEmpty()) { foreach(QTableWidgetItem *item, items) delete item; somethingChanged(); } } |
3.上記関数を使って切り取りを実装します。
1 2 3 4 5 | void Spreadsheet::cut() { copy(); del(); } |