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

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

Qtプログラミング-セルの変更続き

著者:津路高広
公開日:2019/11/14
最終更新日:2019/11/14
カテゴリー:技術情報

津路です。
さて、前回で状態を保存し、検知してみました。
プログラムを閉じる際と、ファイルをオープンする際に、保存するかを尋ねます。

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クラスには、セルに変更があったことを保存し、反映する機能が必要です。

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しておきます。

connect(this,SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(somethingChanged()));
    上に戻る