Qt——文本编辑器中的功能交互
1.QPlainTextEdit能够触发与编辑操作相关的信号void textChanged() 文本内容发生改变时触发void copyAvailable(bool) 自动控制菜单栏里的复制按钮变灰 / 可用void cursorPositionChanged() 光标换位置了你可以更新状态栏行列号了void redoAvailable(bool) 控制菜单重做能否点击void undoAvailable(bool) 控制菜单撤销能否点击2.判断编辑器是否有未保存的文本定义槽函数void onTextChanged()映射textChanged()到槽函数定义成员变量bool m_isTextChanged false;文本框中的字符发生变化时m_isTextChanged true;当m_isTextChanged为真时则存在未保存的数据完善这一系列函数后MainWindow.h#ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow #include QKeySequence //快捷键 #include QMenuBar //菜单栏 #include QAction //菜单动作 #include QToolBar #include QPlainTextEdit #include QLabel #include QFileDialog class MainWindow : public QMainWindow { Q_OBJECT private: QPlainTextEdit mainEditor; QLabel statusLbl; QString m_filePath; bool m_isTextChanged; MainWindow(); MainWindow(const MainWindow); //拷贝构造函数 MainWindow operator (const MainWindow); bool construct(); // 总初始化函数 bool initMenuBar(); //初始化菜单栏 bool initToolBar(); //初始化工具栏 bool initStatusBar(); //初始化状态栏 bool initMainEditor(); //初始化文本编辑区 bool initFileMenu(QMenuBar* mb); //初始化文件菜单 bool initEditMenu(QMenuBar* mb); //初始化编辑菜单 bool initFormatMenu(QMenuBar* mb); bool initViewMenu(QMenuBar* mb); bool initHelpMenu(QMenuBar* mb); bool initFileToolItem(QToolBar* tb); bool initEditToolItem(QToolBar* tb); bool initFormatToolItem(QToolBar* tb); bool initViewToolItem(QToolBar* tb); bool makeAction(QAction* action, QWidget* parent, QString text, int key); //创建菜单栏菜单项 bool makeAction(QAction* action, QWidget* parent, QString tip, QString icon); //创建工具栏菜单项 QString showFileDialog(QFileDialog::AcceptMode mode, QString title); void showErorrMessage(QString message); int showQueryMessage(QString message); //询问对话框 QString saveCurrentData(QString path ); //保存函数 void preEditorChange(); //文本编辑框中的内容发生改变 public slots: void onFileNew(); //新建文件槽函数 void onFileOpen(); //打开文件槽函数 void onFileSave(); //保存文件槽函数 void onFileSaveAs(); //另存为槽函数 void onTextChanged(); //判断文本是否有改变 public: static MainWindow* NewInstance(); //唯一创建窗口的接口 ~MainWindow(); }; #endif // MAINWINDOW_HMainWindowSlots.cpp#include MainWindow.h #include QFileDialog #include QDebug #include QFile #include QMessageBox #include QTextStream void MainWindow::showErorrMessage(QString message){ QMessageBox msg(this); msg.setWindowTitle(Error); msg.setText(message); msg.setIcon(QMessageBox::Critical); msg.setStandardButtons(QMessageBox::Ok); msg.exec(); } int MainWindow::showQueryMessage(QString message) { QMessageBox msg(this); msg.setWindowTitle(Query); msg.setText(message); msg.setIcon(QMessageBox::Question); msg.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); return msg.exec(); } // 参数1模式打开/保存 参数2对话框标题 QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title) { QString ret ; // 存储最终返回的文件路径默认空 QFileDialog fd(this); //创建一个文件对话框对象 QStringList filters; //创建一个字符串列表 filters用来存储文件过滤器 filters.append(Text Files (*.txt)); filters.append(All Files (*)); fd.setWindowTitle(title); //设置文件对话框的标题 fd.setAcceptMode(QFileDialog::AcceptOpen); //设置对话框模式为打开文件 fd.setNameFilters(filters); if( mode QFileDialog::AcceptOpen ) { fd.setFileMode(QFileDialog::ExistingFile); //设置文件选择模式只能选择已存在的单个文件 } if( fd.exec() QFileDialog::Accepted ) //如果用户点击了对话框的 “打开” 按钮 { ret fd.selectedFiles()[0]; } return ret; } void MainWindow::preEditorChange() { if(m_isTextChanged) { int r showQueryMessage(你是否想要保存数据到文件中); switch(r) { case QMessageBox::Yes: saveCurrentData(m_filePath); break; case QMessageBox::No: m_isTextChanged false; break; case QMessageBox::Cancel: break; } } } void MainWindow::onFileNew() { preEditorChange(); if( !m_isTextChanged ) { mainEditor.clear(); setWindowTitle(NotePad - [ New ]); m_filePath ; m_isTextChanged false; } } void MainWindow::onFileOpen() { preEditorChange(); if( !m_isTextChanged ) { QString path showFileDialog(QFileDialog::AcceptOpen, Open); if( path ! ) // 如果用户选择了文件路径不为空 { QFile file(path); //绑定用户选中的第一个文件路径 if( file.open(QIODevice::ReadOnly | QIODevice::Text)) { //把读取到的文件内容显示到编辑器中 mainEditor.setPlainText(QString(file.readAll())); file.close(); m_filePath path; m_isTextChanged false; setWindowTitle(NotePad - [ m_filePath ]); } else{ showErorrMessage(QString(open file error! \n\n) \ path \); } } } } QString MainWindow::saveCurrentData(QString path) { QString ret path; if( ret ) { // 弹出【保存对话框】让用户选择保存路径 ret showFileDialog(QFileDialog::AcceptSave, Save); } if( ret ! ) // 如果用户指定了保存路径 { QFile file(ret); // 创建文件对象 if( file.open(QIODevice::WriteOnly | QIODevice::Text) ) { QTextStream out(file); out mainEditor.toPlainText(); // 把编辑器内容写入文件 file.close(); setWindowTitle(NotePad - [ ret ]); m_isTextChanged false; } else{ showErorrMessage(QString(Save file error! \n\n) \ ret \); ret ; } } return ret; } void MainWindow::onFileSave() { QString path saveCurrentData(m_filePath); if(path ! ) { m_filePath path; } } void MainWindow::onFileSaveAs() { QString path saveCurrentData(m_filePath); if( path ! ) { m_filePath path; } } void MainWindow::onTextChanged() { if( !m_isTextChanged) { setWindowTitle(* windowTitle()); } m_isTextChanged true; }MainWindowUI.cpp#include MainWindow.h #include QMenu #include QDebug #include QIcon #include QSize #include QStatusBar #include QLabel MainWindow::MainWindow() { setWindowTitle(NotePad - [ New ]); m_filePath ; m_isTextChanged true; } MainWindow* MainWindow::NewInstance() { MainWindow* ret new MainWindow(); //创建对象 if( (ret NULL) || !ret-construct() ) { delete ret; ret NULL; } return ret; } bool MainWindow::construct() //初始化 { bool ret true; ret ret initMenuBar(); // 初始化菜单栏 ret ret initToolBar(); ret ret initStatusBar(); ret ret initMainEditor(); return ret; } bool MainWindow::initMenuBar() { bool ret true; QMenuBar* mb menuBar(); //获取Qt自带的菜单栏 ret ret initFileMenu(mb); //初始化文件菜单 ret ret initEditMenu(mb); ret ret initFormatMenu(mb); ret ret initViewMenu(mb); ret ret initHelpMenu(mb); return ret; } bool MainWindow::initToolBar() { bool ret true; QToolBar* tb addToolBar(Tool Bar); tb-setIconSize(QSize(16, 16)); ret ret initFileToolItem(tb); tb-addSeparator(); ret ret initEditToolItem(tb); tb-addSeparator(); // 创建分隔符 ret ret initFormatToolItem(tb); tb-addSeparator(); ret ret initViewToolItem(tb); return ret; } bool MainWindow::initStatusBar() { bool ret true; QStatusBar* sb statusBar(); QLabel* label new QLabel(hello world); if(label ! NULL) { statusLbl.setMinimumWidth(200); statusLbl.setAlignment(Qt::AlignCenter); statusLbl.setText(Ln: 1 Col: 1); label-setMinimumWidth(200); label-setAlignment(Qt::AlignCenter); sb-addPermanentWidget(new QLabel()); sb-addPermanentWidget(statusLbl); sb-addPermanentWidget(label); } else { ret false; } return ret; } bool MainWindow::initMainEditor() { bool ret true; mainEditor.setParent(this); connect(mainEditor, SIGNAL(textChanged()), this, SLOT(onTextChanged())); setCentralWidget(mainEditor); return ret; } bool MainWindow::initFileMenu(QMenuBar* mb) { QMenu* menu new QMenu(File(F), mb); //创建菜单File(F)F表示使用快捷键AltF快速打开菜单 bool ret (menu ! NULL); if(ret) { QAction* action NULL; ret ret makeAction(action, menu, New(N), Qt::CTRL Qt::Key_N); //创建菜单项New,用快捷键CtrlN打开New if( ret ) { connect(action, SIGNAL(triggered()), this, SLOT(onFileNew())); menu-addAction(action); // 把菜单项New放进File菜单中 } ret ret makeAction(action, menu, Open(O)..., Qt::CTRL Qt::Key_O); if( ret ) { connect(action, SIGNAL(triggered()), this, SLOT(onFileOpen())); menu-addAction(action); } ret ret makeAction(action, menu, Save(S), Qt::CTRL Qt::Key_S); if( ret ) { connect(action, SIGNAL(triggered()), this, SLOT(onFileSave())); menu-addAction(action); } ret ret makeAction(action, menu, Save As(A)..., 0); if( ret ) { connect(action, SIGNAL(triggered()), this, SLOT(onFileSaveAs())); menu-addAction(action); } menu-addSeparator(); //分隔符 ret ret makeAction(action, menu, Print(P)..., Qt::CTRL Qt::Key_P); if( ret ) { menu-addAction(action); } menu-addSeparator(); //分隔符 ret ret makeAction(action, menu, Exit(X), Qt::CTRL Qt::Key_X); if( ret ) { menu-addAction(action); } menu-addSeparator(); //分隔符 } if( ret ) { mb-addMenu(menu); //把File菜单加到菜单栏 qDebug() menu-parent(); } else { delete menu; } return ret; } bool MainWindow::initEditMenu(QMenuBar* mb) { QMenu* menu new QMenu(Edit(E), mb); bool ret (menu ! NULL); if(ret) { QAction* action NULL; ret ret makeAction(action, menu, Undo(U), Qt::CTRL Qt::Key_U); if( ret ) { menu-addAction(action); } ret ret makeAction(action, menu, Redo(R), Qt::CTRL Qt::Key_R); if( ret ) { menu-addAction(action); } menu-addSeparator(); ret ret makeAction(action, menu, Cut(T), Qt::CTRL Qt::Key_T); if( ret ) { menu-addAction(action); } ret ret makeAction(action, menu, Copy(C), Qt::CTRL Qt::Key_C); if( ret ) { menu-addAction(action); } ret ret makeAction(action, menu, Paste(P), Qt::CTRL Qt::Key_P); if( ret ) { menu-addAction(action); } ret ret makeAction(action, menu, Delete(L), Qt::CTRL Qt::Key_L); if( ret ) { menu-addAction(action); } menu-addSeparator(); ret ret makeAction(action, menu, Find(F), Qt::CTRL Qt::Key_F); if( ret ) { menu-addAction(action); } ret ret makeAction(action, menu, Replace(R), Qt::CTRL Qt::Key_R); if( ret ) { menu-addAction(action); } ret ret makeAction(action, menu, Goto(G), Qt::CTRL Qt::Key_G); if( ret ) { menu-addAction(action); } menu-addSeparator(); ret ret makeAction(action, menu, Select All(A), Qt::CTRL Qt::Key_A); if( ret ) { menu-addAction(action); } } if( ret ) { mb-addMenu(menu); } else { delete menu; } return ret; } bool MainWindow::initFormatMenu(QMenuBar* mb) { QMenu* menu new QMenu(Format(O), mb); bool ret (menu ! NULL); if(ret) { QAction* action NULL; ret ret makeAction(action, menu, Auto Wrap(W), Qt::CTRL Qt::Key_W); if( ret ) { menu-addAction(action); } ret ret makeAction(action, menu, Font(F), Qt::CTRL Qt::Key_F); if( ret ) { menu-addAction(action); } } if( ret ) { mb-addMenu(menu); } else { delete menu; } return ret; } bool MainWindow::initViewMenu(QMenuBar* mb) { QMenu* menu new QMenu(View(V), mb); bool ret (menu ! NULL); if(ret) { QAction* action NULL; ret ret makeAction(action, menu, Tool Bar(T), Qt::CTRL Qt::Key_T); if( ret ) { menu-addAction(action); } ret ret makeAction(action, menu, Status Bar(S), Qt::CTRL Qt::Key_S); if( ret ) { menu-addAction(action); } } if( ret ) { mb-addMenu(menu); } else { delete menu; } return ret; } bool MainWindow::initHelpMenu(QMenuBar* mb) { QMenu* menu new QMenu(Help(H), mb); bool ret (menu ! NULL); if(ret) { QAction* action NULL; ret ret makeAction(action, menu, User Manual, 0); if( ret ) { menu-addAction(action); } ret ret makeAction(action, menu, About NotePad, 0); if( ret ) { menu-addAction(action); } } if( ret ) { mb-addMenu(menu); } else { delete menu; } return ret; } bool MainWindow::initFileToolItem(QToolBar* tb) { bool ret true; QAction* action NULL; ret ret makeAction(action, tb, New, :Bes/1.png); if(ret) { connect(action, SIGNAL(triggered()), this, SLOT(onFileNew())); tb-addAction(action); } ret ret makeAction(action, tb, Open, :Bes/1.png); if(ret) { connect(action, SIGNAL(triggered()), this, SLOT(onFileOpen())); tb-addAction(action); } ret ret makeAction(action, tb, Save, :Bes/1.png); if(ret) { connect(action, SIGNAL(triggered()), this, SLOT(onFileSave())); tb-addAction(action); } ret ret makeAction(action, tb, Save As, :Bes/1.png); if(ret) { connect(action, SIGNAL(triggered()), this, SLOT(onFileSaveAs())); tb-addAction(action); } ret ret makeAction(action, tb, Print, :Bes/1.png); if(ret) { tb-addAction(action); } return ret; } bool MainWindow::initEditToolItem(QToolBar* tb) { bool ret true; QAction* action NULL; ret ret makeAction(action, tb, Undo, :Bes/1.png); if(ret) { tb-addAction(action); } ret ret makeAction(action, tb, Redo, :Bes/1.png); if(ret) { tb-addAction(action); } ret ret makeAction(action, tb, Cut, :Bes/1.png); if(ret) { tb-addAction(action); } ret ret makeAction(action, tb, Copy, :Bes/1.png); if(ret) { tb-addAction(action); } ret ret makeAction(action, tb, Paste, :Bes/1.png); if(ret) { tb-addAction(action); } ret ret makeAction(action, tb, Find, :Bes/1.png); if(ret) { tb-addAction(action); } ret ret makeAction(action, tb, Replace, :Bes/1.png); if(ret) { tb-addAction(action); } ret ret makeAction(action, tb, Goto, :Bes/1.png); if(ret) { tb-addAction(action); } return ret; } bool MainWindow::initFormatToolItem(QToolBar* tb) { bool ret true; QAction* action NULL; ret ret makeAction(action, tb, Auto Wrap, :Bes/1.png); if(ret) { tb-addAction(action); } ret ret makeAction(action, tb, Font, :Bes/1.png); if(ret) { tb-addAction(action); } return ret; } bool MainWindow::initViewToolItem(QToolBar* tb) { bool ret true; QAction* action NULL; ret ret makeAction(action, tb, Tool Bar, :Bes/1.png); if( ret ) { tb-addAction(action); } ret ret makeAction(action, tb, Status Bar, :Bes/1.png); if( ret ) { tb-addAction(action); } return ret; } bool MainWindow::makeAction(QAction* action, QWidget* parent, QString text, int key) { bool ret true; action new QAction(text, parent); if( action ! NULL ) { action-setShortcut(QKeySequence(key)); //设置快捷键 } else{ ret false; } return ret; } bool MainWindow::makeAction(QAction* action, QWidget* parent, QString tip, QString icon) //创建工具栏菜单项 { bool ret true; action new QAction(, parent); if( action ! NULL ) { action-setToolTip(tip); action-setIcon(QIcon(icon)); } else{ ret false; } return ret; } MainWindow::~MainWindow() { }