繼承 QMainWindow,以 QTextEdit 為中央元件,構建標準文件型應用骨架:選單列、工具列、狀態列、動作系統。
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow();
protected:
void closeEvent(QCloseEvent *event);
private slots:
void newFile();
void open();
bool save();
bool saveAs();
void about();
void documentWasModified();
private:
void createActions();
void createMenus();
void createToolBars();
void createStatusBar();
void readSettings();
void writeSettings();
bool maybeSave();
void loadFile(const QString &fileName);
bool saveFile(const QString &fileName);
void setCurrentFile(const QString &fileName);
QString strippedName(const QString &fullFileName);
QTextEdit *textEdit;
QString curFile;
// 選單、工具列、動作指標...
};
MainWindow::MainWindow() {
textEdit = new QTextEdit;
setCentralWidget(textEdit);
createActions(); createMenus(); createToolBars(); createStatusBar();
readSettings();
connect(textEdit->document(), SIGNAL(contentsChanged()),
this, SLOT(documentWasModified()));
setCurrentFile("");
}
void MainWindow::closeEvent(QCloseEvent *event) {
if (maybeSave()) { writeSettings(); event->accept(); }
else event->ignore();
}
newFile():maybeSave() → clear() → setCurrentFile("")open():maybeSave() → QFileDialog::getOpenFileName() → loadFile()save():有檔名 → saveFile(curFile);無檔名 → saveAs()saveAs():QFileDialog::getSaveFileName() → saveFile()void MainWindow::documentWasModified() {
setWindowModified(textEdit->document()->isModified()); // 標題列顯示 *
}
newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this);
newAct->setShortcut(tr("Ctrl+N"));
newAct->setStatusTip(tr("Create a new file"));
connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
// 剪貼簿動作啟用狀態綁定選取內容
cutAct->setEnabled(false);
copyAct->setEnabled(false);
connect(textEdit, SIGNAL(copyAvailable(bool)), cutAct, SLOT(setEnabled(bool)));
connect(textEdit, SIGNAL(copyAvailable(bool)), copyAct, SLOT(setEnabled(bool)));
下篇將實作 loadFile()/saveFile() 實際 I/O、最近開啟檔案記錄、尋找/取代對話框、列印支援等進階功能。