一、主窗口應用程序的建立
案例:----設計1個多文本編輯器,類似於word1.1 設計界面
步驟:
1、建立1個Qt4 Gui應用程序,主窗口的基類選 QMainWindow
2、在ui界面上,增加菜單 File Edit Help
3、在ui界面下方的Action Edit裏,建立QAction對象----new open
4、將這些QAction對象,拖拽到工具欄上,就成立工具按鈕;拖拽到File菜單裏,就成了子菜單
5、給這些工具按鈕添加 圖片,方法如下:
在當前工程下建立目錄 image
將png圖片文件拷貝到image目錄下
在項目上,點擊右鍵----選新建----選Qt資源文件----文件名填寫myImage
點擊 Add----選Add Priex---修改前綴名爲/image
點擊Add----選Add files----點刷新----將image目錄下的所以文件都選上----保持文件
回到在ui界面下方的Action Edit裏,修改這些QAction的icon,即選擇合適的圖片
完成
1.2 設計ActinNew觸發函數
步驟:
1、在cpp的構造函數中,將主界面的中心組件,設置爲QMdiArea類的對象,
mdiArea=new QMdiArea;
setCentralWidget(mdiArea);
注意://因爲其它函數,在後面還要經常使用mdiArea,因此mdiArea已在h文件中,定義爲成員變量,代碼爲:QMdiArea *mdiArea;
2、定義ActinNew,即新建文件動作觸發的函數---注意必須在ui界面下的Action Edit中,點擊動作右鍵----選Go to Slot
代碼:
void Edit001MainWindow::on_actionNew_triggered()
{
MyTextEdit *myTextEdit=new MyTextEdit;
QMdiSubWindow *mdiSubWindow=mdiArea->addSubWindow(myTextEdit);
mdiSubWindow->show(); //顯示子窗口
//myTextEdit->show(); //作用一樣
return;
}
注意:
1、MyTextEdit類是我們自定義的類,它繼承自QTextEdit,因爲我們需要在它的基礎上,增加文件打開、文件保存等功能
2、QMdiSubWindow類的對象 與 每個子窗口(或文件) 相對應,因此可以有多個2、QMdiSubWindow類的對象;而QMdiArea類的對象永遠只有1個
3、利用mdiArea->addSubWindow(myTextEdit),可以建立多個子窗口
3、補充自定義類 MyTextEdit,基類填QTextEdit
1.3 設計ActinOpen觸發函數
步驟:
1、定義ActionOpen,即打開文件動作 觸發的函數---注意必須在ui界面下的Action Edit中,點擊動作右鍵----選Go to Slot
void Edit001MainWindow::on_actionOpen_triggered()
{
QString fileName=QFileDialog::getOpenFileName(this,"打開文件","/root/lianxi_qt");
MyTextEdit *myTextEdit=new MyTextEdit;
QMdiSubWindow *mdiSubWindow=mdiArea->addSubWindow(myTextEdit);
myTextEdit->loadFile(fileName);
mdiSubWindow->show();
}
注意:
1、使用了Qt標準對話框之QFileDialog
2、它的靜態成員函數getOpenFileName,可以打開1個對話框,我們選擇1個文件後,它的返回值就是該文件名,而且是帶有路徑的----很好
3、loadFile函數是我們準備自定義的成員函數(屬於MyTextEdit類),它的功能是:根據文件名,打開1個文本文件,然後將文件內容全部讀取出來;通過父類QTextEdit的成員函數setPlaneText,設置讀取的內容爲控件的text
2、在MyTextEdit類中,定義loadFile函數
代碼:
void MyTextEdit::loadFile(QString fileName)
{
QFile file(fileName); //建立1個QFile對象,讓它和1個文件名關聯----類似fopen函數(fp指針 和1個文件名關聯)
file.open(QFile::ReadOnly|QFile::Text); //執行成員函數open後,就可以 以只讀方式、以文本方式 讀取文件內容了
QTextStream in(&file); //建立1個QTextStream文本流對象,它和1個QFile對象地址管理
setPlainText(in.readAll()); //執行QTextStream文本流對象的readAll函數,可以返回流裏的所有文本,類型爲QString; setPlainText函數是來設置控件的內容的
return;
}
1.4 設計ActinSave觸發函數
步驟:
1、定義ActionSave,即保存文件動作 觸發的函數---注意必須在ui界面下的Action Edit中,點擊動作右鍵----選Go to Slot
void Edit001MainWindow::on_actionSave_triggered()
{
MyTextEdit *myTextEdit=(MyTextEdit *)(mdiArea->activeSubWindow()->widget());
QString fileName=QFileDialog::getSaveFileName(this,"保存文件");//打開了1個標準對話框,是用來指定路徑和命名文件的
myTextEdit->saveFile(fileName); //注意,上面2句要寫在1起,否則運行後 有段錯誤
myTextEdit->show();
}
2、在MyTextEdit類中,定義saveFile函數
代碼:void MyTextEdit::saveFile(QString fileName)
{
QFile file(fileName);
file.open(QFile::WriteOnly|QFile::Text);
QTextStream out(&file);
out<<toPlainText();
return;
}
注意:在h文件中,應有函數原型