QT拼图实验报告
- 格式:doc
- 大小:1.69 MB
- 文档页数:13
面向对象程序设计2实验报告专业:计算机科学与技术年级:2013级班级:工科1班学号:070613047姓名:黄剑波目录实验一:线程通信:门铃 (1)一、实验目的 (1)二、实验内容 (1)三、实验要求 (1)四、实验步骤 (1)五、实验源码 (2)main.cpp (2)doorbell。
h (2)doorbell.cpp (4)doorbell.qrc (7)六、实验结果与分析 (7)七、教师评价 (7)实验二:高阶多线程QtConcurrent的使用:ImageLoader (8)一、实验目的 (8)二、实验内容 (8)三、实验要求 (8)四、实验步骤 (8)五、实验源码 (9)main。
cpp (9)widget。
h (9)widget。
cpp (10)imageloader.qrc (11)六、实验结果与分析 (12)七、教师评价 (13)实验三:HTTP编程:httpTestTool (14)一、实验目的 (14)二、实验内容 (14)三、实验要求 (14)四、实验步骤 (14)五、实验源码 (15)main。
cpp (15)widget。
h (15)widget.cpp (17)六、实验结果与分析 (35)七、教师评价 (37)实验四:FTP:ftpTestTool (38)一、实验目的 (38)二、实验内容 (38)三、实验要求 (38)四、实验步骤 (38)五、实验源码 (39)main.cpp (39)widget.h (39)widget。
cpp (41)六、实验结果与分析 (48)七、教师评价 (48)实验五:TCP服务器:timeService (49)一、实验目的 (49)二、实验内容 (49)三、实验要求 (49)四、实验步骤 (49)五、实验源码 (50)main.cpp (50)timeService.h (50)timeService。
cpp (51)七、教师评价 (52)实验六:TCP:timeClient (53)一、实验目的 (53)二、实验内容 (53)三、实验要求 (53)四、实验步骤 (53)五、实验源码 (54)main.cpp (54)widget。
程序设计课程设计实验报告(qt实验报告)信息科学与技术学院软件三班高文博2010050703092011年5月实验1:计算当初存入本金的钱数。
(12题)1.实验目的、要求目的:1)熟悉qt中的常用属性;2)熟悉vbox hbox模型及怎样根据需求设计控件,边框等;3)熟悉各个槽函数的使用,准确的将c++语言转换成qt语言,将控件功能与函数结合起来。
要求:1)掌握对控件的文本色,背景色等常用属性的设置。
2)掌握对控件、边框尺寸与结构的设置3)掌握对函数的设置2.实验设备笔记本电脑,已安装Qt 开发环境。
3.实验内容、步骤●先在vc++上进行编译。
●应用qt3.38进行编译,运行。
实验步骤:1)根据题目需求在草纸上画出结构图;2)根据草图用代码设计整体框架和控件;3)在qt上运行;4)运行成功后根据功能添加函数;5)在头文件中添加头文件。
6)将添加的功能函数与功能控件相连;7)分别对每个函数进行测试;8)将整个程序在qt运行调试;9)运行通过后给每个函数写注释;实验代码如下所示A (1)主框架结构代码#include"gwbsave.h"GwbSave::GwbSave(QWidget*parent,const char*name):QWidget(parent,name) {//??vBox=new QVBoxLayout(this);vBox->setMargin(5);vBox->setSpacing(5);label=new QLabel("Please input the lilv:",this,"label");vBox->addWidget(label);//??hBox=new QHBoxLayout(this);hBox->setMargin(5);hBox->setSpacing(5);vBox->addLayout(hBox);le1=new QLineEdit(this,"le1");hBox->addWidget(le1);//?,??hBox2=new QHBoxLayout(this);hBox2->setMargin(5);hBox2->setSpacing(5);vBox->addLayout(hBox2);leResult=new QLineEdit(this,"leResult");leResult->setReadOnly(true);leResult->setPaletteBackgroundColor(Qt::gray);hBox->addWidget(leResult);//аgrid=new QGridLayout(this,1,5,5,10);vBox->addLayout(grid);btnResult=new QPushButton("Result",this,"btnResult");grid->addWidget(btnResult,0,2);btnClean=new QPushButton("Clean",this,"btnClean");grid->addWidget(btnClean,0,3);btnExit=new QPushButton("Exit",this,"btnExit");grid->addWidget(btnExit,0,4);connect(btnExit,SIGNAL(clicked()),this,SLOT(close())); // connect(btnClean,SIGNAL(clicked()),this,SLOT(slotClean())); //? connect(btnResult,SIGNAL(clicked()),this,SLOT(slotExit()));//}(2)主窗体结构视图B(1)添加函数后的全部代码a头文件//#ifndef GWBSAVE_H#define GWBSAVE_H#include<qwidget.h>#include<qlayout.h>#include<qlineedit.h>#include<qpushbutton.h>#include<qlabel.h>#include<qdatetime.h>//class GwbSave:public QWidget{Q_OBJECTpublic:GwbSave(QWidget*parent=0,const char*name=0);//构造函数。
用qt实现拼图课课程设计一、教学目标本课程的教学目标是使学生掌握Qt编程基础,能够实现一个简单的拼图游戏。
具体目标如下:1.了解Qt的基本概念和框架。
2.掌握Qt中的常用类和函数。
3.理解事件处理和图形界面编程的基本原理。
4.能够使用Qt Creator进行项目开发。
5.能够编写简单的Qt应用程序。
6.能够设计和实现一个简单的拼图游戏。
情感态度价值观目标:1.培养学生的编程兴趣,提高学生的自主学习能力。
2.培养学生解决问题的能力,使学生能够通过编程解决实际问题。
3.培养学生的团队合作意识,使学生在团队项目中能够发挥自己的作用。
二、教学内容根据课程目标,本课程的教学内容主要包括以下几个部分:1.Qt基本概念和框架:Qt简介、Qt模块、Qt类和函数等。
2.事件处理和图形界面编程:事件处理机制、图形界面设计、常用控件等。
3.拼图游戏设计:游戏规则、界面设计、逻辑实现等。
第1周:Qt基本概念和框架。
第2周:事件处理和图形界面编程。
第3周:拼图游戏设计。
三、教学方法本课程采用讲授法、案例分析法和实验法相结合的教学方法:1.讲授法:用于讲解Qt的基本概念、类和函数等。
2.案例分析法:通过分析典型的拼图游戏案例,使学生掌握游戏设计的方法。
3.实验法:学生动手实践,编写和调试自己的拼图游戏。
四、教学资源教学资源包括以下几个方面:1.教材:《Qt编程入门》。
2.参考书:《Qt实战:基于Qt 5的应用程序设计》。
3.多媒体资料:课件、视频教程等。
4.实验设备:计算机、网络等。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以保证评估的客观性和公正性。
1.平时表现:包括课堂参与度、团队合作表现等,占总评的30%。
2.作业:包括编程练习和课后作业,占总评的40%。
3.考试:包括期中和期末考试,占总评的30%。
4.平时表现:积极参与课堂讨论,主动参与团队合作。
5.作业:按时完成,代码规范,能够实现功能。
6.考试:答案正确,编程能力较强,能够解决问题。
qt图形课程设计一、课程目标知识目标:1. 学生能理解Qt图形库的基本概念,掌握其编程环境和使用方法。
2. 学生能描述Qt中常用的图形和图像类,并了解它们的功能和用途。
3. 学生能运用所学知识,创建简单的图形应用程序,实现基本的图形绘制和交互功能。
技能目标:1. 学生能够熟练使用Qt的绘图工具,如QPainter、QPen、QBrush等,进行基本图形的绘制。
2. 学生能够运用事件处理机制,实现图形界面的交互功能,如鼠标点击、键盘输入等。
3. 学生能够运用Qt的资源系统,加载和管理图像资源,提高应用程序的视觉效果。
情感态度价值观目标:1. 学生培养对图形编程的兴趣,激发创新意识和探索精神。
2. 学生通过团队协作,培养沟通能力和解决问题的能力。
3. 学生在学习过程中,认识到计算机图形学在现实生活中的应用和价值,增强实践意识。
课程性质:本课程为信息技术学科选修课程,以实践操作为主,注重培养学生的动手能力和实际应用能力。
学生特点:学生处于高年级阶段,已经具备一定的编程基础和逻辑思维能力,对图形编程有一定兴趣。
教学要求:结合学生特点和课程性质,采用任务驱动法,引导学生通过实践操作,掌握Qt图形编程的基本方法和技巧。
在教学过程中,注重分层教学,满足不同层次学生的学习需求。
同时,关注学生的情感态度价值观的培养,提高他们的综合素质。
通过本课程的学习,使学生能够具备Qt图形编程的基本能力,为后续相关课程的学习奠定基础。
二、教学内容1. Qt图形库概述- 了解Qt的发展历程、特点及应用领域- 掌握Qt的编程环境搭建和基本使用方法2. 基本图形绘制- 学习QPainter、QPen、QBrush等绘图工具的使用方法- 练习绘制基本图形(如矩形、椭圆、线条等)3. 图像显示与处理- 了解Qt中的图像类(如QImage、QPixmap等)- 学习图像的加载、显示、缩放和旋转等操作4. 事件处理与交互- 掌握事件处理机制,如鼠标事件、键盘事件等- 实现图形界面的交互功能,如拖拽、点击等5. 资源管理与使用- 学习Qt资源系统,如qrc文件的使用- 掌握图像资源的加载、管理和使用方法6. 综合应用案例- 分析并实现一个简单的图形应用程序,如画图板、迷宫游戏等- 结合所学知识,进行项目实践,提高综合运用能力教学内容安排和进度:第1周:Qt图形库概述及编程环境搭建第2周:基本图形绘制第3周:图像显示与处理第4周:事件处理与交互第5周:资源管理与使用第6周:综合应用案例教材章节关联:第1章:Qt图形库基础第2章:基本图形绘制第3章:图像显示与处理第4章:事件处理与交互第5章:资源管理与使用第6章:综合应用案例教学内容的选择和组织遵循科学性和系统性原则,以课程目标为依据,注重理论与实践相结合,使学生能够循序渐进地掌握Qt图形编程的相关知识和技能。
qt画图实验报告篇一:QT综合作业实验报告一、实验目的1,了解并掌握Qt集成开发环境下使用Qt Designer 开发图形界面程序的流程和相关操作;2,了解并掌握Qt的信号槽和信号传递机制,并通过具体应用加深理解;3,了解并掌握使Qt应用程序支持中文或国际化的方法,并在本次实验中使用; 4,了解并掌握QPainter的translate、shear等库函数的使用方法和Widget类的使用方法,并通过本次实验加深理解;5,掌握在Qt Designer界面上为菜单项添加工具栏按钮、创建相应槽函数的方法; 6,了解并掌握使用双缓冲机制绘图的方法。
二、实验环境操作系统:Windows 7应用软件:Qt Creator开发平台:qt-sdk-win-opensource-XX.04三、程序流程图:四、核心源代码mainwindow.cpp的内容(实现菜单项的功能和绘图功能的调用)#include "mainwindow.h"#include "ui_mainwindow.h"#include "donewdialog.h"#include#include#include#include "aboutdialog.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);setWindowTitle(tr("Qt绘图板"));setFixedSize(700,500); //主窗口大小设为700*500area = new PaintArea;scrollArea = new QScrollArea;scrollArea->setBackgroundRole(QPalette::Dark); //scrollArea对象的背景色设为Dark scrollArea->setWidget(area); //将画布添加到scrollArea中scrollArea->widget()->setMinimumSize(800,600); //scrollArea初始化大小设为800*600ui->dockWidget->hide();setCentralWidget(scrollArea); //将scrollArea加入到主窗口的中心区isSaved = false;curFile = tr("未命名.png");creatColorComboBox(ui->penColorComboBox); //画笔颜色组合框creatColorComboBox(ui->brushColorComboBox); //填充颜色组合框}MainWindow::~MainWindow(){delete ui;}void MainWindow::changeEvent(QEvent *e){QMainWindow::changeEvent(e);switch (e->type()) {case QEvent::LanguageChange:ui->retranslateUi(this);break;default:break;}void MainWindow::doOpen(){if (maybeSave()){QString fileName = QFileDialog::getOpenFileName(this,tr("打开文件"), QDir::currentPath());if (!fileName.isEmpty()){area->openImage(fileName);scrollArea->widget()->resize(area->getImageSize());//获得图片的大小,然后更改scrollArea的大小isSaved = true;curFile = fileName;}}void MainWindow::doNew(){if(maybeSave()){DoNewDialog dlg;if(dlg.exec() == QDialog::Accepted){int width = dlg.getWidth();int height = dlg.getHeight();area->setImageSize(width,height); scrollArea->widget()->resize(width,height); area->setImageColor(dlg.getBackColor()); isSaved = false;}}bool MainWindow::maybeSave(){if(area->isModified()){QMessageBox::StandardButton box;box = QMessageBox::warning(this,tr("保存文件"),tr("图片已经改变,是否保存?"), QMessageBox::Yes|QMessageBox::No|QMessageBox::Cance l);if(box == QMessageBox::Yes){return doFileSave();}else if(box == QMessageBox::Cancel){return false;}return true;}bool MainWindow::doFileSave(){if(isSaved){return saveFile(curFile);}else return doFileSaveAs();}bool MainWindow::saveFile(QString fileName) {if(area->saveImage(fileName,"png"))篇二:C++实验报告-QT PaintPad《面向对象程序设计与C++》实验报告报告创建时间:篇三:QT实验五QT绘图基础实验QT绘图基础实验(一)编程绘图实现显示时钟窗口使用定时器和QPAINTER类绘制时钟,包括使用刷子、画笔、定义坐标旋转、刻度定义、画线等函数,完成时钟实时显示。
嵌入式系统界面设计实验实验题目:基于Qt的图片表格转换学院: **学院专业:电子信息工程班级:学号:姓名:小组成员:编写日期: 2019.10目录1. 实验设计背景 (1)2. 实验设计目的 (1)3. 实验设计环境 (1)4. 实验系统需求分析 (1)4.1 系统调查 (1)4.2 用户需求 (2)4.3 可行性分析 (2)4.4 系统业务流程图 (3)5. 实验具体操作步骤及方法 (3)5.1 程序运行开始主界面 (3)5.2 用户修改界面 (4)5.3 最终生成表格 (4)6. 实验结果分析 (5)7. 实验效果图 (6)8. 实验设计具体任务分工 (6)9. 实验设计心得体会 (6)1.实验设计背景当今办公室中有不少的表格是基于图片的这给后期人员的校对处理带来了不少的麻烦,特别是列数较多行数较多的表格。
在将表通过人工的方法转换为Excel 表格时容易出现差错,表格行列错位、数据抄错等等问题。
长时间的工作还容易损害校对人员的健康。
2.实验设计目的1.将表格分解成小片,以便于人工填写2.尽可能的通过软件将图片数字转换为文字3.Excel表格导出3.实验设计环境Visual Studio CodePython 3.7Python包:Pytesseract、openpyxl、numpy、cv2Qt CreaterTesseract-OCR4.实验系统需求分析4.1系统调查在许多小公司的办公中,由于大多业务系统都是使用的通用的模板,没有对具体情形进行优化,以及以前未使用办公系统的历史遗留问题,在实际的办公中经常会出现大量图像表格,需要人为地输入到EXCEL表格中以用于后续公司的各项统计工作4.2用户需求将PNG、JPG、BMP等格式的图片表格转化为EXCEL 的数字表格方便后续的统计工作4.3可行性分析Python中中存在大量的用于图像处理的库opencv等可以方便地对图像表格进行处理分割成小块。
qt画图实验报告篇一:QT时钟实验报告实验报告书实验名称:qmainwindow程序设计专业班级:6学号:姓名:陈俊宇潘耀斌联系电话:指导老师:谭智实验时间:—计算机科学与工程学院计算机实验室(中心)1设计分析qmainwindow程序设计对qmainwindow类窗口进行分析,qmainwindow类是一个经常用到的类,为用户提供了一个主窗口程序,可包含一个菜单条,一个工具栏,一个状态条以及一个中央窗体,是许多应用程序的基础,,如文本编辑器,图片浏览器都是以qmainwindow为基础实现的。
本次程序设计,首先分析了一个基本的窗口程序的实现,只包含基本的菜单和工具栏,实现了基本的窗口功能,如打开、新建等。
2功能需求实现一个基本的窗口程序,包括一个菜单条,一个工具栏,中央可编辑窗体及状态栏。
实现的效果如图所示。
在编写文本编辑器等应用中,需要对文本进行排序,以列表的方式显示各段文本。
即实现文本的排序功能,并实现文本的对齐及撤销和恢复功能,如图所示。
在编辑框中任意输入几段文字,单击工具栏上的下拉列表框,选择排序方式,则光标所在的文本段以所选排序方式自动缩进排序显示,并且紧接着的文本段以同样的方式排列;工具栏中部的4个快捷按钮实现文本的对齐功能,分别为左对齐,右对齐、居中和两端对齐;工具栏右部的快捷按钮实现文本操作的前进/回退功能。
3程序源代码###include#include#include#include#include#include#include#includemainwindow::mainwindow(qwid get*parent):qmainwindow(parent),ui(newui::mainwindow){ui->setupui(this);issaved=fal se;curfile=tr(noname);ui->action_left->setcheckable(true);ui->action_righ t->setcheckable(true);ui->action_justift->setchecka ble(true);ui->action_center->setcheckable(true);/*w orkspace=newqworkspace;setcentralwidget(workspace); createmenu();qmainwindow*window1=newqmainwindow;qmainwindow*wind ow2=newqmainwindow;qmainwindow*window3=newqmainwind ow;window1->setwindowtitle(tr(windowi));window2->se twindowtitle(tr(windowii));window3->setwindowtitle(tr(windowiii));qtextedit*edit1=newqtextedit;qtexted it*edit2=newqtextedit;qtextedit*edit3=newqtextedit; edit1->settext(tr(window1));edit2->settext(tr(windo w2));edit3->settext(tr(window3));window1->setcentra lwidget(edit1);window2->setcentralwidget(edit2);win dow3->setcentralwidget(edit3);workspace->addwindow( window1);workspace->addwindow(window2);workspace->a ddwindow(window3);*/[root@localhostopt]#三、实验总结篇三:用qt实现桌面时钟设计.doc附件二【学生用】西北农林科技大学信息工程学院面向对象实习实习报告题学号姓名专业班级指导教师实践日期目:桌面时钟设计与实现目录一、综合训练目的与要求................................................. ............................合训练任务................................................. ........................................................................... .....1三、总体设计................................................. ........................................................................... .............2四、详细设计说明................................................. ........................................................................... .....4五、调试与测试................................................. .....................................5六、实习日志................................................. ........................................................................... .............9七、实习总结................................................. ........................................................................... .............9八、附录:核心代码清单................................................. ............................ (9)一、综合训练目的与要求正文这次面向对象实习实践活动是在c++面向对象程序设计之后进行的实践环节旨在加深对面向对象编程的设计思想(类的设计,抽象,封装,包含与继承,多态性,uml图)的理解,掌握使用c++编程的基本的技能,从而能通过小型的团队开发一些小软件的实现与设计,并能够解决一定的实际问题。
图像拼接一、实验原理及实验结果图像拼接就是将一系列针对同一场景的有重叠部分的图片拼接成整幅图像,使拼接后的图像最大程度地与原始场景接近,图像失真尽可能小。
基于SIFT算法则能够对图像旋转、尺度缩放、亮度变化保持不变性,对视角变化,仿射变换,噪声也能保持一定程度的稳定性。
本次实验运用SIFT匹配算法来提取图像的特征点,采用随机抽样一致性算法求解单应性矩阵并剔除错误的匹配对。
最后用加权平均融合法将两帧图像进行拼接。
具体过程为:首先选取具有重叠区域的两帧图像分别作为参考图像和待拼接图像,然后使用特征提取算法提取特征点,并计算特征点描述子,根据描述子的相似程度确定互相匹配的特征点对。
再根据特征点对计算出待拼接图像相对于参考图像的单应性矩阵,并运用该矩阵对待拼接图像进行变换,最后将两帧图像进行融合,得到拼接后的图像。
1.特征点检测与匹配特征点检测与匹配中的尺度空间理论的主要思想就是利用高斯核对原始图像进行尺度变换,获得图像多尺度下的尺度空间表示序列,再对这些序列就行尺度空间的特征提取。
二维的高斯核定义为:G(x,y,σ)=12πσ2e−(x2+y2)2σ2⁄对于二维图像I(x,y),在不同尺度σ下的尺度空间表示I(x,y,σ)可由图像I(x,y)与高斯核的卷积得到:L(x,y,σ)=G(x,y,σ)∗I(x,y)其中,*表示在x 和 y方向上的卷积,L表示尺度空间,(x,y)代表图像I上的点。
为了提高在尺度空间检测稳定特征点的效率,可以利用高斯差值方程同原图像进行卷积来求取尺度空间极值:D(x,y,σ)=(G(x,y,kσ)−G(x,y,σ))∗I(x,y)= L(x,y,kσ)−L(x,y,σ)其中k为常数,一般取k=√2。
SIFT算法将图像金字塔引入了尺度空间,首先采用不同尺度因子的高斯核对图像进行卷积以得到图像的不同尺度空间,将这一组图像作为金字塔图像的第一阶。
接着对其中的2倍尺度图像(相对于该阶第一幅图像的2倍尺度)以2倍像素距离进行下采样来得到金字塔图像第二阶的第一幅图像,对该图像采用不同尺度因子的高斯核进行卷积,以获得金字塔图像第二阶的一组图像。
拼图游戏实验报告一、实验目的1、通过实践加强对程序设计语言课程知识点的理解和掌握,培养对课程知识综合运用能力、实际分析问题能力及编程能力,养成良好的编程习惯。
2、通过实践进一步领会程序设计的特点和应用,提高运用C++ 以及面向对象知识解决实际问题的能力,初步掌握MFC变成的基本功能。
3、通过实践掌握用C++ 编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识;学会利用C++程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力,为后续的相关课程的学习打下基础。
二、小组分工为了发挥组内同学的各自特长,我们小组分工如下:1、苏嘉彬——前期进行系统需求分析,系统结构设计,完成拼图界面的设计工作,后期完成课程设计报告2、嵇鹏飞(组长)——完成主要程序的编写工作(图形分割、存储、拼图)3、依代吐力·艾尼——搜集资料,完成计时器的设计工作,软件接口的设计及测试三、程序设计思路1、初步方案讨论拼图游戏是同学们喜欢的益智游戏之一,带着浓厚的兴趣,我们选择拼图游戏设计作为我们小组本次MFC课程设计的课题。
在讨论中,有的同学希望用单文档(SDI)的形式完成本次设计,有的同学则偏向于用对话框(Dialogue)的形式,最终我们小组讨论决定最终的设计采用对话框形式实现拼图功能。
2、方案变更、疑难解决(1)最初我们决定采用对话框形式来实现拼图的基本功能,但是在实施过程中出现了几次很严重的错误:Debug Assertion Failed,缺少ivewers.dll文件等等,在最后的尝试中我们发现如果采用单文档(SDI)形式写拼图的话,可以实现最基本的功能,因此我们最终决定使用单文档来完成该课程设计。
(2)一开始我们讨论决定采用的方式是将位图读入后再进行图片的分割,而在实际的操作过程中由于图片的分割有一定的困难,因此我们最后采用的方式是将位图进行分割完毕后再逐个用Brush在指定位置上进行绘画,实现图形的分割。
qt画图实验报告篇一:QT综合作业实验报告一、实验目的1,了解并掌握Qt集成开发环境下使用Qt Designer 开发图形界面程序的流程和相关操作;2,了解并掌握Qt的信号槽和信号传递机制,并通过具体应用加深理解;3,了解并掌握使Qt应用程序支持中文或国际化的方法,并在本次实验中使用; 4,了解并掌握QPainter的translate、shear等库函数的使用方法和Widget类的使用方法,并通过本次实验加深理解;5,掌握在Qt Designer界面上为菜单项添加工具栏按钮、创建相应槽函数的方法; 6,了解并掌握使用双缓冲机制绘图的方法。
二、实验环境操作系统:Windows 7应用软件:Qt Creator开发平台:qt-sdk-win-opensource-XX.04三、程序流程图:四、核心源代码mainwindow.cpp的内容(实现菜单项的功能和绘图功能的调用)#include "mainwindow.h"#include "ui_mainwindow.h"#include "donewdialog.h"#include#include#include#include "aboutdialog.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);setWindowTitle(tr("Qt绘图板"));setFixedSize(700,500); //主窗口大小设为700*500area = new PaintArea;scrollArea = new QScrollArea;scrollArea->setBackgroundRole(QPalette::Dark); //scrollArea对象的背景色设为DarkscrollArea->setWidget(area); //将画布添加到scrollArea中scrollArea->widget()->setMinimumSize(800,600); //scrollArea初始化大小设为800*600ui->dockWidget->hide();setCentralWidget(scrollArea); //将scrollArea加入到主窗口的中心区isSaved = false;curFile = tr("未命名.png");creatColorComboBox(ui->penColorComboBox); //画笔颜色组合框creatColorComboBox(ui->brushColorComboBox); //填充颜色组合框}MainWindow::~MainWindow(){delete ui;}void MainWindow::changeEvent(QEvent *e){QMainWindow::changeEvent(e);switch (e->type()) {case QEvent::LanguageChange:ui->retranslateUi(this);break;default:break;}}void MainWindow::doOpen(){if (maybeSave()){QString fileName = QFileDialog::getOpenFileName(this,tr("打开文件"), QDir::currentPath());if (!fileName.isEmpty()){area->openImage(fileName);scrollArea->widget()->resize(area->getImageSize());//获得图片的大小,然后更改scrollArea的大小isSaved = true;curFile = fileName;}}}void MainWindow::doNew(){if(maybeSave()){DoNewDialog dlg;if(dlg.exec() == QDialog::Accepted){int width = dlg.getWidth();int height = dlg.getHeight();area->setImageSize(width,height); scrollArea->widget()->resize(width,height); area->setImageColor(dlg.getBackColor()); isSaved = false;}}}bool MainWindow::maybeSave(){if(area->isModified()){QMessageBox::StandardButton box;box = QMessageBox::warning(this,tr("保存文件"),tr("图片已经改变,是否保存?"), QMessageBox::Yes|QMessageBox::No|QMessageBox::Cance l);if(box == QMessageBox::Yes){return doFileSave();}else if(box == QMessageBox::Cancel){return false;}}return true;}bool MainWindow::doFileSave(){if(isSaved){return saveFile(curFile);}else return doFileSaveAs();}bool MainWindow::saveFile(QString fileName){if(area->saveImage(fileName,"png"))篇二:C++实验报告-QT PaintPad《面向对象程序设计与C++》实验报告报告创建时间:篇三:QT实验五QT绘图基础实验QT绘图基础实验(一)编程绘图实现显示时钟窗口使用定时器和QPAINTER类绘制时钟,包括使用刷子、画笔、定义坐标旋转、刻度定义、画线等函数,完成时钟实时显示。
拼图游戏1. 文档介绍本文档主要介绍了一个简单的拼图游戏的开发过程2. 系统概述就是一个简单的拼图游戏,将一幅图片随机打散,然后拼出原图,很简单,也没有加入时间限制,只是一个拼图游戏的核心。
3. 设计约束本软件是用Qt开发出来的,Qt一个c++的gui类库,可以跨多种操作系统平台。
除了Qt库,还用到的就是标准的c程序库,各个系统中的开发环境也都有。
基于这两点,所以我开发出来的拼图游戏可以跨平台移植而不用修改代码,直接在目标平台上再重新编译一下就行了。
另外,我开发的只是一个拼图游戏的核心。
有很强的可扩展性,可以根据不同的需要而加入代码进行定制。
拼图中用到的图像分割和随机打散算法都是比较高效的。
鼠标点击图像块进行图像的交换,非常易用,对用户来说,非常清晰。
4. 开发与运行环境●操作系统:Windows7 32位旗舰版Service Pack 1●处理器:Pentium(R)*************************.8GHz●安装内存(RAM): 2.00GB●编译器:minGW移植到windows下的gcc编译器●调试器:minGW移植到windows下的gdb调试器●Make:minGW中的mingw32-make●Qt C++ GUI库●软件开发成功后拿到windowx xp和其他windows 7下运行毫无问题。
5. 软件的总体结构图图1 程序总流程图5.1 随机打散图片图2 随机打散图片5.2 拼图流程图3 拼图流程6. 功能模块设计对于一个拼图游戏的核心来说,主要的模块就是图片的随机打散模块和拼图模块。
我将屏幕窗口分成9块,如下图所示:图4 屏幕窗口6.1 图像随机分割我们将图像也分成和屏幕窗口一样的9块,如下图所示:图5 图像分割在Qt中,视口是物理坐标系下指定的任意矩形,窗口指的是同一矩形,只不过是逻辑坐标系下的。
我们先将视口设置成屏幕上的一块,然后窗口设置成一块大小和一块图像的大小一样的矩形,我们将一块图像绘制到窗口中,经过窗口-视口变换后就绘制到了视口所对应的屏幕上。
为了实现图像的随机打散,使用一个全局的映射数组map[3][3],map数组中存放的数字只能是0~8之间的数(包括0和8)。
map[0][0]对应屏幕的0块,map[0][1]对应屏幕的1块,依次类推,map[3][3]对应屏幕的8块。
如果map[0][0]里面存放的数是8,那么我们就将图像的第8块绘制到屏幕的第0块。
如果map数组中的数字是随机打乱的,那么我们通过这个映射数组将图像绘制到屏幕上后,屏幕上将会是打乱的图像。
为了方便代码的重用,我们将map数组的随机打乱编写到一个函数random()中,这样游戏再玩一次的时候就可以直接再调用一次这个函数重新打散一次映射数组就可以了。
map数组在初始化的时候,我们给map[0][0]~map[3][3]依次放进去0~8,然后再调用一次random()函数后将图像绘制到屏幕上去生成最初的打乱的图像。
random()函数的算法是这样的,首先产生两个随机数,然后再将这两个随机数对9求余的到两个9以内(即0~8且包括0和8)的随机数randData1和randData2,然后对map[randData1/3][randData1%3]和map[randData2/3][randData2%3]进行交换。
通过循环将这样的交换多进行几轮,然后就得到了一个随机打算的映射数组map。
代码:6.2 拼图我这个拼图游戏主要是用鼠标单击横纵相邻的两个块实现交换最后使打散的图像还原来完成拼图。
首先获得鼠标点击的位置,判断鼠标点击的位置是否在拼图区,如果不在拼图区,将描述选中块的一个数据结构selected置成没有选中任何块,然后刷新就完了;如果在拼图区,那么接下来就进行下面的程序。
计算鼠标选中那一块,通过selected数据结构判断之前是否已经有选中块了,如果之前没有选中块,那么置selected数据结构中选中块为现在选中的块,然后刷新;如果之前有选中的块,那么就判断之前选中的块和现在选中的块是否是横纵相邻的,如果不是横纵相邻的,那么就重置selected数据结构中选中块为现在选中的块,然后刷新;如果之前选中的块和现在选中的块是横纵相邻的,那么就交换两个选中的块,然后刷新。
我将判断游戏是否成功也放在了这个函数中,但是在模块的划分中,这是单独的一块,只是实现时为了实现方便将两个模块结合到了单独的一个函数中。
6.3 模块命名规则整个游戏我用一个类PintuWindow进行描述。
这个类继承自QMainWindow,其头文件为pintuwindow.h,实现文件为pintuwindow.cpp。
在PintuWindow类中,自定义了一个信号void success(),然后两个私有槽void random()和void succeed()。
在Pintu类的构造函数中,我将success()信号连接到槽succeed()以便在发射success()信号的时候可以自动执行secceed()槽。
那么在每次两个图块交换后我就判断游戏是否成功,如果成功,就会发射success()信号。
random()实现图块的随机打算,secceed()实现游戏成功的处理。
重新实现了两个虚函数void paintEvent(QPaintEvent *event)和void mousePressEvent(QMouseEvent *event)以实现绘图和鼠标操作。
然后是一个描述映射的数组int map[3][3],一个描述选中的情况的结构体struct pair selected和一个指向成功时弹出的那个对话框的指针SuccessDialog *successDialog等私有成员。
SuccessDialog类是在游戏成功时显示的一个对话框,继承自QDialog,其头文件是sucessdialog.h,实现文件时successdialog.cpp。
在这个类中自定义了两个信号void replay()和void exit()。
重新实现了void paintEvent(QPaintEvent *event)用以在对话框中插入一张图片。
然后就是一个QLabel *succ指向显示祝贺语的QLable,一个指向QPushButton重玩按钮的QPushButton *buttonReplay和一个指向QPushButton推出按钮的QPushButton *buttonExit。
当用户单击重玩按钮时就会先发射replay()信号,然后执行关闭这个对话框的槽。
Replay 信号在void PintuWindow::succeed()函数中是连接到了类PintuWindow的random()槽。
所以当我们单击rePlay按钮的时候会关闭对话框,重新随机打散图像,重新进行拼图游戏。
当用户单击exit按钮时就是发射exit信号,然后执行关闭这个对话框的槽。
exit()信号在void PintuWindow::succeed()函数中是连接到了类PintuWindow的close()槽,类PintuWindow的close()槽会关闭整个拼图游戏程序的窗口,然后结束拼图游戏。
7. 用户界面设计概述界面非常简单,一个窗口分成了两个区域,一个拼图区,一个原图区。
原图区显示原图,用以作拼图时的参照,拼图区实现拼图。
界面快照如下:图6 界面快照拼图成功时,会弹出一个对话框提示,成功时界面快照如下:图7 成功界面快照8. 综合考虑8.1 稳定性现在做出来的只是一个拼图游戏的核心部分,这些代码经过许多测试和修改稳定性也比较强了。
开始时鼠标单击会选中拼图区之外的图块,经过修改后鼠标不会选中拼图区之外的任何部分,map映射数组和selected结构在使用前都需要经过测试保证其正确,然后才使用的。
保证map数组不会出现越界错误,map数组和selected结构不会存入不正确的数据。
这些都是经过测试通过了的。
鼠标单击图块边缘时选中的图块也是经过精确的计算的到,不会出现单击图块边缘时明明是单击的这个图块,却由于计算偏差选中了另一个图块。
这些精确的计算也都是通过了软件的精确性测试通过了的。
8.2 可扩展性这个软件相当于一个拼图游戏的内核,可以围绕着这个内核进行许多的扩展,做成符合不同要求的拼图游戏。
例如,在这个游戏中加进一个定时器,将拼图的时间设置为一个与重玩次数相关的算法生成的时间或者设置成有用户自定义的形式。
当定时器的时间用完的时候如果用户还没有完成拼图,那么就游戏失败。
这个扩展时很容易实现的,而且游戏的图片随机打散算法和拼图算法以及拼图区和原图区的绘图等核心部分也不会改变。
还例如,还可以扩展成让用户自己选择一副自己喜欢的图片进行拼图。
那么这个时候需要一个动态加载用户图片的模块。
另外,就是需要将QImage对象(QImage对象是表示拼图游戏使用的图片的一个类)从paintEvent(QPaintEvent *event)函数的局部数据区移动到PintuWindow的全局数据区成为类PintuWindow的一个私有成员。
这个动态加载图片的模块就用以更新QImage对象中使用的图片。
这种情况下,游戏的图片随机打散算法和拼图算法都不会改变。
由于用户选择的图片的像素不同,拼图区和原图区的绘图只需要稍稍修改一个计算就可以了。
8.3 复用和移植本游戏使用了Qt这个C++的gui类库,Qt这个类库是一个跨多种操作系统平台的类库,所以基于Qt的应用程序有很好的平台可移植性。
另外就是使用了标准C函数库,除此之外,再没有用到别的库了,所以我的这个拼图游戏可以完全在Qt所支持的操作系统平台之间进行移植而不用修改源代码。
只需要拿到Qt所支持的平台上重新编译一次就可以了。
我的这个拼图游戏的图片随机打散算法和拼图算法的代码都是可以在别的拼图游戏中重用的。
界面的设计完全和功能代码的设计分开,界面的设计完全放倒了paintEvent(QPaintEvent *evnet)函数中,这样整个程序就比较清晰明了。
9 其他此程序的源代码见此文档父目录下的pintu目录。
参考文献:Qt官方文档《C++ GUI Qt4编程》(第2版)[加拿大]Jasmin Blanchette [英]Mark Summerfield。