Qt 图形 课程设计

郑州科技学院

      QT课程设计

                                         

    题    目  图形图像的绘制         

    学生姓名                   

    专业班级                  

    学    号                

    所 在 系  信息工程学院            

    指导教师                    

    完成时间  年 月日      

                                     目  录

1. 概述............................................... 4

1.1 背景说明....................................... 4

1.1.1简介................................................... 4

    1.1.2 功能和优势............................................ 4

1.2 项目名称....................................... 5

1.3 项目功能....................................... 5

1.4 项目基本框架结构................................ 5

2. 各模块功能的介绍................................... 6

    2.1 工具栏......................................... 6

        2.1.1 file文件.............................................. 6

       2.1.2 help帮助.............................................. 7

2.2 操纵台......................................... 7

       2.2.1 style线型选择......................................... 7

       2.2.2 width画笔宽度......................................... 8

       2.2.3 color画笔颜色......................................... 8

       2.2.4 clear清空画板......................................... 9

       2.2.5 绘制图形.............................................. 9

       2.2.6 erasor 橡皮擦........................................ 10

       2.2.7坐标定位.............................................. 11

       2.2.8画布.................................................. 11

2.3 布局格式...................................... 11

3. 详细设计.......................................... 12

3.1 子菜单功能的实现............................... 12

       3.1.1 New功能的实现........................................ 12

       3.1.2 Open 功能的实现...................................... 13

       3.1.3 Save 功能的实现...................................... 13

       3.1.4 SaveAs 功能的实现.................................... 14

       3.1.5 Exit 功能的实现...................................... 15

3.2  悬浮窗内各个功能的实现........................ 15

       3.2.1 Style功能的实现...................................... 15

       3.2.2 Width 功能的实现..................................... 16

       3.2.3 Color 功能的实现..................................... 17

       3.2.4 Clear 功能的实现..................................... 18

       3.2.5 绘图功能的实现....................................... 19

       3.2.6 erasor 功能的实现.................................... 20

3.3 鼠标形状设置................................... 20

3.4 坐标位置显示功能的实现......................... 21

4. 项目中所用到的QT知识介绍.......................... 21

4.1 信号与槽...................................... 21

4.2 创建主窗口.................................... 23

4.3 自定义窗口部件................................ 23

4.4 布局管理...................................... 23

4.5 QT中的事件机制................................ 24

4.6 二维图形的绘制................................ 25

4.7 项目中建立的类................................ 25

4.8 类之间的相互关系............................... 25

结束语…………………………………………………………………26

致谢……………………………………………………………………26

参考文献............................................. 27


1.概述

1.1背景说明 

1.1.1简介

   Qt Creator 包括项目生成向导、高级的 C++ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等。

1.1.2 功能和优势

    QtCreator主要是为了帮助新 Qt 用户更快速入门并运行项目,还可提高有经验的 Qt 开发人员的工作效率。

1.使用强大的 C++ 代码编辑器可快速编写代码

语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能

2.使用浏览工具管理源代码

集成了领先的版本控制软件,包括 Git、Perforce 和 Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换

3.为Qt跨平台开发人员的需求而量身定制

集成了特定于 Qt 的功能,如信号与槽 (Signals & Slots)图示调试器, 对 Qt 类结构可一目了然集成了 Qt Designer 可视化布局和格式构建器只需单击一下就可生成和运行 Qt 项目。

1.2 项目名称

图形图像的绘制

1.3项目功能

在本项目中利用QT creator对图像图形进行相应的绘制,在此过程中,操作者可以实现文件的新建、打开、保存、另存为、退出以及相应的帮助功能,在主要的操作窗口中可以选择相应的样式风格,以及用户所要绘制的图形图像,用户可以对自己所绘制的图形做些相应的修改,例如:修改图形的宽度、颜色等,如果用户对自己所绘制的图形不满意的情况下,还可以选择不同大小的橡皮擦,对需要进行修改的图形进行修改。

1.4项目基本框架结构

 运行结果如下图:

                                    图1.1

                                   图1.2

                                    图1.3

2.各模块功能的介绍

2.1工具栏

2.1.1 file文件

文件的下拉菜单中包含

1.new(新建)

newAct=newQAction(QIcon(":/new/prefix1/image/new.PNG"),tr("&New"),this);

2.open(打开一个图片)

openAct=newQAction(QIcon(":/images/open.png"),tr("&Open..."),this);

3.save(保存)在此菜单中用户可以根据提示将所打开的文件保存到自己想要保存的位置,方便以后用户的查找。

saveAct=newQAction(QIcon(":/new/prefix1/image/save.PNG"),tr("&Save"),this);

4.saveas(另存为)和save的功能类似,只是用户将打开的文件保存的时候更改一下路径。

saveAsAct=newQAction(tr("Save&As..."),this);

5.exit(退出)。

exitAct=newQAction(tr("E&xit"),this);

2.1.2 help帮助

   不懂本工具操作的用户可以查看qt creator的相应信息,使用户对本工具的了解更加深入。

2.2操纵台

2.2.1 style线型选择

通过一个组合框对以下线性进行选择:

1.SolidLine实线

2.DashLine虚线

3.DotLine点线

4.DashDotLine一个虚线一个点组成的线

5.DashDotDotLine一个虚线两个点组成的线

可以在源文件controlbox中进行相应的操作,具体代码如下:

styleLabel = new QLabel("style");

styleComboBox = new QComboBox;

styleComboBox->addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine));

styleComboBox->addItem("DashLine",static_cast<int>(Qt::DashLine));

styleComboBox->addItem("DotLine",static_cast<int>(Qt::DotLine));

 styleComboBox->addItem("DashDotLine",static_cast<int>(Qt::DashDotLine));

       styleComboBox->addItem("DashDotDotLine",static_cast<int>(Qt::DashDotDotLine));

2.2.2 width画笔宽度

    用户可通过一个组件布局选择自己所需要的画笔宽度,在此项目中画笔宽度默认值为1,具体实现方式如下:

widthLabel = new QLabel("Width");

widthSpinBox = new QSpinBox;

widthSpinBox->setValue(1);

2.2.3 color画笔颜色

    用户可以手动的调整画笔颜色,此项目画笔的颜色默认为黑色,具体实现功能的代码如下:

colorLabel = new QLabel("Color");

colorBtn = new QToolButton;

QPixmap pixmap(20,20);

ixmap.fill(Qt::black);

colorBtn->setIcon(QIcon(pixmap));

图例为:

       

2.2.4 clear清空画板

    点击相应的按钮可清除用户在画板上所做的操作,恢复成最原始的状态,具体实现如以下代码:

clearBtn = new QToolButton();

clearBtn->setText("clear");

2.2.5 绘制图形

用户可以绘制的图形有:

1.rectangle矩形

rectangle=new QPushButton(QIcon(":/new/prefix1/image/qpainter-rectangle.png"),tr("rectangle"),0);

2.roundrectangle圆角矩形

roundrect=new QPushButton(QIcon(":/new/prefix1/image/qpainter-roundrect.png"),tr("roundrect"),0);

3.ellipse椭圆(当按着Shift键绘制时为圆形)

ellipse=new QPushButton(QIcon(":/new/prefix1/image/qpainter-ellipse.png"),tr("ellipse "),0);

4.chord弦

chord=new QPushButton(QIcon(":/new/prefix1/image/qpainter-chord.png"),tr("chord   "),0);

5.line线

line=new QPushButton(QIcon(":/new/prefix1/image/Line(2).png"),tr("line    "),0);

6.pen画笔

pen=new QPushButton(QIcon(":/new/prefix1/image/cursor_pen.png"),tr("pen     "),0);

2.2.6 erasor 橡皮擦

用户在不满意的情况下可以使用橡皮擦工具,可以将自己不满意的地方进行擦除,然后就可以按照自己想绘制的图形进行相应的修改。

erasor=new QPushButton(QIcon(":/new/prefix1/image/cursor_erasor.png"),tr("eraser  "),0);

用户可以在橡皮按钮后面的一个组合框中选择自己想要的橡皮的大小,具体可以选择3mm、6mm、9mm,这样可以使用户更加方便的对自己绘制的图形图像进行相应的修改。

erasorComboBox = new QComboBox;

erasorComboBox->addItem(QIcon(":/new/prefix1/image/3mmLine.png"),tr("3mm"),0);

erasorComboBox->addItem(QIcon(":/new/prefix1/image/6mmLine.png"),tr("6mm"),0);

erasorComboBox->addItem(QIcon(":/new/prefix1/image/10mmLine.png"),tr("9mm"),0);

2.2.7坐标定位

可以显示画布中鼠标的具体位置。

2.2.8画布

画布的创建

创建一张新的画布,等待用户绘制图片。

实现代码如下:

pix=newQPixmap(this->size());

画布的颜色初始化

初始化画布的颜色,使它拥有一个初始背景颜色。

实现代码如下:

pix->fill(Qt::white);

画板大小

初始化画布的大小,使它能适合画板控件。

实现代码如下:

pix=newQPixmap(this->size());

setMinimumSize(600,400);

2.3布局格式

使用的是QVBoxLayout 垂直管理器格式的布局。

QGridLayout *gridLayout = new QGridLayout(this);

spacelayout=new QVBoxLayout;

gridLayout->addWidget(styleLabel,0,0);

gridLayout->addWidget(styleComboBox,0,1,1,2);

gridLayout->addWidget(widthLabel,1,0);

gridLayout->addWidget(widthSpinBox,1,1,1,2);

gridLayout->addWidget(colorLabel,2,0);

gridLayout->addWidget(colorBtn,2,1);

gridLayout->addWidget(clearBtn,3,0);

gridLayout->addWidget(rectangle,4,0,1,4);

gridLayout->addWidget(roundrect,5,0,1,4);

gridLayout->addWidget(ellipse,6,0,1,4);

gridLayout->addWidget(chord,7,0,1,4);

gridLayout->addWidget(line,8,0,1,4);

gridLayout->addWidget(pen,9,0,1,4);

gridLayout->addWidget(erasor,10,0);

gridLayout->addWidget(erasorComboBox,10,1,1,2);

gridLayout->addLayout(spacelayout,12,0,2,4);

3.详细设计

3.1子菜单功能的实现

3.1.1 New功能的实现

步骤如下:

1新建一个QAction,,并将此子菜单项命名为New

newAct=newQAction(QIcon(":/new/prefix1/image/new.PNG"),tr("&New"),this);

2添加快捷键:newAct->setShortcuts(QKeySequence::New);  Ctrl+N

3当鼠标指向此子菜单项的时候,在状态栏显示信息为:Create a new file

newAct->setStatusTip(tr("Createanewfile"));

4当此子菜单项被触发(单击子菜单项)的时候,激活newFile 槽函数。

connect(newAct,SIGNAL(triggered()),this,SLOT(newFile()));

在此应用到信号-槽机制,这是QT里面极为重要的特色内容,当一个QAction被触发的时候,系统会自动调用与此信号相关联的槽函数,newFile()是自定义的一个实现新建图片文件的槽函数。

5将此QAction添加到File 菜单中:

fileMenu->addAction(newAct);

3.1.2 Open 功能的实现

步骤如下:

1新建一个QAction,,并将此子菜单项命名为Open

openAct=newQAction(QIcon(":/images/open.png"),tr("&Open..."),this);2添加快捷键:openAct->setShortcuts(QKeySequence::Open);  Ctrl+O

3当鼠标指向此子菜单项的时候,在状态栏显示信息为:Open an existing file

openAct->setStatusTip(tr("Openanexistingfile"));

4当此子菜单项被触发(单击子菜单项)的时候,激活Open() 槽函数。

connect(openAct,SIGNAL(triggered()),this,SLOT(open()));

在此应用到信号-槽机制,这是QT里面极为重要的特色内容,当一个QAction被触发的时候,系统会自动调用与此信号相关联的槽函数,open()是自定义的一个实现打开一个图片文件的槽函数。

5将此QAction添加到File 菜单中:

fileMenu->addAction(openAct);

3.1.3 Save 功能的实现

步骤如下:

1新建一个QAction,,并将此子菜单项命名为Save

saveAct=newQAction(QIcon(":/new/prefix1/image/save.PNG"),tr("&Save"),this);

2添加快捷键:saveAct->setShortcuts(QKeySequence::Save);Ctrl+s

3当鼠标指向此子菜单项的时候,在状态栏显示信息为:

Save the document to disk

saveAct->setStatusTip(tr("Save the document to disk"));

4当此子菜单项被触发(单击子菜单项)的时候,激活Save() 槽函数。

connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));

在此应用到信号-槽机制,这是QT里面极为重要的特色内容,当一个QAction被触发的时候,系统会自动调用与此信号相关联的槽函数,Save()是自定义的一个实现保存图片文件的槽函数。

5将此QAction添加到File 菜单中:

fileMenu->addAction(saveAct);

3.1.4 SaveAs 功能的实现

步骤如下:

1新建一个QAction,,并将此子菜单项命名为SaveAs

saveAsAct=newQAction(tr("Save&As..."),this);

2添加快捷键:saveAsAct->setShortcuts(QKeySequence::SaveAs);Ctrl+s+a

3当鼠标指向此子菜单项的时候,在状态栏显示信息为:

Save the document under a new name

saveAsAct->setStatusTip(tr("Save the document under a new name"));

4当此子菜单项被触发(单击子菜单项)的时候,激活saveAs() 槽函数。

connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));

在此应用到信号-槽机制,这是QT里面极为重要的特色内容,当一个QAction被触发的时候,系统会自动调用与此信号相关联的槽函数,saveAs()是自定义的一个实现将图片文件另存为一个新文件的槽函数。

5将此QAction添加到File 菜单中:

fileMenu->addAction(saveAsAct);

3.1.5 Exit 功能的实现

步骤如下:

1新建一个QAction,,并将此子菜单项命名为Exit

exitAct=newQAction(tr("E&xit"),this);

2添加快捷键:exitAct->setShortcuts(QKeySequence::Quit);

3当鼠标指向此子菜单项的时候,在状态栏显示信息为:

Exit the application

exitAct->setStatusTip(tr("Exit the application"));

4当此子菜单项被触发(单击子菜单项)的时候,激活close() 槽函数。

connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));

在此应用到信号-槽机制,这是QT里面极为重要的特色内容,当一个QAction被触发的时候,系统会自动调用与此信号相关联的槽函数,close()是系统内部的一个实现关闭或者退出一个应用程序的槽函数。

5将此QAction添加到File 菜单中:

fileMenu->addAction(exitAct);

3.2 悬浮窗内各个功能的实现

3.2.1 Style功能的实现

步骤如下:

1在组合框中添加线型:

    styleComboBox->addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine));    styleComboBox->addItem("DashLine",static_cast<int>(Qt::DashLine));    styleComboBox->addItem("DotLine",static_cast<int>(Qt::DotLine));    styleComboBox->addItem("DashDotLine",static_cast<int>(Qt::DashDotLine));     styleComboBox->addItem("DashDotDotLine",static_cast<int>(Qt::DashDotDotLine));

这些线型都是QT 内部自定义。

2关联信号与槽

connect(controlBox->styleComboBox,SIGNAL(activated(int)),this,SLOT(ShowStyle()));

将组合框内子项的触发与主窗口类中的ShowStyle()槽函数进行关联。单击某个线型的时候就会自动调用ShowStyle()槽函数。

ShowStyle()槽函数的实现内容是:

void MainWindow::ShowStyle()

{

drawArea->setStyle(controlBox->styleComboBox->itemData(              controlBox->styleComboBox->currentIndex(),Qt::UserRole).toInt());

}即:给画板的setStyle()函数传递一个线型参数,下面为setStyle()函数:

void DrawWidget::setStyle(int s)

{

   style = s;

}这样style就获得一个整型值。再通过执行下面的这条语句就完成了画笔线型的选择:pen.setStyle((Qt::PenStyle)style);

3.2.2 Width 功能的实现

步骤如下:

1添加宽度框widthSpinBox:

widthSpinBox = new QSpinBox;

widthSpinBox->setValue(1);

给了它一个默认宽度。

2信号与槽关联

connect(controlBox->widthSpinBox,SIGNAL(valueChanged(int)),drawArea,SLOT(setWidth(int)));那么,当widthSpinBox的值被改变的时候,将调用画板的setWidth()方法,setWidth()方法内容如下:

void DrawWidget::setWidth(int w)

{

   weight = w;

}

这时便将widthSpinBox中的索引值作为参数传递给变量weight,再通过pen.setWidth(weight);这条语句的执行就完成了画笔宽度的调节。

3.2.3 Color 功能的实现

步骤如下:

1添加颜色colorBtn

colorBtn=new QToolButton;

2信号与槽关联

connect(controlBox->colorBtn,SIGNAL(clicked()),this,SLOT(ShowColor()));

单击colorBtn将调用主窗口类的ShowColor(),ShowColor()槽函数内容如下:

void MainWindow::ShowColor()

{

   QColor  = QColorDialog::getColor(Qt::black,this);

      if(color.isValid())

      {

          drawArea->setColor(color);

          QPixmap p(20,20);

          p.fill(color);

          controlBox->colorBtn->setIcon(QIcon(p));

      }

}

Color用于获得用户选择的某种颜色值,画板类中的setColor(color):

void DrawWidget::setColor(QColor c)

{

   color = c;

}

将颜色参数传递过来,再执行画板类中pen.setColor(color);语句,即完成画笔颜色选择。

3.2.4 Clear 功能的实现

步骤如下:

1添加clearBtn按钮

clearBtn->setText("clear");

2信号与槽关联

connect(controlBox->clearBtn,SIGNAL(clicked()),drawArea,SLOT(clear()));

在主窗口类中将其关联,单击clearBtn的时候,调用画板类中槽函数clear():

void DrawWidget::clear()

{

   pix->fill(Qt::white);

   this->update();

}即可清除画布上的所有内容。

3.2.5 绘图功能的实现

步骤如下:

1添加各个按钮

rectangle-line,逐个添加并且为它们布局。

2信号与槽相关联

connect(controlBox->rectangle,SIGNAL(clicked()),drawArea,SLOT(drawrectangle()));

connect(controlBox->roundrect,SIGNAL(clicked()),drawArea,SLOT(drawroundrect()));

connect(controlBox->ellipse,SIGNAL(clicked()),drawArea,SLOT(drawellipse()));

connect(controlBox->chord,SIGNAL(clicked()),drawArea,SLOT(drawchord()));

connect(controlBox->line,SIGNAL(clicked()),drawArea,SLOT(drawline()));

由上面的代码可见,其中任意一个按钮被单击的时候将会调用与此按钮信号相关联的槽函数,它们的绘图方法都极为相似,我们拿drawrectangle()进行解析:

void DrawWidget::drawrectangle()

{

   shape=Rectangle;

   this->setCursor(Qt::CrossCursor);

}其中shape 是枚举类型,这时通过判断shape的值执行相应的绘图语句,如果是Rectangle,则执行绘制矩形语句。

3.2.6 erasor 功能的实现

步骤如下:

1添加erasor按钮

2信号与槽相关联

connect(controlBox->erasor,SIGNAL(clicked()),drawArea,SLOT(erasor()));橡皮擦的实现和画笔是同样的原理,只不过将画笔的颜色设置为白色,可以涂去画板上的内容。

 pen.setColor(Qt::white);

3添加erasor宽度组合框

4erasor宽度信号与槽相关联

connect(controlBox->erasorComboBox,SIGNAL(currentIndexChanged(int)),drawArea,SLOT(setErasorWidth(int)));

槽函数获得一个索引值赋给erasorWith,执行pen.setWidth(erasorWidth);可设置橡皮擦宽度。

3.3 鼠标形状设置

第一种:

this->setCursor(Qt::CrossCursor);内部鼠标形状。

第二种:

QCursor*cursor=newQCursor(QPixmap(":/new/prefix1/image/10mm.png"),-1,-1);

this->setCursor(*cursor);自定义鼠标形状。

3.4坐标位置显示功能的实现

这里涉及到鼠标移动事件以及信号—槽机制。

1在画板类中的鼠标移动事件中发射一个信号:

Emit signalMousePos(e->pos().x(),e->pos().y());

意思是将获得的当前鼠标位置坐标作为信号的参数进行发送。

2在主窗口类中定义一个槽函数如下:

void MainWindow::setMousePosDisplay(int x, int y)

{

   QString str = "(" + QString::number(x) + "," +QString::number(y) + ")";

   statusBar()->showMessage(str);

}用以得到当前鼠标的坐标位置。

3将信号和槽相关联

connect(drawArea,SIGNAL(signalMousePos(int,int)),this,SLOT(setMousePosDisplay(int,int)));

本项目的内容以及画图工具功能的实现基本如上所述。

4.项目中所用到的QT知识介绍

4.1信号与槽

    信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。信号和槽是 QT 自行定义的一种通信机制,它独立于标准的 C/C++ 语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C++ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码。你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。

信号由moc 自动生成,他们不应该在.cpp文件中实现。例如:

Signals:

Void mySignal();

Void mySignal(int x);

Void mySignal(int x);

    Void mySignalParam(int x,int y);

槽函数也分为三种类型,即 public slots、private slots 和 protected slots。

·        public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。

·        protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。

·        private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。

    通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:

      bool QObject::connect ( const QObject * sender, const char * signal,

         const QObject * receiver, const char * member ) [static]

这个函数的作用就是将发射者 sender 对象中的信号 signal 与接收者 receiver 中的 member 槽函数联系起来。当指定信号 signal 时必须使用 QT 的宏 SIGNAL(),当指定槽函数时必须使用宏 SLOT()。如果发射者与接收者属于同一个对象的话,那么在 connect 调用中接收者参数可以省略。

4.2创建主窗口

主窗口是构建应用程序用户界面的框架,其中包括菜单,工具栏以及应用程序所需的对话框。在本项目中利用QMain Window类创建了主窗口,继承了Main Window的详细方法,具体内容详见代码。

4.3自定义窗口部件

    窗口中显示的不同部件,既可以是QT中提供的类所定义的对象,也可以是自己绘制的。自定义窗口部件要用到QWidget类,以及在绘制界面时用到的双缓冲技术。其中QWidget类是所有用户界面对象类的基类,经常用到的一些构成界面的窗口部件都是继承自它,例如:QLable、QLainEdit等子类。这些部件可以在界面上显示,组成了与用户交互的窗口,都具有一些QWidget类的共有特点。双缓冲技术是图形图像处理编程过程中的基本技术。

4.4布局管理

    对于一个GUI用户界面来说,,合理地安排每一个窗口部件是很必要的。如果没有合理的布局,那么界面会变的杂乱无章,将会影响与用户的交互功能,从而失去了GUI用户界面最本质的功能。例如:窗口部件在界面布局中的位置、大小等。特别是当用户对窗口进行拉伸的时候,窗口部件中的子窗口部件也应该做出相应的变化,否则有些部件将无法进行正常使用。对于一个常见的窗口子部件,它在窗口中的位置以及大小应该是固定的,那么怎么来确定它的大小和位置,QT提供了三种方式:绝对位置;手工布局;布局管理器,其中布局管理器还包括水平布局管理器QHBoxLayout、垂直布局管理器QVBoxLayout、网格布局管理器QGridLayout。在本项目中使用了垂直布局管理器。

4.5 QT中的事件机制

事件起源基于事件如何被产生与分发,可以把事件分为以下三类。

1.Spontaneous 事件——自发事件:由窗口系统产生,它们被放到系统队列中,通过事件循环逐个处理。

2.Posted 事件:由Qt或是应用程序产生,它们被Qt组成队列,再通过事件循环处理。

3.Sent 事件:由Qt或是应用程序产生,但它们被直接发送到目标对象。

事件处理与过滤

Qt中的事件可以在五个不同的层次上被处理

1.重新实现一个特定的事件handler

QObject与QWidget提供了许多特定的事件handlers,分别对应于不同的事件类型。(如paintEvent()对应paint事件)

2.重新实现QObject::event()

event()函数是所有对象事件的入口,QObject和QWidget中缺省的实现是简单地把事件推入特定的事件handlers。

3.在QObject安装上事件过滤器

事件过滤器是一个对象,它接收别的对象的事件,在这些事件到达指定目标之间。

4.在aApp上安装一个事件过滤器

它会监视程序中发送到所有对象的所有事件。

5.重新实现QApplication:notify()

Qt的事件循环与sendEvent()调用这个函数来分发事件,通过重写它,你可以在别人之前看到事件。

事件的分类:

最常见的事件是鼠标事件QMouoseEvent和键盘事件QKeyEvent。QMouoseEvent类是描述鼠标事件的,其中有3个鼠标事件方法:mouseMoveEvent、mousePressEvent和mouseReleaseEvent,当有鼠标事件发生时,就会响应相应的函数。QKeyEvent类是描述键盘的事件的,当按键被压或被释放时,键盘事件被发送到部件。一个键盘事件包含一个特别的接受标志,这个标志指示接受者是否将会处理这个键盘事件。

4.6二维图形的绘制

    QT中二维绘图部分称为Arthur绘图系统。它由三个类支撑整个框架,QPainterDevice、QPainterEngine和QPainter。QPainter类提供了很多高度优化的函数去做大部分的GUI绘制工作,可以画简单的和复杂的形状。通常情况下,QPainter的使用时Widget当中painter事件的使用,用来执行具体的绘图相关操作(如画点、画线、填充、变化、alpha通道等)。此项目主要运用的就是二维图形的绘制。

4.7项目中建立的类

1.Controlbox类

2.Drawwidget类

3.MainWindow类

4.8类之间的相互关系

Controlbox类:创建悬浮窗内的各个控件(线宽、画笔颜色、清空等等)

Drawwidget类:创建画板

MainWindow类:主窗口

1主窗口调用Controlbox类和Drawwidget类设定整个画图工具的外部框架。

2运用信号-槽机制关联Controlbox类和Drawwidget类中的函数以及MainWindow类和Controlbox类中的函数。

3事件机制的实现

                           结束语

   本课程设计到这里就结束了。该项目主要是制作一个关于图形图形的绘制的程序。从主函数、头文件、源文件各个方面进行了程序的编码,从刚开始的对QT creator的不太会运用到最后的熟悉掌握,中间花费了好长的时间,但是从结果上来看这样的付出是值得的,因为这让我更加熟练的掌握了对QT creator环境的应用,同时也让我对QT上其他的知识有了更加深刻的了解,尤其是对二维图形的绘制、信号与槽、布局管理等相应的知识,让我对课本上的知识掌握的更加透彻。但是通过这个实践还让我认识了自己的不足,有些自己没有掌握的知识平时没有做好温习,从而间接的导致了本次课程设计过程有了相应的难道,不过经过这次课程设计,我能对这些自己欠缺的知识进行相应的复习,直至最后掌握牢固,方便以后的使用。

在本次的课程设计项目的制作过程中,我学到了很多的知识,不仅仅是上述所说的课本上的问题,同时也是我能更好的与同学之间进行沟通、交流,因为在项目进行中有些知识是自己不会的,所以必须要通过和老师、同学之间进行交流才能够理解,所以在此我非常感谢那些在本次项目中对我有帮助的老师和同学,没有他们也就没有我本次项目制作的成品,再次感谢你们。

                          致  谢

    本课题在进行过程中得到李胜辉老师的悉心指导。课程设计的制作过程中,老师多次帮助我分析思路,开拓视角,在我遇到困难想放弃的时候给予我最大的支持和鼓励。老师严谨求实的治学态度,踏实坚韧的工作精神,将使我终生受益。再多华丽的言语也显苍白。在此,谨向老师致以诚挚的谢意和崇高的敬意。

感谢本学期老师对我学习上的帮助和生活上的关怀,正是您的辛勤工作,才使我得以顺利地完成该课程设计。同时也是在其他同学的努力帮助下,我才能更好的完成了这个课程设计,没有同学的配合,我一个人是无法完成这个庞大的工程的,在此再次由衷的感谢你们。是你们教会了什么是团结就是力量,教会了我课程设计应如何才能够做好,为我以后的毕业设计打好了基础,谢谢你们。

                   参考文献

1.基于嵌入式Linux的QT图形程序实战开发(北京航空航天大学出版社)

2. http://blog.163.com/sxs_solo/blog/static/2633338200841425039653/

3. http://wenku.baidu.com/link?url=tNZzirS2YFNVTGKIyGQzJY7goKT1Vve5HSZxSaY-ODGmzIXIHDAl2Bf1imVaYh_-7zpVoKym14eJ_PX2xKM4fECnmBwcxspV8azYVlMGNkC

4. http://blog.csdn.net/zhaotaobenny/article/details/6181244

相关推荐