一、主窗口应用程序的建立
案例:----设计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文件中,应有函数原型