程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Qt之文本編輯器(一)

Qt之文本編輯器(一)

編輯:關於C語言

  今天開始呢,我們就開始用Qt做兩個比較實用的東西,這一篇我們主要探究下文本編輯器的實現。

     首先我們來看下我們的大致框架:  
  1. class MainWindow : public QMainWindow 
  2.     Q_OBJECT 
  3. public: 
  4.    MainWindow(); 
  5. protected: 
  6.     void closeEvent(QCloseEvent *event); 
對於所有定義的信號和槽的類,在類定義開始處的O_OBJECT宏都是必需的。  
  1. private slots: 
  2.     void newFile(); 
  3.     void open(); 
  4.     bool save(); 
  5.     bool saveAs(); 
  6.     void about(); 
  7.     void documentWasModified(); 
私有槽中包含了創建新文件、打開文件、保存文件以及about。當然了我們還有一個在程序中最重要的函數documentWasModified(),實現的共ing功能是判斷是否文件被修改。  
  1. private: 
  2.     void createActions(); 
  3.     void createMenus(); 
  4.     void createToolBars(); 
  5.     void createStatusBar(); 
  6.     void readSettings(); 
  7.     void writeSettings(); 
  8.     bool maybeSave(); 
  9.     void loadFile(const QString &fileName); 
  10.     bool saveFile(const QString &fileName); 
  11.     void setCurrentFile(const QString &fileName); 
  12.     QString strippedName(const QString &fullFileName); 
  13.  
  14.  
  15.     QTextEdit *textEdit; 
  16.     QString curFile; 
  17.  
  18.     QMenu *fileMenu; 
  19.     QMenu *editMenu; 
  20.     QMenu *formMenu; 
  21.     QMenu *helpMenu; 
  22.  
  23.     QToolBar *fileToolBar; 
  24.     QToolBar *editToolBar; 
  25.  
  26.     QAction *newAct; 
  27.     QAction *openAct; 
  28.     QAction *saveAct; 
  29.     QAction *saveAsAct; 
  30.     QAction *exitAct; 
  31.     QAction *automaticAct; 
  32.     QAction *typefaceAct; 
  33.     QAction *cutAct; 
  34.     QAction *copyAct; 
  35.     QAction *pasteAct; 
  36.     QAction *aboutAct; 
  37.     QAction *aboutQtAct; 
  38. }; 
在這裡面定義了在程序中用到的所有類的實例,createActions();createMenus();    createToolBars();createStatusBar();用於創建用戶接口。readSetting()用於恢復用戶以前的設置。下面我們就來一一看看具體實現:  
  1. MainWindow::MainWindow() 
  2.     textEdit = new QTextEdit; 
  3.     setCentralWidget(textEdit); 
  4.     createActions(); 
  5.     createMenus(); 
  6.     createToolBars(); 
  7.     createStatusBar(); 
  8.     readSettings(); 
  9.  
  10.     connect(textEdit->document(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified)); 
  11.     setCurrentFile(""); 
我們的構造函數首先創建一個文本框實例,而後設置中心窗體,再者調用用戶接口即可完成。  
  1. void MainWindow::closeEvent(QCloseEvent *event) 
  2.     if(maybeSave()) 
  3.     { 
  4.         writeSettings(); 
  5.         event->accept(); 
  6.     } 
  7.     else 
  8.     { 
  9.         event->ignore(); 
  10.     } 
closeEvent()函數實現功能:在用戶嘗試退出時警告用戶關於未保存的修改信息。  
  1. void MainWindow::newFile() 
  2.     if(maybeSave()) 
  3.     { 
  4.         textEdit->clear(); 
  5.         setCurrentFile(""); 
  6.     } 
newFile函數實現功能:首先判斷當前文件是否已保存,如果未保存先保存而後創建新文件。  
  1. void MainWindow::open() 
  2.     if(maybeSave()) 
  3.     { 
  4.         QString fileName = QFileDialog::getOpenFileName(this); 
  5.         if(!fileName.isEmpty()) 
  6.             loadFile(fileName); 
  7.     } 
open()函數實現功能:首先判斷當前文件是否已保存,如果未保存則先保存,而後通過QFileDialog的靜態函數getOpenFileName()獲取文件目錄,打開。  
  1. bool MainWindow::save() 
  2.     if(curFile.isEmpty()) 
  3.     { 
  4.         return saveAs(); 
  5.     } 
  6.     else 
  7.     { 
  8.         return saveFile(curFile); 
  9.     } 
  10. bool MainWindow::saveAs() 
  11.     QString fileName = QFileDialog::getSaveFileName(this); 
  12.     if(fileName.isEmpty()) 
  13.         return false; 
  14.     return saveFile(fileName); 
save() slot在用戶點擊File|Save菜單項時被調用。如果用戶還沒為文件提供一個名字,則調用saveAs(),否則調用saveFile()來保存文件。  
  1. void MainWindow::about() 
  2.     QMessageBox::about(this, tr("About Application"), 
  3.                        tr("The <b>Application</b> example created by <b>Yzs</b>    ")); 
about()函數對話框通過QMessageBox::about()靜態函數實現    
  1. void MainWindow::documentWasModified() 
  2.     setWindowModified(textEdit->document()->isModified()); 
documentWasModified() slot在QTextEdit中的文本被改變時被調用。我們調用QWidget::setWindowModified()來是標題欄顯示文件已被修改顯示個*號)。    
  1. void MainWindow::createActions() 
  2.     newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this); 
  3.     newAct->setShortcut(tr("Ctrl+N")); 
  4.     newAct->setStatusTip(tr("Create a new file")); 
  5.     connect(newAct, SIGNAL(triggered()), this, SLOT(newFile())); 
  6.  
  7.     openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this); 
  8.     openAct->setShortcut(tr("Ctrl+O")); 
  9.     openAct->setStatusTip(tr("Open an existing file")); 
  10.     connect(openAct, SIGNAL(triggered()), this, SLOT(open())); 
  11.  
  12.     saveAct = new QAction(QIcon(":/images/save.png"), tr("&Save"), this); 
  13.     saveAct->setShortcut(tr("Ctrl+S")); 
  14.     saveAct->setStatusTip(tr("Save a file")); 
  15.     connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); 
  16.  
  17.     saveAsAct = new QAction(tr("Save &As..."), this); 
  18.     saveAsAct->setStatusTip(tr("Save the file under a new name")); 
  19.     connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); 
  20.  
  21.     exitAct = new QAction(tr("E&xit"), this); 
  22.     exitAct->setShortcut(tr("Ctrl+Q")); 
  23.     exitAct->setStatusTip(tr("Exit the application")); 
  24.     connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); 
  25.  
  26.     automaticAct = new QAction(tr("&Automatic"), this); 
  27.     automaticAct->setChecked(false); 
  28.     automaticAct->setStatusTip(tr("Automatic the file")); 
  29.     connect(automaticAct, SIGNAL(triggered()), this, SLOT(automatic())); 
  30.  
  31.     typefaceAct = new QAction(tr("&Typeface"), this); 
  32.     typefaceAct->setStatusTip(tr("typefaceAct")); 
  33.     connect(typefaceAct, SIGNAL(triggered()), this, SLOT(typeface())); 
  34.  
  35.     cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this); 
  36.     cutAct->setShortcut(tr("Ctrl+X")); 
  37.     cutAct->setStatusTip(tr("Cut the current selection's contents to the clipboard")); 
  38.     connect(cutAct, SIGNAL(triggered()), this, SLOT(cut())); 
  39.  
  40.     copyAct = new QAction(QIcon(":/images/copy.png"), tr("&Copy"), this); 
  41.     copyAct->setShortcut(tr("Ctrl+C")); 
  42.     copyAct->setStatusTip(tr("Copy the current selection's contents to clipboard")); 
  43.     connect(copyAct, SIGNAL(triggered()), this, SLOT(copy())); 
  44.  
  45.     pasteAct = new QAction(QIcon(":/images/paste.png"), tr("&Paste"), this); 
  46.     pasteAct->setShortcut(tr("Ctrl+V")); 
  47.     pasteAct->setStatusTip(tr("Paste the current selection's contents to clipboard")); 
  48.     connect(pasteAct, SIGNAL(triggered()), this, SLOT(paste())); 
  49.  
  50.     aboutAct = new QAction(tr("&About"), this); 
  51.     aboutAct->setStatusTip(tr("Show the application's About box")); 
  52.     connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); 
  53.  
  54.     aboutQtAct = new QAction(tr("About &Qt"), this); 
  55.     aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); 
  56.     connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); 
  57.     cutAct->setEnabled(false); 
  58.     copyAct->setEnabled(false); 
  59.     connect(textEdit, SIGNAL(copyAvailable(bool)), 
  60.             cutAct, SLOT(setEnabled(bool))); 
  61.     connect(textEdit, SIGNAL(copyAvailable(bool)), 
  62.             copyAct, SLOT(setEnabled(bool))); 
QAction是一個代表用戶行為的對象,例如,保存文件或彈出對話框。一個action可以被放入QMenu或QToolBar中,也可以被放入其它重載了QWidget::actionEvent()的widget中。一個action有一個用於描述它作用的文本,當用戶觸發這個action時,它發出triggered()信號。我們將這個信號連接到一個slot上以實現真正的功能。Edit|Cut和Edit|Copy action必須在QTextEdit包含已選擇的文本時才有效。在默認情況下我們將它們禁用並將QTextEdit::copyAvailable()信號連接到QAction::setEnabled() slot上,以確保在文本編輯器中沒有選擇文本時著兩個行為無效。

本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/959827

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved