Qtプログラミング-セルの変更続き
津路です。
さて、前回で状態を保存し、検知してみました。
プログラムを閉じる際と、ファイルをオープンする際に、保存するかを尋ねます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | void MainWindow::closeEvent(QCloseEvent *event) { if(okToContinue()) { event->accept(); } else { event->ignore(); } } class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); protected: void closeEvent(QCloseEvent *event); } bool MainWindow::open() { if(okToContinue()) { QString fileName = QFileDialog::getOpenFileName(this, tr("Open Spreadsheet"),".",tr("Spreadsheet files (*.sp)\n" "Comman-separated values files (*.csv)")); if(!fileName.isEmpty()) loadFile(fileName); } return false; } |
closeEventは、閉じる際に呼ばれます。オーバーロードしています。
Spreadsheetクラスには、セルに変更があったことを保存し、反映する機能が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void Spreadsheet::somethingChanged() { if(autoRecalc) recalculate(); emit modified(); } void Spreadsheet::recalculate() { for(int row=0;row < RowCount; row++) { for(int column=0;column<ColumnCount; column++) { if(cell(row,column)) cell(row,column)->setDirty(); } } viewport()->update(); } |
autoRecalcは、単なるフラグで、起動時にONにしておきます。
recalculate関数にて、シート全体にフラグを立てます。
somethingChanged関数は、イベント処理で呼びます。
前回までで紹介したように、クラスのコンストラクタで、itemChangedイベントが起きたときに呼ばれるよう、connectしておきます。
1 | connect(this,SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(somethingChanged())); |