Qtプログラミング – スプレッドシート新規、閉じる
津路です。
本日は、既に令和元年12月30日です。今年も雪降らず、静かに暮を迎えようとしています。
今回は、連続して投稿しているスプレッドシートアプリケーションのファイルメニューに、新規、閉じる、終了の3つを追加します。
今回からは、今までのような、SDIではなく、MDIに切り替えます。
1 2 3 4 5 6 7 8 9 10 11 12 | SDI void MainWindow::newFile() { spreadsheet->clear(); } MDI void MainWindow::newFile() { MainWindow *mainwin = new MainWindow; mainwin->show(); } |
上記のように、MDIでは、MainWindowを生成して、表示しますので、メニュー付きのスプレッドシートが新たに開きます。
閉じるメニューでは、closeスロットを呼び出し、以前取り上げたcloseEventにて、イベントを処理し、ウィンドウを閉じて破棄します。
1 2 3 4 5 6 7 | void MainWindow::createActions() { closeAction = new QAction(tr("&Close"),this); closeAction->setShortcut(tr("Ctrl+W")); closeAction->setStatusTip(tr("Close this window")); connect(closeAction, SIGNAL(triggered()), this, SLOT(close())); } |
メモリ破棄を行う便利な機能として、Qt::WA_DeleteOnClose という属性があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | MainWindow::MainWindow() { spreadsheet = new Spreadsheet; setCentralWidget(spreadsheet); setWindowIcon(QIcon(":/images/inspect.png")); setAttribute(Qt::WA_DeleteOnClose); } void MainWindow::closeEvent(QCloseEvent *event) { if(okToContinue()) { event->accept(); } else { event->ignore(); } } |
終了メニューでは、アプリケーションを終了します。すべてのウィンドウを閉じてから終了します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void MainWindow::createActions() { exitAction = new QAction(tr("E&xit"),this); exitAction->setShortcut(tr("Ctrl+Q")); exitAction->setStatusTip(tr("Exit the application")); connect(exitAction, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); } void MainWindow::createMenus() { fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(newAction); fileMenu->addAction(openAction); fileMenu->addAction(saveAction); fileMenu->addSeparator(); fileMenu->addAction(closeAction); fileMenu->addAction(exitAction); } |
さて、起動して、すぐにctrl+Qにて終了します、とエラーが発生します。
free: invalid pointer : メモリアドレス
これは、終了時にメモリが無効であることを意味します。
新たに加えた属性の設定方法が間違っています。
正しくは、spreadsheet->setAttribute(Qt::WA_DeleteOnClose);
です。