09计科A23430110陈南博实训三.docx
- 文档编号:8175295
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:14
- 大小:298.88KB
09计科A23430110陈南博实训三.docx
《09计科A23430110陈南博实训三.docx》由会员分享,可在线阅读,更多相关《09计科A23430110陈南博实训三.docx(14页珍藏版)》请在冰豆网上搜索。
09计科A23430110陈南博实训三
上海第二工业大学计算机科学与技术系
学生实训报告
课程名称
嵌入式操作系统课程设计
实训类别
验证型
实训项目名称
创建对话框
班级
09计科A2
姓名
陈南博
学号
20113430110
实训时间
2012年11月7日
实训地点
15号楼507
指导教师
崔莉莉
组号
同组学生信息(请填写在下方)
班级
姓名
学号
一、实训内容、结果与分析
1.完成书本第五部分“创建自定义窗口部件”中的两个例题hexspinbox和iconeditor;
a.hexspinbox运行结果:
Hexspinbox.h:
#ifndefHEXSPINBOX_H
#defineHEXSPINBOX_H
#include
classHexSpinBox:
publicQspinBoxhexspinbox继承qspinbox
{
public:
HexSpinBox(QWidget*parent,constchar*name=0);
protected:
QStringmapValueToText(intvalue);在这里和下面一样构造了2个虚函数
intmapTextToValue(bool*ok);
};
#endif
Hexspinbox.cpp:
#include
#include
#include"hexspinbox.h"
HexSpinBox:
:
HexSpinBox(QWidget*parent,constchar*name):
QSpinBox(parent,name)
{
QRegExpregExp("[0-9A-Fa-f]+");设置一个0-9A-F的范围的数字
setValidator(newQRegExpValidator(regExp,this));为了实现这些数字我们使用一个QregExpValidator
setRange(0,255);设置一个0-255的范围0x00-0xff
QMessageBox:
:
about(this,tr("AboutChen_NanBo'SHexSpinBox"),为了显示是自己做的在HexspinBox显示前先显示一个Messagebox
tr("
C_N_B_de_shiyan_3!
!
!
"
"
Xue_Hao_20113430110."
));
}
QStringHexSpinBox:
:
mapValueToText(intvalue)虚函数mapValueToText
{
returnQString:
:
number(value,16).upper();把箭头上下微调编辑器部分,并以16进止,而且转化为大写
}
intHexSpinBox:
:
mapTextToValue(bool*ok)
{
returntext().toInt(ok,16);实现字符串到整数值的逆转
}
b.Iconeditor运行结果:
.h文件:
#ifndefICONEDITOR_H
#defineICONEDITOR_H
#include
#include
classIconEditor:
publicQWidget
{
Q_OBJECT
Q_PROPERTY(QColorpenColorREADpenColorWRITEsetPenColor)
Q_PROPERTY(QImageiconImageREADiconImageWRITEsetIconImage)
Q_PROPERTY(intzoomFactorREADzoomFactorWRITEsetZoomFactor)
Q_PRORERTY宏声明了三个自定义属性,每一个属性都有一个读和一个写函数,
public:
IconEditor(QWidget*parent=0,constchar*name=0);
voidsetPenColor(constQColor&newColor);
QColorpenColor()const{returncurColor;}
voidsetZoomFactor(intnewZoom);
intzoomFactor()const{returnzoom;}
voidsetIconImage(constQImage&newImage);
constQImage&iconImage()const{returnimage;}
QSizesizeHint()const;
定义了一个刚才定义三个属性的参数,
protected:
voidmousePressEvent(QMouseEvent*event);
voidmouseMoveEvent(QMouseEvent*event);
voidpaintEvent(QPaintEvent*event);
定义了三个保护函数,其实就是相对应的几个事件
private:
voiddrawImagePixel(QPainter*painter,inti,intj);
voidsetImagePixel(constQPoint&pos,boolopaque);
QColorcurColor;
QImageimage;
intzoom;
};
#endif
.cpp文件的一些主要代码:
IconEditor:
:
IconEditor(QWidget*parent,constchar*name)
:
QWidget(parent,name,WStaticContents)
{
setSizePolicy(QSizePolicy:
:
Minimum,QSizePolicy:
:
Minimum);
curColor=black;设置画笔颜色为黑色
zoom=8;缩放因子设置为8,每一个像素呈现一个8*8的正方形
image.create(16,16,32);用一个16*16像素和32位色初始化它
image.fill(qRgba(0,0,0,0));透明色填充Qimage
image.setAlphaBuffer(true);使缓冲区模式如果使是真实的,否则,禁用它。
默认设置是禁用的
}
QSizeIconEditor:
:
sizeHint()constsizehit中重新返回一个窗口部件理想大小
{
QSizesize=zoom*image.size();
if(zoom>=3)如果缩放影子为三或者更大
size+=QSize(1,1);在每一个方向上位网络再加一个像素作为网络
returnsize;
}
voidIconEditor:
:
setPenColor(constQColor&newColor)
{
curColor=newColor;设置当前画笔颜色
}
voidIconEditor:
:
setIconImage(constQImage&newImage)
{
if(newImage!
=image){
image=newImage.convertDepth(32);这段代码用于更新当前改变过之后的image
image.detach();
update();
updateGeometry();
}
}
下面这段代码用于重新画图之后的图像缩放因子过小(小于1)所以用着断代码重新绘制zoom布局
voidIconEditor:
:
setZoomFactor(intnewZoom)
{
if(newZoom<1)
newZoom=1;
if(newZoom!
=zoom){
zoom=newZoom;
update();
updateGeometry();
}
}
voidIconEditor:
:
paintEvent(QPaintEvent*)
{
QPainterpainter(this);此段代码用于绘制网络当像素>3
if(zoom>=3){……}
voidIconEditor:
:
drawImagePixel(QPainter*painter,inti,intj)
{
QColorcolor;绘制网络后就需要把网络填充画
QRgbrgb=image.pixel(i,j);……}
voidIconEditor:
:
mousePressEvent(QMouseEvent*event)鼠标按下事件
{
if(event->button()==LeftButton)左键按下
setImagePixel(event->pos(),true);使用当前画笔设置这个像素,是调用setImagePixel完成的
elseif(event->button()==RightButton)右键按下
setImagePixel(event->pos(),false);清空像素,是调用setImagePixel完成的
}
voidIconEditor:
:
mouseMoveEvent(QMouseEvent*event)鼠标移动事件
{
if(event->state()&LeftButton)
setImagePixel(event->pos(),true);实现过程大致与“鼠标按下”事件相同
elseif(event->state()&RightButton)
setImagePixel(event->pos(),false);
}
voidIconEditor:
:
setImagePixel(constQPoint&pos,boolopaque)setImagePixel函数是被调用来设置和清空一个像素的
{
inti=pos.x()/zoom;POS是鼠标在窗口中的位置,这2行代码是吧鼠标在窗口的位置
intj=pos.y()/zoom;转换成为图像位置
if(image.rect().contains(i,j)){
if(opaque)
image.setPixel(i,j,penColor().rgb());设置像素颜色为pencolor
else
image.setPixel(i,j,qRgba(0,0,0,0));设置像素颜色为透明
QPainterpainter(this);
drawImagePixel(&painter,i,j);
}
}
2.编写程序ch_501,实现程序界面如下:
下方文本框可以输入内容(保存类型为AllFiles(*.*)),所有菜单及工具按钮均可实现功能。
File菜单如下:
Help菜单如下:
About菜单为:
AboutQt菜单为:
实现结果:
实验过程:
1.QTFILE|NEW|MainWindow创建一个窗体。
2.初始化配置菜单及工具栏
完成之后next->finish.
3.手动配置菜单栏如下所示:
4.在centralwidget画一个TEXTEDIT
并且设置部分属性如下;
5.选择QT右上方的ObjectExplorer下的members
可以设置每个
action.
如果新建的菜单栏,可以选中新建的那个,然后在右下角
新建一个activated()名字自选。
不用自己用代码连接信号与槽,因为QT自动生成。
6.双击每个action,会跳出ch501.ui.h设置每个action的函数,函数基本与上一章相似,具体action可以参考上一章报告,就举几个例子:
voidMainWindow:
:
fileNew()
{
MainWindow*mainWin=newMainWindow;这样写newfile为了显示多文档
mainWin->show();
}
boolMainWindow:
:
fileSaveAs()
{
QStringfileName=
QFileDialog:
:
getSaveFileName(curFile,"*.*",this);”*.*”是为了设置allfile,符合题意
if(fileName.isEmpty())
if(QFile:
:
exists(fileName)){
intret=QMessageBox:
:
warning(this,tr("Editor"),
tr("File%1alreadyexists.\n"
"Doyouwanttooverwriteit?
")
.arg(QDir:
:
convertSeparators(fileName)),
QMessageBox:
:
Yes|QMessageBox:
:
Default,
QMessageBox:
:
No|QMessageBox:
:
Escape);
if(ret==QMessageBox:
:
No)
returntrue;
}
if(!
fileName.isEmpty())
fileSave(curFile);
}
voidMainWindow:
:
helpAbout()
{
QMessageBox:
:
information(this,tr("QtApplicationExample"),
tr("ThisexampledemonstratessimpleuseofQMainWindow,\n"
"QMenuBarandQToolBar"
));
}
voidMainWindow:
:
activated()
{
QMessageBox:
:
aboutQt(this,"QtApplicationExample");
}
voidMainWindow:
:
setCurrentFile(constQString&fileName)
{
curFile=fileName;
if(curFile.isEmpty()){
setCaption(tr("QtExample"));
}else{
setCaption(tr("%1-%2").arg(strippedName(curFile))
.arg(tr("QtExample")));
}
}
这样就完成了整个ch501.
实验内容是代码和图片,实验分析是红色字体,实验结果是截图。
二、实训心得与体会
遇见的遗留困难:
因为不是想spreadsheet那次实验那样。
先创建一个表后插到mainwindow中,上次有实例,而且书上有相应的例子,所以这次设置视图界面,action,都非常有难度,而且实验时间短了一周,所以遗留难题非常多.
1.某些按钮功能无效。
主要spreadsheet那次实验的action定义方法与这次所在地方不同所以许多函数和头文件会重复调用以及错误调用。
导致save和load虽然有图形界面和相对应的对话框,但是不会真正保存或者读取。
2.edit框不是单独创建而是创建在mainwindow内,所以框架设置与上次不同.
这次edit初始化如下:
textEdit6=newQTextEdit(centralWidget(),"textEdit6");
textEdit6->setGeometry(QRect(0,0,32767,32767));
textEdit6->setSizePolicy(QSizePolicy((QSizePolicy:
:
SizeType)4,(QSizePolicy:
:
SizeType)4,255,255,textEdit6->sizePolicy().hasHeightForWidth()));
而上次设置表格
spreadsheet=newSpreadsheet(this);
setCentralWidget(spreadsheet);
就实现了填充满客户区。
如果这次用这种方法写,工具栏就会显示异常,而且不显示文本文档。
3.在ui.h内引用类似于上次实验的mainwindow.cpp和.h的所有头文件,想偷懒做东西,但是一直提示栈溢出等提示,让我用/Zm修改栈。
但是网上查了很久没一个确切说出dos下修改zoom的方法。
心得体会:
本次实验第一题,基本是照书做,用QTdesigner也能快速完成,只需要设置几项属性就可以了。
主要熟悉了一下子类化QWidget,特别是QImage我印象非常深,位图并非单纯的显示,它需要先设置像素,绘制表格,绘制表格的点。
还要实现一些鼠标动作。
本次实验的第二题时间仓促,虽然实现了大部分功能,但是有些不太完善。
因为这次的实验是第一次从头开始就是用QTdesign,图形设计过程非常快,省略了信号与槽的设计,而用QT自动生成,但是action在哪里编写我找了很久,ui.h的头文件也让我纠结了很久,Action这次编写的不完美是我最大遗憾,需要多编写几次磨练自己。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 09 A23430110 陈南博实训三