第5章Qt5主窗体5.1Qt5主窗体构成5.2Qt5文件操作功能5.3Qt5图像坐标变换5.4Qt5文本编辑功能5.5Qt5排版功能5.1Qt5主窗体构成5.1.1基本元素QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、多个锚接部件(dockwidgets)、一个状态栏(statusbar)及一个中心部件(centralwidget),是许多应用程序的基础,如文本编辑器、图片编辑器等。本章将对此进行详细介绍。其界面布局如图5.1所示。5.1.2典型案例(文本编辑器)首先,介绍文件操作功能,包括新建一个文件,利用标准文件对话框QFileDialog类打开一个已存在的文件,利用QFile和QTextStream读取文件内容,打印文件(分文本打印和图像打印)。接着,介绍图像处理软件中的常用功能,包括图片的缩放、旋转及镜像等坐标变换,使用QMatrix实现图像的各种坐标变换。然后,开发文本编辑功能,通过在工具栏上设置文字字体、字号大小、加粗、斜体、下画线及字体颜色等快捷按钮的实现,介绍了在工具栏中嵌入控件的方法。最后是排版功能,通过选择某种排序方式实现对文本排序,以及实现文本对齐(包括左对齐、右对齐、居中对齐和两端对齐)和撤销、重做的方法。5.1.2典型案例(文本编辑器)本章案例见程序源代码CH501,最终实现的效果如图5.2所示。5.1.3菜单与工具栏的实现1.动作(Action)的实现以下是实现基本文件操作的动作(Action)的代码。以下是实现打印文本和图像、图像缩放、旋转和镜像的动作(Action)的代码。2.菜单(Menus)的实现在实现了各个动作之后,需要将它们通过菜单、工具栏或快捷键的方式体现出来,以下是菜单的实现函数createMenus()代码。3.工具栏(ToolBars)的实现接下来实现相对应的工具栏createToolBars(),主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的方式,也可根据需要进行工具条的划分。5.1.3菜单与工具栏的实现将程序中用到的图片保存到该工程下的debug文件夹中,运行程序,结果如图5.3所示。5.2Qt5文件操作功能(1)打开“imgprocessor.h”头文件,添加“protectedslots:”变量:protectedslots:voidShowNewFile();(2)在createActions()函数的“新建动作”最后添加事件关联:connect(NewFileAction,SIGNAL(triggered()),this,SLOT(ShowNewFile()));(3)实现新建文件功能的函数ShowNewFile()如下:voidImgProcessor::ShowNewFile(){ImgProcessor*newImgProcessor=newImgProcessor;newImgProcessor-show();}5.2.1新建文件5.2.1新建文件(4)运行程序,单击“文件”→“新建”命令或单击工具栏上的按钮,弹出新的文件编辑窗口,如图5.4所示。5.2.2打开文件(1)在“imgprocessor.h”头文件中添加“protectedslots:”变量:voidShowOpenFile();(2)在createActions()函数的“打开动作”最后添加事件关联:connect(openFileAction,SIGNAL(triggered()),this,SLOT(ShowOpenFile()));5.2.2打开文件(3)实现打开文件功能的函数ShowOpenFile()如下:voidImgProcessor::ShowOpenFile(){fileName=QFileDialog::getOpenFileName(this);if(!fileName.isEmpty()){if(showWidget-text-document()-isEmpty()){loadFile(fileName);}else{ImgProcessor*newImgProcessor=newImgProcessor;newImgProcessor-show();newImgProcessor-loadFile(fileName);}}}5.2.2打开文件其中,loadFile()函数的实现如下,该函数利用QFile和QTextStream完成具体读取文件内容的工作:voidImgProcessor::loadFile(QStringfilename){printf(filename:%s\n,filename.data());QFilefile(filename);if(file.open(QIODevice::ReadOnly|QIODevice::Text)){QTextStreamtextStream(&file);while(!textStream.atEnd()){showWidget-text-append(textStream.readLine());printf(readline\n);}printf(end\n);}}5.2.2打开文件在此仅详细说明标准文件对话框QFileDialog的getOpenFileName()静态函数各个参数的作用,其他文件对话框类中相关的静态函数的参数有与其类似之处。QStringQFileDialog::getOpenFileName(QWidget*parent=0,constQString&caption=QString(),constQString&dir=QString(),constQString&filter=QString(),QString*selectedFilter=0,Optionsoptions=0);5.2.2打开文件(4)在该源文件的开始部分添加如下头文件:#includeQFileDialog#includeQFile#includeQTextStream(5)运行程序,单击“文件”→“打开”命令或单击工具栏上的按钮,弹出“打开”对话框,如图5.5(a)所示。选择某个文件,单击“打开”按钮,文本编辑框中将显示出该文件的内容,如图5.5(b)所示。5.2.3打印文件1.文本打印打印文本在文本编辑工作中经常使用,下面将介绍如何实现文本打印功能。实现后的效果如图5.6所示。5.2.3打印文件(1)在头文件中添加“protectedslots:”变量:voidShowPrintText();(2)在createActions()函数的“打印文本动作”最后添加事件关联:connect(PrintTextAction,SIGNAL(triggered()),this,SLOT(ShowPrintText()));(3)实现打印文本功能的函数ShowPrintText()如下:voidImgProcessor::ShowPrintText(){QPrinterprinter;QPrintDialogprintDialog(&printer,this);if(printDialog.exec()){QTextDocument*doc=showWidget-text-document();doc-print(&printer);}}5.2.3打印文件(4)在该源文件的开始部分添加如下头文件:#includeQPrintDialog#includeQPrinter(5)运行程序,单击“文件”→“打印文本”命令或工具栏上的按钮,弹出标准打印对话框,如图5.6所示。5.2.3打印文件2.图像打印(1)在头文件中添加“protectedslots:”变量:voidShowPrintImage();(2)在createActions()函数的最后添加事件关联:connect(PrintImageAction,SIGNAL(triggered()),this,SLOT(ShowPrintImage()));(3)实现打印图像功能的函数ShowPrintImage()如下:voidImgProcessor::ShowPrintImage(){QPrinterprinter;QPrintDialogprintDialog(&printer,this);if(printDialog.exec()){QPainterpainter(&printer);QRectrect=painter.viewport();QSizesize=img.size();size.scale(rect.size(),Qt::KeepAspectRatio);painter.setViewport(rect.x(),rect.y(),size.width(),size.height());painter.setWindow(img.rect());painter.drawImage(0,0,img);}}5.2.3打印文件(4)在该源文件的开始部分添加如下头文件:#includeQPainter(5)运行程序,单击“文件”→“打印图像”命令或单击工具栏上的按钮,弹出标准打印对话框,显示效果如图5.6所示。5.3Qt5图像坐标变换5.3.1缩放功能(1)在头文件中添加“protectedslots:”变量:voidShowZoomIn();(2)在createActions()函数的最后添加事件关联:connect(zoomInAction,SIGNAL(triggered()),this,SLOT(ShowZoomIn()));(3)实现图形放大功能的函数ShowZoomIn()如下:voidImgProcessor::ShowZoomIn(){if(img.isNull())return;QMatrixmartix;martix.scale(2,2);img=img.transformed(martix);showWidget-imageLabel-setPixmap(QPixmap::fromImage(img));}5.3.1缩放功能(4)在头文件中添加“protectedslots:”变量:voidShowZoomOut();(5)在createActions()函数的最后添加事件关联:connect(zoomOutAction,SIGNAL(triggered()),this,SLOT(ShowZoomOut()));(6)实现图形缩小功能的函数ShowZoomOut()如下:voidImgProcessor::ShowZoomOut(){if(img.isNull())return;QMatrixmatrix;matrix.scale(0.5,0.5);img=img.transformed(matrix);showWidget-imageLabel-setPixmap(QPixmap::fromImage(img));}5.3.1缩放功能(7)运行程序,单击“编辑”→“放大”命令或单击工具栏上的按钮,界面效果如图5.7所示。5.3.2旋转功能(1)在头文件中添加“protectedslots:”变量:voidShowRotate90();(2)在createActions()函数的最后添加事件关联:connect(rotate90Action,SIGNAL(triggered()),this,SLOT(ShowRotate90()));(3)ShowRotate90()函数的具体实现代码如下:voidImgProcessor::ShowRotate90(){if(img.isNull())return;QMatrixmatrix;matrix.rotate(90);img=img.transformed(matrix);showWidget-imageLabel-setPixmap