Qt技术文档
- 格式:doc
- 大小:102.50 KB
- 文档页数:5
QT基础学习知识整理1.重要内容:1)信号和槽机制2)事件处理机制3)布局管理器4)绘图5)网络6)多线程7)其他(定时器,中文显示)2.1 一个简单的例子不可免俗的,从最简单的基本窗口产生开始介绍,窗口标题就叫作First Qt!!好了,请新增一个目录hello,并在当中使用任一编辑器来编辑一个hello.cpp的档案,内容如下:hello。
cpp#include 〈QApplication>#include 〈QLabel〉int main(int argc,char *argv[]) {QApplication app(argc, argv);QLabel *label = new QLabel(”Hello!World! Orz。
”);label—〉setWindowTitle(”First Qt!”);label—>resize(200, 50);label—〉show();return app。
exec();}要使用Qt的组件,必须含入(include)相对应的头文件,程序的第一行包含的QApplication与Qlabel头文件,稍后才可以使用QApplication与QLabel两个组件的定义类别.每个Qt窗口程序,都必须有且只能有一个QApplication对象,它管理了整个应用程序所需的资源,QLabel 是Qt的图型组件之一,继承自QWidget,Widget这个名称来自Window Gadget,表示可视的使用者接口组件,可接受使用者的动作操作,文字画面、按钮、滚动条、工具列甚至容器(Container)等都是一种Widget.C++程序从main开始,再来进行Qt组件的初始化动作,在第一行中:QApplication app(argc, argv);QApplication负责程序的初始、结束及处理事件(event)的循环等,并提供基本的窗口外观,这个外观与系统的桌面环境有关,例如标题列的样式、窗口外观、系统功能键等,在不同的操作系统桌面环境下,会有各自不同的外观,QApplication 对象接受命令列自变量作为它的自变量,像是如果您没有设定窗口标题,且会使用执行文件的名称作为窗口标题名称,可以使用的自变量与其作用,可以查询Qt在线文件关于QApplication类别的说明。
虚函数: 虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。
以实现统一的接口,不同定义过程。
如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数析构函数:析构函数与构造函数相反,当对象脱离其作用域时,例如对象所在的函数已调用完毕,系统自动执行析构函数。
析构函数往往用来做“清理善后”的工作。
回调函数:回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
内联函数:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。
编译时,类似宏替换,使用函数体替换调用处的函数名。
一般在代码中用inline修饰,但是否能形成内联函数,需要看编译器对该函数定义的具体处理。
构造函数:构造函数是一种特殊的方法主要用来在创建对象时初始化对象即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中特别的一个类可以有多个构造函数可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载信号与插槽:信号与插槽可以理解成把一些事件的响应连接到相应的处理函数。
分别由信号函数与槽函数表示。
公有函数:有关键字public声明的函数称为公有函数,公有函数能被类外其他函数访问私有函数:由关键字private生命的函数称为私有函数,私有函数只能被类内函数访问,不能被类外函数访问类:类是对现实世界客观事物的抽象,是用户自己指定的新类型,类定义包含两部分,数据成员和成员函数,数据成员说明类的属性,成员函数是对数据成员的操作。
江苏龙芯梦兰科技股份有限公司Qt入门开发资料修订记录项次修订日期版本修订內容修订者审核1 2009-05-11 0.1 初版发行吴少文唐科目录一、Qt概述 (3)1.1 什么是Qt (3)1.2 Qt的优势 (4)1.3 Qt 4.6版本 (5)二、Qt常用工具和模块 (6)2.1 Qt Library (6)2.2 Qt Designer (6)2.3 Qt Linguist (6)2.4 Qt Assistant (7)2.5 Qt Module (7)2.6 Qt Creator (8)2.7 Qt-embedded和Qtopia (8)三、Qt安装 (9)3.1 动态编译Qt (9)3.1.1 apt-get安装 (9)3.1.2 源码编译安装 (9)3.2 静态编译Qt (10)四、Qt实例 (10)4.1第一个Qt工程 (10)4.2 其他Qt实例参考 (13)五、Qt 的资源 (15)一、Qt概述1.1 什么是QtQt是一个跨平台的C++图形用户界面应用程序框架。
它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。
Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。
自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。
Qt也是流行的Linux桌面环境KDE 的基础,KDE是所有主要的Linux发行版的一个标准组件。
Qt支持下述平台:MS/Windows - 95、98、NT 4.0、ME、2000、XP 和VistaUnix/X11 - Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX和其它很多X11平台Macintosh - Mac OS XEmbedded - 有帧缓冲(framebuffer)支持的Linux平台,Windows CE。
Symbian/S60 - 目前已经可以提供技术预览版本。
目录第一章 LINUX图形用户界面GUI介绍 (2)1.1常用GUI介绍 (2)1.2关于Q T (3)1.3Q T/E MBEDDED简介 (4)第二章 QT的安装 (5)2.1设置环境变量 (6)2.2使用脚本ARM-BUILD 编译Q T (7)第三章 QT的编程 (7)3.1Q T/E MBEDDED 开发一个嵌入式应用的过程 (7)3.2“HELLO”Q T的初探 (7)3.2.1 建立工程文件 (7)3.2.2 产生源代码 (12)3.2.3 添加main.cpp文件 (13)3.2.4修改hello.pro文件 (13)3.2.5 生成 MakeFile 文件 (14)3.2.6 修改 hello.cpp 文件 (15)3.3将HELLO 移植到JXARM9-2410实验箱上 (19)3.3.1 重新生成修改 Makefile (19)3.3.2 制作启动器 (22)3.3.3 重新生成cramfs文件 (23)3.3.4 烧写重新生成的cramfs文件到JXARM9-2410实验箱 (23)第一章 Linux图形用户界面GUI介绍所谓GUI(Graphics User Interface)就是图形用户界面。
图形用户界面的广泛流行时当今计算机技术的重大成就之一,它极大的方便了非专业用户的使用,人们不需要死记硬背大量的命令,而可以通过窗口,菜单方便的操作。
随着手持式设备的硬件条件的提高,嵌入式系统对轻量级GUI的需求越来越迫切。
近来的市场需求显示,越来越多的嵌入式系统,包括PDA、机顶盒、DVD/VCD 播放机、WAP 手机等等系统均要求提供全功能的Web浏览器。
这包括HTML 4.0的支持、JavaScript的支持,甚至包括Java虚拟机的支持。
而这一切均要求有一个高性能、高可靠的GUI的支持。
另外,在工业实时控制系统中对GUI的要求也越来越高。
目前许多这类系统采用比较简单的手法实现GUI。
1.设计目的Student Management System是为了方便学生信息的管理,本系统对于学生信息的增删查改十分方便,本系统也比较方便查看学生的详细信息,可以大大减少教师或学生的工作量。
2.设计内容本系统可以对学生信息进行增删查改。
⑴在添加学生信息时,先可以看到原有的学生信息,而后输入要添加的学生的信息,点击添加按钮,添加成功后可以看到新添加的学生信息。
⑵在删除学生信息时,先可以看到原有的学生信息,而后输入需删除的学生信息的学号,点击删除按钮,就可以在显示信息框中看到该学生的信息已被删除。
⑶在查找学生信息时,在查找框中输入需查找学生信息的学号,若所输学号是有效的,点击查找就可以看到这个学生的全部信息。
⑷在修改学生信息时,先输入需修改学生信息的学号,再输入这个学生的新信息,点击修改,就可以在显示框中看到修改后的信息。
3.需求描述图1 用例图4.系统详细设计4.1顺序图图2 学生信息添加的顺序图图3 学生信息删除的顺序图图4 学生信息查找的顺序图图5 学生信息修改的顺序图4.2活动图图6 活动图4.3构件图图7 构件图4.4文件内容图8 文件内容5.系统实现5.1 运行环境运行环境:Linux5.2 系统实现图9 主页面图10 功能菜单页面核心代码:f2=new Form2(this); f2->close();f3=new Form3(this); f3->close();f4=new Form4(this); f4->close();f5=new Form5(this); f5->close();void Form6::Add() {f2->show();}void Form6::Delete() {f3->show();}void Form6::Search() {f5->show();}void Form6::Modify() {f4->show();}①添加学生信息,先在文本框中输入信息,点击按钮,添加成功。
Qt课程设计说明书题目: Flow Free游戏设计院系:清华大学计算机系专业班级:计算机系计43班学号:2014011327学生姓名:冀伟清2015年8月目录功能需求..................... 错误!未定义书签。
界面要求. (3)设计分析 (4)功能需求:实现基于Qt的桌面版Flow Free游戏只要求实现基本的Regular Pack,不要求Bridges Pack等复杂类型以鼠标左键长按代替手机触屏操作,进行连线与原游戏相似,鼠标左键长按状态下,鼠标所在位置以圆形标示与原游戏相似,要求水流通道连通时或管道破裂时,播放声音提示(自行选择提示音)要求至少包括5⨯5、6⨯6、7⨯7的棋盘布局,每种布局至少包括两关(关卡可以从原游戏中任意选择)与原游戏相似,至少包括3个功能按钮,分别为重新开始、上一关、下一关。
界面要求Flow free游戏的游戏界面包括背景图片、工具栏图片、菜单栏等等。
导入位图以及菜单工具条后,游戏未开始前(win10系统下)的界面显示如图所示设计分析根据分析,这个程序一共要实现如下几个功能,包括5X5模式、6X6模式以及7X7模式,游戏帮助提示。
具体的结构如下程序分析程序界面:主窗口设计:行为设计:void game::createActions(){//5X5fiveAction=new QAction(QIcon("F:/QT/workpalce/game/images/bullet-5-d-o.png"),tr("5X5模式"),this);fiveAction->setStatusTip(tr("进入5X5模式"));connect(fiveAction,SIGNAL(triggered()),this,SLOT(fiveflow()));//6X6sixAction=new QAction(QIcon("F:/QT/workpalce/game/images/6.png"),tr("6X6模式"),this);sixAction->setStatusTip(tr("进入6X6模式"));connect(sixAction,SIGNAL(triggered()),this,SLOT(sixflow()));//7X7sevenAction=new QAction(QIcon("F:/QT/workpalce/game/images/bullet-7-l-b.png"),tr("7X7模式"),this);sevenAction->setStatusTip(tr("进入7X7模式"));connect(sevenAction,SIGNAL(triggered()),this,SLOT(sevenflow()));//退出exitAction=new QAction(QIcon("F:/QT/workpalce/game/images/run.png"),tr("退出"),this);exitAction->setStatusTip(tr("退出"));connect(exitAction,SIGNAL(triggered()),this,SLOT(close()));//帮助helpAction=new QAction(tr("howtoplay"),this);connect(helpAction,SIGNAL(triggered()),this,SLOT(showHelp()));}菜单栏设计:void game::createMenus(){//菜单filemenu=menuBar()->addMenu(tr("菜单"));filemenu->addAction(fiveAction);filemenu->addAction(sixAction);filemenu->addAction(sevenAction);filemenu->addSeparator();filemenu->addAction(exitAction);//帮助helpmenu=menuBar()->addMenu(tr("帮助"));helpmenu->addAction(helpAction);}工具栏设计:void game::createToolBars(){//工具栏filebar=addToolBar("File");filebar->addAction(fiveAction);filebar->addAction(sixAction);filebar->addAction(sevenAction);filebar->addAction(exitAction);}按钮设计:void game::createButton(){fivebutton=new QPushButton("five");fivebutton->setStyleSheet("QPushButton{background-col or:rgb(255,255,255,0);font-weight:700;font-size:50px; color:red;}""QPushButton::hover{background-color:rgb(255,255,255, 0);font-weight:700;font-size:50px;color:white;}"); sixbutton=new QPushButton("six");sixbutton->setStyleSheet("QPushButton{background-colo r:rgb(255,255,255,0);font-weight:700;font-size:50px;c olor:green;}""QPushButton::hover{background-color:rgb(255,255,255, 0);font-weight:700;font-size:50px;color:white;}"); sevenbutton=new QPushButton("seven");sevenbutton->setStyleSheet("QPushButton{background-co lor:rgb(255,255,255,0);font-weight:700;font-size:50px ;color:yellow;}""QPushButton::hover{background-color:rgb(255,255,255, 0);font-weight:700;font-size:50px;color:white;}"); exitbutton=new QPushButton("quit");exitbutton->setStyleSheet("QPushButton{background-col or:rgb(255,255,255,0);font-weight:700;font-size:50px; color:purple;}""QPushButton::hover{background-color:rgb(255,255,255, 0);font-weight:700;font-size:50px;color:white;}"); QVBoxLayout*hbox=new QVBoxLayout;hbox->addSpacing(200);hbox->addWidget(fivebutton,0,Qt::AlignCenter);hbox->addWidget(sixbutton,0,Qt::AlignCenter);hbox->addWidget(sevenbutton,0,Qt::AlignCenter); hbox->addWidget(exitbutton,0,Qt::AlignCenter);connect(exitbutton,SIGNAL(clicked()),this,SLOT(close( )));connect(sevenbutton,SIGNAL(clicked()),this,SLOT(seven flow()));connect(sixbutton,SIGNAL(clicked()),this,SLOT(sixflow ()));connect(fivebutton,SIGNAL(clicked()),this,SLOT(fivefl ow()));showWidget->setLayout((hbox));}帮助设计:void game::showHelp(){newhelp=new QWidget(this,Qt::Window);newhelp->setWindowTitle(tr("帮助"));QLabel*label=new QLabel("5X5模式:在5X5方格中将相同两点用线相连\n""6X6模式:在6X6方格中将相同两点用线相连\n""7X7模式:在7X7方格中将相同两点用线相连\n",this);QVBoxLayout*layout=new QVBoxLayout;layout->addWidget(label);newhelp->setLayout(layout);newhelp->show();}游戏窗口设计:#include"flow.h"#include<QWidget>#include<QPalette>#include<QAction>#include<QMenu>#include<QMenuBar>#include<QToolBar>#include<QLabel>#include<QVBoxLayout>#include<QHBoxLayout>#include<QIcon>#include<QPainter>#include<QPushButton>#include<QSpacerItem>#include<QMouseEvent>#include<QtAlgorithms>#include<QtDebug>#include<QSound>Flow::Flow(int num,QWidget*parent):QMainWindow(parent),size(num){m_dragging=0;sum=(size-5)*2;finishsum=0;setFixedSize(500,500);QWidget*all=new QWidget;setCentralWidget(all);QAction*nextAction=new QAction(QIcon("F:/QT/workpalce/ game/images/arrow_right.png"),tr("前进"),this); nextAction->setStatusTip(tr("前进"));connect(nextAction,SIGNAL(triggered()),this,SLOT(next flow()));QAction*lastAction=new QAction(QIcon("F:/QT/workpalce/ game/images/upload.png"),tr("后退"),this);lastAction->setStatusTip(tr("后退"));connect(lastAction,SIGNAL(triggered()),this,SLOT(last flow()));QAction*restartAction=new QAction(QIcon("F:/QT/workpal ce/game/images/restart.png"),tr("重新开始"),this); restartAction->setStatusTip(tr("重新开始"));connect(restartAction,SIGNAL(triggered()),this,SLOT(r estartflow()));QAction*exitAction=new QAction(QIcon("F:/QT/workpalce/ game/images/close.png"),tr("退出"),this);exitAction->setStatusTip(tr("退出"));connect(exitAction,SIGNAL(triggered()),this,SLOT(clos e()));QToolBar*filebar=addToolBar("File");filebar->addAction(lastAction);filebar->addAction(nextAction);filebar->addAction(restartAction);filebar->addAction(exitAction);creatblock();}Flow::~Flow(){}void Flow::creatblock(){hr[0]=-1;hr[1]=0;hr[2]=0;hr[3]=1;ht[0]=0;ht[1]=-1;ht[2]=1;ht[3]=0;for(int i=0;i<6;i++)for(int j=0;j<8;j++)for(int k=0;k<8;k++)blockfive[i][j][k]=0;blockfive[0][1][1]=1;blockfive[0][5][2]=1;blockfive[0 ][1][3]=2;blockfive[0][4][2]=2;blockfive[0][2][3]=3; blockfive[0][5][3]=3;blockfive[0][1][5]=4;blockfive[0 ][4][4]=4;blockfive[0][2][5]=5;blockfive[0][5][4]=5;blockfive[1][2][4]=1;blockfive[1][3][3]=1;blockfive[1 ][1][2]=2;blockfive[1][4][1]=2;blockfive[1][1][3]=3; blockfive[1][5][1]=3;blockfive[1][1][4]=4;blockfive[1 ][5][4]=4;blockfive[1][4][4]=5;blockfive[1][5][3]=5;blockfive[2][1][1]=1;blockfive[2][5][1]=1;blockfive[2 ][1][2]=2;blockfive[2][6][1]=2;blockfive[2][1][3]=3;blockfive[2][3][3]=3;blockfive[2 ][1][5]=4;blockfive[2][4][3]=4;blockfive[2][2][5]=5;blockfive[2][5][3]=5;blockfive[2 ][1][6]=6;blockfive[2][6][3]=6;blockfive[3][1][2]=1;blockfive[3][5][6]=1;blockfive[3 ][1][3]=2;blockfive[3][4][6]=2;blockfive[3][1][6]=3;blockfive[3][3][6]=3;blockfive[3 ][3][3]=4;blockfive[3][5][3]=4;blockfive[3][3][4]=5;blockfive[3][5][2]=5;blockfive[3 ][4][4]=6;blockfive[3][5][5]=6;blockfive[4][1][2]=1;blockfive[4][7][3]=1;blockfive[4 ][1][3]=2;blockfive[4][7][4]=2;blockfive[4][2][3]=3; blockfive[4][6][3]=3;blockfive[4][2][4]=4;blockfive[4 ][2][6]=4;blockfive[4][3][3]=5;blockfive[4][4][6]=5; blockfive[4][4][3]=6;blockfive[4][5][6]=6;blockfive[4 ][4][4]=7;blockfive[4][5][5]=7;blockfive[5][1][6]=1;blockfive[5][3][3]=1;blockfive[5 ][1][7]=2;blockfive[5][2][6]=2;blockfive[5][2][2]=3; blockfive[5][4][1]=3;blockfive[5][2][5]=4;blockfive[5 ][5][3]=4;blockfive[5][3][6]=5;blockfive[5][5][7]=5; blockfive[5][4][6]=6;blockfive[5][5][2]=6;blockfive[5 ][5][1]=7;blockfive[5][6][7]=7;for(int i=1;i<=size;i++)for(int j=1;j<=size;j++){block[i][j].last=-1;block[i][j].next=-1;block[i][j].sourcex=0;block[i][j].sourcey=0;block[i][j].lastuse=false;block[i][j].nextuse=false;block[i][j].source=false;block[i][j].use=false;blockcolor[i][j]=0;}}void Flow::paintEvent(QPaintEvent*ev){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);QPen pen(Qt::white,1);QBrush brush(Qt::black);QRgb color[7]={qRgb(255,0,0),qRgb(0,255,0),qRgb(0,0,25 5),qRgb(255,127,0),qRgb(255,255,0),qRgb(0,255,255),qRgb(255,222,173)};painter.setPen(pen);painter.setBrush(brush);painter.drawRect(0,0,height(),width());int h=height()/(size+2);int w=width()/(size+2);if(width()>height())extent=h;elseextent=w;for(int j=0;j<size+1;++j){painter.drawLine(extent,(j+1)*extent,extent*(size+1), extent*(j+1));painter.drawLine((j+1)*extent,extent,(j+1)*extent,(si ze+1)*extent);}painter.setPen(QPen(Qt::NoPen));//设置画笔形式painter.setBrush(QBrush(Qt::red,Qt::SolidPattern)); for(int i=1;i<=size;i++)for(int j=1;j<=size;j++)if(blockfive[sum][i][j]!=0){painter.setBrush(QBrush(color[blockfive[sum][i][j]-1] ));painter.drawEllipse((j+0.25)*extent,(i+0.25)*extent,e xtent/2,extent/2);}for(int i=1;i<=size;i++)for(int j=1;j<=size;j++)if(block[i][j].nextuse==true){//qDebug()<<ht[block[i][j].next]<<hr[block[i][j].next ];//qDebug()<<i<<j;//qDebug()<<block[i][j].next;pen.setColor(color[blockcolor[i][j]-1]);pen.setWidth(extent/4);painter.setPen(pen);painter.drawLine(extent*(j+0.5),(i+0.5)*extent,extent *(j+ht[block[i][j].next]+0.5),extent*(i+hr[block[i][j ].next]+0.5));}if(m_dragging==1){//qDebug()<<posy<<posx;QColor aq(color[colorsum-1]);aq.setAlpha(70);painter.setPen(QPen(Qt::NoPen));//设置画笔形式painter.setBrush(QBrush(aq));painter.drawEllipse(posx-0.25*extent,posy-0.25*extent ,extent/2,extent/2);}else{for(int i=1;i<=size;i++)for(int j=1;j<=size;j++)if(block[i][j].use==true){painter.setPen(QPen(Qt::NoPen));QColor aq(color[blockcolor[i][j]-1]);aq.setAlpha(70);painter.setBrush(QBrush(aq));painter.drawRect((j)*extent,(i)*extent,extent,extent) ;}}}void Flow::lastflow(){if(sum%2==1)sum--;finishsum=0;for(int i=1;i<=size;i++)for(int j=1;j<=size;j++){block[i][j].last=-1;block[i][j].next=-1;block[i][j].sourcex=0;block[i][j].sourcey=0;block[i][j].lastuse=false;block[i][j].nextuse=false;block[i][j].source=false;block[i][j].use=false;blockcolor[i][j]=0;}update();}void Flow::nextflow(){if(sum%2==0)sum++;finishsum=0;for(int i=1;i<=size;i++)for(int j=1;j<=size;j++){block[i][j].last=-1;block[i][j].next=-1;block[i][j].sourcex=0;block[i][j].sourcey=0;block[i][j].lastuse=false;block[i][j].nextuse=false;block[i][j].source=false;block[i][j].use=false;blockcolor[i][j]=0;}update();}void Flow::restartflow(){finishsum=0;for(int i=1;i<=size;i++)for(int j=1;j<=size;j++){block[i][j].last=-1;block[i][j].next=-1;block[i][j].sourcex=0;block[i][j].sourcey=0;block[i][j].lastuse=false;block[i][j].nextuse=false;block[i][j].source=false;block[i][j].use=false;blockcolor[i][j]=0;}update();}void Flow::mousePressEvent(QMouseEvent*ev){int x;int y;x=(ev->pos().y())/extent;y=(ev->pos().x())/extent;if((x>=1)&&(x<=size)&&(y>=1)&&(y<=size))if(blockfive[sum][x][y]!=0||block[x][y].source==true) {posx=ev->pos().x();posy=ev->pos().y();m_dragging=1;colorsum=blockcolor[x][y];if(blockfive[sum][x][y]!=0)colorsum=blockfive[sum][x] [y];xs=x;ys=y;clear(x,y);change(x,y,colorsum);block[x][y].sourcex=x;block[x][y].sourcey=y;if(block[x][y].lastuse==true&&blockfive[sum][x][y]!=0 ){qDebug()<<block[x][y].last;int k;k=block[x][y].last;block[x][y].last=-1;block[x][y].lastuse=false;x=x-hr[k];y=y-ht[k];block[x][y].next=-1;block[x][y].nextuse=false;}}int num;num=calu();if(num==(finishsum-1)){sound(1);finishsum--;}update();}void Flow::mouseMoveEvent(QMouseEvent*ev){int x;int y;x=(ev->pos().y())/extent;y=(ev->pos().x())/extent;if(m_dragging==1){posx=ev->pos().x();posy=ev->pos().y();if((x>=1)&&(x<=size)&&(y>=1)&&(y<=size))for(int i=0;i<4;i++)if((xs+hr[i]==x)&&(ys+ht[i]==y)){if(blockfive[sum][x][y]!=0&&blockfive[sum][x][y]!=col orsum)break;if(blockfive[sum][xs][ys]!=0&&block[xs][ys].lastuse== true&&block[xs][ys].last!=(3-i))break;//qDebug()<<x<<y<<"afdsf"<<xs<<ys<<i;int sourcex=block[xs][ys].sourcex;int sourcey=block[xs][ys].sourcey;block[xs][ys].next=i;block[xs][ys].nextuse=true;clearup(x,y,sourcex,sourcey);//block[x][y].last=i;//block[x][y].lastuse=true;clear(x,y);change(x,y,colorsum);block[x][y].sourcex=sourcex;block[x][y].sourcey=sourcey;int num;num=calu();//qDebug()<<"asdasd"<<num<<finishsum;if(num==(finishsum-1)){sound(1);finishsum--;}xs=x;ys=y;qDebug()<<block[3][3].last;break;}}update();}void Flow::mouseReleaseEvent(QMouseEvent*ev){int num;num=calu();//qDebug()<<num<<finishsum;//qDebug()<<block[1][1].next;if(num==(finishsum+1)){sound(2);finishsum++;}m_dragging=0;update();}void Flow::clear(int x,int y){int xs;int ys;int sum;block[x][y].source=false;block[x][y].use=false;block[x][y].sourcex=0;block[x][y].sourcey=0;blockcolor[x][y]=0;while(block[x][y].nextuse==true){sum=block[x][y].next;xs=x;ys=y;x=x+hr[sum];y=y+ht[sum];if(block[x][y].last==block[xs][ys].next) {block[x][y].last=-1;block[x][y].lastuse=false;}block[xs][ys].nextuse=false;block[xs][ys].next=-1;block[x][y].sourcex=0;block[x][y].sourcey=0;block[x][y].source=false;block[x][y].use=false;blockcolor[x][y]=0;}}void Flow::clearup(int x,int y,int sourcex,int sourcey) {qDebug()<<x<<y<<block[x][y].lastuse;if(block[x][y].lastuse==false){block[x][y].last=block[xs][ys].next;block[x][y].lastuse=true;return;}int ssum;ssum=block[x][y].last;if((sourcex==block[x][y].sourcex)&&(sourcey==block[x] [y].sourcey))return;qDebug()<<sourcex<<sourcey<<block[x][y].sourcex<<bloc k[x][y].sourcey;block[x][y].last=block[xs][ys].next;block[x][y].lastuse=true;//block[x][y].last=-1;//block[x][y].lastuse=false;x=x-hr[ssum];y=y-ht[ssum];block[x][y].next=-1;block[x][y].nextuse=false;//qDebug()<<block[3][2].nextuse;}void Flow::change(int x,int y,int colorsum){block[x][y].source=true;block[x][y].use=true;blockcolor[x][y]=colorsum;}int Flow::calu(){int x;int y;int tum;int color;tum=0;//qDebug()<<"aaaa";for(int i=1;i<=size;i++)for(int j=1;j<=size;j++)if(blockfive[sum][i][j]!=0&&block[i][j].nextuse==true ){//qDebug()<<"gggg"<<i<<j<<block[x][y].next;color=blockfive[sum][i][j];x=i;y=j;int t;//qDebug()<<"gggg"<<i<<j<<block[x][y].next;while(block[x][y].nextuse){t=block[x][y].next;x=x+hr[t];y=y+ht[t];}//qDebug()<<"sdsgggg"<<x<<y;if(blockfive[sum][x][y]==color)tum++;}return tum;}void Flow::sound(int x){if(x==2){QSound::play("F:/QT/workpalce/game/sound/2.wav");}else{QSound::play("F:/QT/workpalce/game/sound/1.wav");}}。
前段时间因一个项目的需要,需要用Qt生成Word报告,网上查阅并借鉴了相关资料终于解决了基本的问题。
本文档中主要是基本数据的填充、数据表格和图片几种类型,所以是用word模板(.dot)和书签进行操作。
(网上看有种方法是利用宏来进行操作,表示不是很懂,哈哈)。
一、主要方法1、根据报告要求,设计word模板,定义好需要插入数据的标签,调好其他固定内容的格式。
(以保证数据插入后文档内容排列有序)2、编写word操作接口类,主要包括:打开、关闭、保存、插入文本、插入图片、插入表格、相关格式调整函数3、编写生成报告界面类,调用接口函数生成word文档。
二、接口函数WordEngine.h文件[cpp]view plain copy1.#ifndef WORDENGINE_H2.#define WORDENGINE_H3.#include <QObject>4.#include <QAxObject>5.#include <QtCore>6.class WordEngine : public QObject7.{8.Q_OBJECT9.public:10.WordEngine();11.~WordEngine();12.13./// 打开Word文件,如果sFile路径为空或错误,则打开新的Word文档14.bool Open(QString sFile, bool bVisible = true);15.16.void save(QString sSavePath);17.18.void close(bool bSave = true);19.20.bool replaceText(QString sLabel,QString sText);21.bool replacePic(QString sLabel,QString sFile);22.//插入一个几行几列表格23.QAxObject *insertTable(QString sLabel,int row,int column);24.//插入一个几行几列表格并设置表头25.QAxObject *insertTable(QString sLabel,int row,int column,QStringList headList);26.//设置列宽27.void setColumnWidth(QAxObject *table,int column, int width);28.void SetTableCellString(QAxObject *table, int row,int column,QString text);29.30.private:31.32.QAxObject *m_pWord; //指向整个Word应用程序33.QAxObject *m_pWorkDocuments; //指向文档集,Word有很多文档34.QAxObject *m_pWorkDocument; //指向m_sFile对应的文档,就是要操作的文档35.36.QString m_sFile;37.bool m_bIsOpen;38.bool m_bNewFile;39.};40.41.#endif // WORDENGINE_HWordEngine.cpp文件[cpp]view plain copy1.#include "WordEngine.h"2.#include "qt_windows.h"3.WordEngine::WordEngine()4.{5.m_pWord = NULL;6.m_pWorkDocuments = NULL;7.m_pWorkDocument = NULL;8.9.m_bIsOpen = false;10.m_bNewFile = false;11.12.HRESULT result = OleInitialize(0);13.14.if(result != S_OK && result != S_FALSE)15.{16.qDebug()<<QString("Could not initialize OLE (error %x)").arg((unsigned int)result);17.}18.}19.20.WordEngine::~WordEngine()21.{22.//if(m_bIsOpen)23.// close();24.25.OleUninitialize();26.}27.28.bool WordEngine::Open(QString sFile, bool bVisible)29.{30.//新建一个word应用程序31.m_pWord = new QAxObject();32.bool bFlag = m_pWord->setControl( "word.Application");33.if(!bFlag)34.{35.return false;36.}37.m_pWord->setProperty("Visible", bVisible);38.//获取所有的工作文档39.QAxObject *document = m_pWord->querySubObject("Documents");40.if(!document)41.{42.return false;43.}44.//以文件template.dot为模版新建一个文档45.document->dynamicCall("Add(QString)", sFile);46.//获取当前激活的文档47.m_pWorkDocument = m_pWord->querySubObject("ActiveDocument");48.if(m_pWorkDocument)49.m_bIsOpen = true;50.else51.m_bIsOpen = false;52.53.return m_bIsOpen;54.}55.56.void WordEngine::save(QString sSavePath)57.{58.if(m_bIsOpen && m_pWorkDocument)59.{60.if(m_bNewFile){61.m_pWorkDocument->dynamicCall("Save()");62.}63.else{64.//m_pWorkDocument->dynamicCall("SaveAs (const QString&,int,const QString&,const QString&,bool,bool)",65.// m_sFile,56,QString(""),QString(""),false,false);66.m_pWorkDocument->dynamicCall("SaveAs (const QString&)", sSavePath);67.}68.}69.qDebug()<<"save Done.";70.}71.72.void WordEngine::close(bool bSave)73.{74.if(bSave){75.//save();76.}77.if(m_pWord){78.m_pWord->setProperty("DisplayAlerts", true);79.}80.if(m_pWorkDocument){81.m_pWorkDocument->dynamicCall("Close(bool)", true);82.}83.if(m_pWord){84.m_pWord->dynamicCall("Quit()");85.}86.if(m_pWorkDocuments)87.{88.delete m_pWorkDocuments;89.}90.if(m_pWord)91.{92.delete m_pWord;93.}94.m_pWorkDocument = NULL;95.m_pWorkDocuments = NULL;96.m_pWord = NULL;97.98.m_bIsOpen = false;99.m_bNewFile = false;100.101.}102.103.bool WordEngine::replaceText(QString sLabel,QString sText)104.{105.if(!m_pWorkDocument){106.return false;107.}108.//获取文档中名字为sLabel的标签109.QAxObject *pBookmark = m_pWorkDocument->querySubObject("Bookmarks(QStri ng)",sLabel);110.if(pBookmark)111.{112.pBookmark->dynamicCall("Select(void)");113.pBookmark->querySubObject("Range")->setProperty("Text",sText); 114.delete pBookmark;115.}116.return true;117.}118.119.bool WordEngine::replacePic(QString sLabel,QString sFile)120.{121.if(!m_pWorkDocument)122.return false;123.124.QAxObject *bookmark_pic = m_pWorkDocument->querySubObject("Bookmarks(QS tring)",sLabel);125.if(bookmark_pic)126.{127.bookmark_pic->dynamicCall("Select(void)");128.QAxObject *Inlineshapes = m_pWorkDocument->querySubObject("Inli neShapes");129.Inlineshapes->dynamicCall("AddPicture(const QString&)",sFile);130.delete Inlineshapes;131.}132.return true;133.}134.135.QAxObject *WordEngine::insertTable(QString sLabel, int row, int column) 136.{137.QAxObject *bookmark = m_pWorkDocument->querySubObject("Bookmarks(QVar iant)", sLabel);138.if(bookmark)139.{140.bookmark->dynamicCall("Select(void)");141.QAxObject *selection = m_pWord->querySubObject("Selection"); 142.143.selection->dynamicCall("InsertAfter(QString&)", "\n");144.//selection->dynamicCall("MoveLeft(int)", 1);145.selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment ", "wdAlignParagraphCenter");146.//selection->dynamicCall("TypeText(QString&)", "Table Test");//设置标题147.148.QAxObject *range = selection->querySubObject("Range");149.QAxObject *tables = m_pWorkDocument->querySubObject("Tables");150.QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(),row,column);151.152.for(int i=1;i<=6;i++)153.{154.QString str = QString("Borders(-%1)").arg(i);155.QAxObject *borders = table->querySubObject(str.toAscii().constData());156.borders->dynamicCall("SetLineStyle(int)",1);157.}158.return table;159.}160.}161.162.QAxObject *WordEngine::insertTable(QString sLabel, int row, int column, QSt ringList headList)163.{164.QAxObject *bookmark = m_pWorkDocument->querySubObject("Bookmarks(QVaria nt)", sLabel);165.if(headList.size() != column){166.return NULL;167.}168.if(bookmark)169.{170.bookmark->dynamicCall("Select(void)");171.QAxObject *selection = m_pWord->querySubObject("Selection"); 172.173.selection->dynamicCall("InsertAfter(QString&)", "\r\n");174.//selection->dynamicCall("MoveLeft(int)", 1);175.selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphCenter");176.//设置标题177.//selection->dynamicCall("TypeText(QString&)", "Table Test");178.179.QAxObject *range = selection->querySubObject("Range");180.QAxObject *tables = m_pWorkDocument->querySubObject("Tables"); 181.QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",r ange->asVariant(),row,column);182.//表格自动拉伸列0固定1根据内容调整 2 根据窗口调整183.table->dynamicCall("AutoFitBehavior(WdAutoFitBehavior)", 2);184.185.//设置表头186.for(int i=0;i<headList.size();i++){187.table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetText(QString)", headList.at(i));188.//加粗189.table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetBold(int)", true);190.}191.192.for(int i=1;i<=6;i++)193.{194.QString str = QString("Borders(-%1)").arg(i);195.QAxObject *borders = table->querySubObject(str.toAscii().co nstData());196.borders->dynamicCall("SetLineStyle(int)",1);197.}198.return table;199.}200.}201.202.void WordEngine::setColumnWidth(QAxObject *table, int column, int width) 203.{204.if(!table){205.return;206.}207.table->querySubObject("Columns(int)",column)->setProperty("Width",width);208.}209.210.void WordEngine::SetTableCellString(QAxObject *table, int row,int column,QStr ing text)211.{212.if(!table)213.return;214.QAxObject *cell = table->querySubObject("Cell(int,int)",row,column);215.if(!cell)216.return;217.cell->dynamicCall("Select(void)");218.cell->querySubObject("Range")->setProperty("Text", text);219.}注:对于给标签插入文本、图片比较简单,主要是在对于表格插入调试了很久,比如表头加粗、表格自动拉伸、边框调整。
Qt技术
QT Creator是跨平台的QT IDE,是一款新的轻量级集成开发环境。
它的设计目标是使开发人员能够利用QT这个应用程序框架更加速及轻易的完成开发任务。
QT Creator包括项目生成向导、高级的C++代码编辑器、浏览文件及类的工具、集成了QT Designer、QT Assistant、QT Linguist、图形化的GDB调试前端,集成Qmake构建工具等。
framebuffer是一种能够提取图形的硬件设备,是用户进入图形界面的很好接口。
framebuffer是显存抽象后的一种设备,它允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。
有了framebuffer,用户的应用程序不需要对底层的驱动深入了解就能够做出很好的图形。
对于用户而言,它和/dev下面的其他设备没有什么区别,用户可以把framebuffer看成一块内存,既可以向这块内存中写人数据,也可以从这块内存中读取数据。
显示器将根据相应指定内存块的数据来显示对应的图形界面。
1.1 Qt显示界面的设计与实现
1.1.1 开机界面的设计
为了美化整个软件环境,我们将制作一个开机自动启动的画面,3秒后自动进入主窗口界面。
如开机界面显示图如图1-1所示,设计框图如图1-2所示。
开机界面背景图片实现代码如下:
QSplashScreen *splash=new QSplashScreen; //启动画面
splash->setPixmap(QPixmap(":/image/开机界面_副本.png"));
splash->show();
float t = 0;
do
{
t = ((float)clock()) / CLOCKS_PER_SEC;
QCoreApplication::processEvents();
}while( t < 3 );
图1-1 开机界面显示图
图1-2 设计框图
1.1.2界面总体设计与实现
(1) MainWindow窗口:QMainWindow类是为应用窗口提供一个摆放相关窗体的框架。
一个主窗口包含了一组标准窗体的集合。
主窗口的顶部包含一个菜单栏,它的下方放置工具栏。
工具栏可以移动到其它的停靠区域。
主窗口允许停靠的位置有顶部,左边,右边和底部。
工具栏可以被拖放到一个停靠的位置,从而形成一个浮动的工具面板。
(2) 背景显示使用QLabel控件:Windows 窗体Label 控件用于显示用户不能编辑的文本或图像。
用于显示图片还需要在主函数内添加代码:
QPixmap pixmap(":/images/mmm.jpg");
ui->picture->setPixmap(pixmap);
ui->picture->show();
(3) pushbutton的运用原理:推动按钮或者命令按钮或许是任何图形用户,界面中通常用到的窗口部件。
推动(点击)按钮来命令计算机执行一些操作,或者回答一个问题。
典型的按钮有确定(OK)、应用(Apply)、撤销(Cancel)、关闭(Close)、是(Yes)、否(No)和帮助(Help)。
调用setAutoDefault(FALSE),在按钮中添加图片背景,可以在右侧pushbutton的属性中由stylesheet中添加。
1.1.3信号与槽的设计与实现
信号和槽用于对象间的通讯。
信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分。
我们使用信号和槽。
当一个特定事件发生的时候,一个信号被发射。
Qt的窗口部件有很多预定义的信号,但是我们总是可以通过继承来加入我们自己的信号。
槽就是一个可以被调用处理特定信号的函数。
Qt的窗口部件又很多预定义的槽,但是通常的习惯是你可以加入自己的槽。
例如,退出按钮转到槽clicked,
void MainWindow::on_tuichu_clicked()
{ this->close();}
1.1.4交叉编译的设计与实现
交叉编译是在一个平台上生成另一个平台上的可执行代码。
这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。
同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
1.1.5framebuffer的LCD显示技术的设计与实现
(1) 应用程序通过内核对framebuffe r的控制,主要有下面3种方式:
①/写/dev/fb 相当于读/写屏幕缓冲区。
②映射(map)操作通过映射操作,可将屏幕缓冲区的物理地址映射到用户空问的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图。
③I/O控制对于帧缓冲设备,设备文件的.ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率、显示颜色数、屏幕大小等等.ioctl的操作是由底层的驱
动程序来完成。
framebuffer 驱动要完成的工作已经是很少了,只需分配显存的大小、初始化LCD 控制寄存器、设置修改硬件设备相应的var 信息和fix 信息.驱动程序实现框图如图4-2所示。
应用程序
打开一个
帧缓冲设备
调用文件层函
数fb_write()
调用驱动层函数
获取设备特性等
对帧缓冲设备对应的地
址空间进行写
将数据显示
在LCD 面板上
结束成功
失败
图4-2 驱动程序实现图
(2) 在了解了上面所述的概念后,编写帧缓冲驱动的实际工作并不复杂,需要做如下工作。
① 编写初始化函数,初始化函数首先初始化LCD 控制器,通过写寄存器设置显示模式和显示颜色数,然后分配LCD 显示缓冲区。
在Linux 可通过kmalloc 函数分配一片连续的空间。
笔者采用的LCD 显示方法为240×320,4位灰度。
需要分配的显示缓冲区为240×320×1/2=37.5k 字节,缓冲区通常分配在大容量的片外SDRAM 中,起始地址保存在LCD 控制器寄存器中。
最后是初始化一个fb_info 结构,填充其中的成员变量,并调用register_framebuffer(&fb_info),将fb_info 登记人内核。
② 编写结构fb_info 中函数指针fb_ops 对应的成员函数对于嵌入式系统的简单实现,只需要下列3个函数就可以了。
struct fb_ops{
int(*fb_get_fix)(struct fb_fix_screeninfo *fix,int con,struct fb_info *info);
int(*fb_get_var)(struct fb_var_screeninfo *var,int con,struet fb_info *info);
int(*fb_set_var)(struet fb_var_screeninfo *var,int con,struct fb_info *info); };。