收藏 分享(赏)

QT学习笔记_经验篇.doc

上传人:tangtianxu1 文档编号:2907500 上传时间:2018-09-29 格式:DOC 页数:95 大小:616KB
下载 相关 举报
QT学习笔记_经验篇.doc_第1页
第1页 / 共95页
QT学习笔记_经验篇.doc_第2页
第2页 / 共95页
QT学习笔记_经验篇.doc_第3页
第3页 / 共95页
QT学习笔记_经验篇.doc_第4页
第4页 / 共95页
QT学习笔记_经验篇.doc_第5页
第5页 / 共95页
点击查看更多>>
资源描述

1、QT 学习笔记(初识)2009-05-21 11:13QT 学习笔记(初识)查看 RedHat 自带 QT 库路径:/usr/lib/qt-3.1,查看目录 qt3-1 下是否有 13 个文件,若没有,则需要安装。主菜单 -系统设置- 添加程序-选中 KDE 软件开发-更新。在 Linux 下做一个五子棋的小游戏。在/home/ 下创建目录 qt,编写一个小程序 hello.cpp 的 C+文件。下面介绍 hello.cpp 源程序:#include #include /窗口类的头文件#include /按键类的头文件int main(int argc,char *argv)QApplicat

2、ion a(argc,argv);QWidget mainwindow; /定义主窗口对象mainwindow.setMinimumSize(20,10); /设置最小尺寸mainwindow.setMaximumSize(200,100); /设置最大尺寸QPushButton helloworld(“Hello World!“, /调用了/QPushButton 的第二个构造函数,/指定副部件为 mainwindowhelloworld.setGeometry(20,20,160,60); /此函数是由其父类继承来的a.setMainWidget( /设置 mainwindow 为主部件m

3、ainwindow.show(); /显示窗口return a.exec(); /存在一个 while 循环,等待用户发命令窗口(类)QWidget 按钮(类) QPushButton特性 可关闭 可点击共性 可设大小 可设大小两个类是从可视类派生来的,例如函数 setGeometry 是设置几何尺寸的,窗口和按钮两类都可调用,设置尺寸大小函数也是由其父类继承来的,两类都可以用。经编译:g+ hello.cpp o hello lqt,编译器会报错,未发现所用到的头文件。分析错误原因:提示中说未找到程序中所用到的头文件,当编译程序时,编译器首先到特定目录下寻找原文件的头文件和函数库:头文件目录

4、:/usr/include库文件目录:/lib/ , /usr/lib/但 QT 库存放在目录/usr/lib/qt-3.1 下,此文件里有三个重要的目录:/bin/;/lib/;/include/./bin 里存放的是 QT 库的使用手册;/lib 下存放的是库文件,即由原库文件生成目标文件*.o;/include 下存放的是各库文件的声明。因此,在编译时,编译器找不到正确的文件,所以必须对环境变量做修改。方法一:敲入命令,这样可以暂时修改环境变量,设定其查找路径,但并不能保存修改,在下一次开机后,需要重新设置。1) #g+ hello.cpp o hello lq t I/usr/lib/

5、qt-3.1/include2) #export CPLUS_INCLUDE_PATH=/usr/lib/qt-3.1/include#g+ hello.cpp o hello lqt以上两种方法等价。再次编译后仍旧有错,找不到库文件。指定库路径:1) #g+ hello.cpp o hello lqt L/usr/lib/qt-3.1/lib2)#export LIBRARY_PATH=/usr/lib/qt-3.1/lib#g+ hello.cpp o hello lqt最终生成可执行文件 hello。其中,-lqt 是连接 QT 库的参数语句, -lqt 等价于-libqt.so, 它是

6、一个动态库,它包含了众多库文件,链接时只会把所需库文件链接进来,这样就不会使最终生成的文件过大。知识点:gcc -I +头文件路径-L +库文件路径-l +链接库方法二:将环境变量添加到/etc/profile/内,它是一个类似脚本的文件,每次开机都会执行里面的语句,即系统在开机时自动执行改变路径的命令,来修改环境变量。添加内容:CPLUS_INCLUDE_PATH=/usr/lib/qt-3.1/includeLIBRARY_PATH=/usr/lib/qt-3.1/libexport CPLUS_INCLUDE_PATH LIBRARY_PATH编译 C+常用命令:(源文件 hello.c

7、pp)#qmake v 可查看 qt 版本#qmake project 产生一个工程文件 qt.pro#qmake 产生 Makefile 文件 Makefile#make 生成目标文件和可执行文件 hello.o、qt。生成的 Makefile 缺少句子:LIBS:缺少-lqt,可手工加上。Qt 学习笔记(Qt3 库)上2009-05-21 11:21/*3.1 创建第一个主部件创建主部件的方法是基于 QWidget 或 QDialog 类创建一个用户类。可以使用用户类通过公有继承派生于 QWidget 类,在其中调用一些成员函数来定义窗口外观。题目要求:创建一个空的窗口,并显示在屏幕上。大

8、小为 200*120.窗口大小不可调整。源程序:3-1.cpp#include #include #include #include /在类的声明里,我们只/需要包含新的成员。其它的/方法都从 QWidget 类中继承来:class MyMainWindow:public QWidgetQPushButton *b;QLabel *l;public:MyMainWindow();MyMainWindow:MyMainWindow()/设置窗口的最大、最小尺寸/我们不需要添加 this 指针,/因为 C+默认是现在的类setMinimumSize(400,300);setMaximumSize(

9、400,300);b=new QPushButton(“hello world!“,this);b-setGeometry(20,20,160,80);l=new QLabel(“label“,this);l-setGeometry(100,90,160,93);int main(int argc,char *argv)/创建要求的应用类对象 aQApplication a(argc,argv);/创建 MyMainWindow 类的对象,/并设置其为主视图MyMainWindow w;a.setMainWidget(/显示主窗口对象,并且/它的子视图也会显示到屏幕w.show();/等待用户

10、命令a.exec();/*QT 库与用户的交互方式,例如按钮、滑块,是通过使用信号和槽。信号和槽是相互关联的函数题目要求:添加退出按钮3-5.cpp#include #include #include #include /在类的声明里,我们只/需要一个新的构造函数。/其它的成员都是从类 QWidget 中继承来的:class MyMainWindow:public QWidgetQPushButton *b;QLabel *l;public:MyMainWindow();MyMainWindow:MyMainWindow()setGeometry(100,100,200,170);/setMi

11、nimumSize(400,300);/setMaximumSize(400,300);b=new QPushButton(“Quit!“,this);b-setGeometry(20,20,160,80);b-setFont(QFont(“Times“,18,QFont:Bold);l=new QLabel(this);l-setGeometry(10,110,180,50);l-setText(“If you click the button above,nthe whole program will exit“);l-setAlignment(AlignCenter);/这里按钮 b 的

12、 clicked()信号与 qApp 的槽 quit()链接,当点击按钮时,将产生QPushButton:clicked()信号,导致 qApp 的 quit()槽被执行,从而程序退出。那么,什么是 qApp 呢?qApp 是 Qt 的一个内置指针。它总是指向程序中的 QApplication 对象(这里指 a)。/connect(b,SIGNAL(clicked(),qApp,SLOT(quit();int main(int argc,char *argv)QApplication a(argc,argv);MyMainWindow w;a.setMainWidget(w.show();re

13、turn a.exec();/*信号和槽的使用题目要求:利用滑块来改变 LCD 显示的值4-1.cpp#include #include #include #include #include #include /在类的声明里,我们只/需要一个新的构造函数。/其它的成员都是从类 QWidget 中继承来的:class MyMainWindow:public QWidgetQPushButton *b;QLCDNumber *lcd;QSlider *slider;public:MyMainWindow();MyMainWindow:MyMainWindow()setGeometry(100,10

14、0,300,200);/setMinimumSize(400,300);/setMaximumSize(400,300);b=new QPushButton(“Quit!“,this);b-setGeometry(10,20,80,40);b-setFont(QFont(“Times“,18,QFont:Bold);lcd=new QLCDNumber(2,this);lcd-setGeometry(100,10,190,180);slider=new QSlider(Vertical,this);slider-setGeometry(10,60,80,130);/下面一行代码,使点击按键 1

15、,程序退出connect(b,SIGNAL(clicked(),qApp,SLOT(quit();/下面一行链接滑块和显示器,使数字随着滑块的移动而改变connect(slider,SIGNAL(valueChanged(int),lcd,SLOT(display(int);int main(int argc,char *argv)QApplication a(argc,argv);MyMainWindow w;a.setMainWidget(w.show();return a.exec();/*用户自定义槽,需另外把自定义类做成声明函数,类中成员函数的实现可放在源函数里。4-3.h(类的声明

16、)#include #include #include #include #include class MyMainWindow:public QWidget/这个宏定义是不可缺少的Q_OBJECT;/用户自定义槽public slots:void SetValue();void ChangeValue();/用户自定义信号signals:void ValueChanged();/定义两个数据成员private:QPushButton *b1;QPushButton *b2;/构造函数public:MyMainWindow();类的函数成员的实现在源程序中4-3.cpp( 源程序)#inclu

17、de void MyMainWindow:SetValue()/向自定义信号发送信号emit ValueChanged();void MyMainWindow:ChangeValue()coutsetGeometry(10,20,80,40);b1-setFont(QFont(“Times“,18,QFont:Bold);/按键 1:设置其标识符 Quit,/和坐标位置、几何大小,/第三句设置字体:b2=new QPushButton(“Quit!“,this);b2-setGeometry(10,80,80,40);b2-setFont(QFont(“Times“,18,QFont:Bold

18、);/ValueChanged 收到信号,就给自定义槽发送信号, ChangeValue 则打印字符串connect(this,SIGNAL(ValueChanged(),this,SLOT(ChangeValue();/点击 1 按键,向自定义槽发送信号connect(b1,SIGNAL(clicked(),this,SLOT(SetValue();/点击 2 按键,程序退出connect(b2,SIGNAL(clicked(),qApp,SLOT(quit();int main(int argc,char *argv)/定义一个应用类对象QApplication a(argc,argv);

19、/定义一个应用类对象MyMainWindow w;/设置 w 为主窗口a.setMainWidget(/显示 ww.show();return a.exec();Qt 学习笔记(Qt3 库)下2009-05-21 11:249-1.cpp#include #include #include class MyMainWindow:public QWidgetpublic:MyMainWindow();private:void paintEvent(QPaintEvent *);QPainter *paint;/此函数是由系统调用的,每当第一次生成或被挡住,它都会再次被调用void MyMainW

20、indow:paintEvent(QPaintEvent *)/此句最好做成局部变量的定义,否则将导致重复申请动态内存paint=new QPainter;paint-begin(this);/设置边框颜色、线形和线的宽度paint-setPen(QPen(blue,10,QPen:SolidLine);/设置边框内部颜色全部填充为红色paint-setBrush(QBrush(red,SolidPattern);/绘制矩形paint-drawRect(20,20,160,160);/绘图介绍paint-end();MyMainWindow:MyMainWindow()/设置主窗口坐标位置、大

21、小setGeometry(100,100,200,200);int main(int argc,char *argv)QApplication a(argc,argv);MyMainWindow w;a.setMainWidget(w.show();a.exec();/*对上一个例子做一个扩展,画一个 4*4 棋盘9-1-1.cpp#include #include #include class MyMainWindow:public QWidgetpublic:MyMainWindow();private:/绘图函数声明void paintEvent(QPaintEvent *);QPain

22、ter *paint;void MyMainWindow:paintEvent(QPaintEvent *)int i;int x=20,y=20;paint=new QPainter;paint-begin(this);paint-setPen(QPen(blue,4,QPen:SolidLine);paint-setBrush(QBrush(white,SolidPattern);/画 5 条横线for(i=0;idrawLine(20,y+80*i,340,y+80*i);/画 5 条竖线for(i=0;idrawLine(x+80*i,20,x+80*i,340);在棋盘正中做两个红棋

23、子paint-setBrush(QBrush(red,SolidPattern);paint-drawEllipse(100,100,80,80);paint-drawEllipse(180,180,80,80);在棋盘正中做两个蓝棋子paint-setBrush(QBrush(green,SolidPattern);paint-drawEllipse(180,100,80,80);paint-drawEllipse(100,180,80,80);paint-end();MyMainWindow:MyMainWindow()setGeometry(100,100,400,400);int ma

24、in(int argc,char *argv)QApplication a(argc,argv);MyMainWindow w;a.setMainWidget(w.show();a.exec();/*在主窗口上加一个标签,在标签上做出一个动画。15-1.h#include #include #include #include #include #include #include class MyMainWindow:public QWidget/宏定义Q_OBJECT;public:MyMainWindow(char *);QMovie movie; /定义动画的对象public slots:

25、void UnPause(); /继续播放void Pause(); /暂停void addSpeed(); /加速动画的播放速度void decSpeed(); /减慢动画的播放速度private:unsigned long num;QLabel *label;QPushButton *b1;QPushButton *b2;QPushButton *b3;QPushButton *b4;QPushButton *b5;15-1.cpp#include “15-1.h“void MyMainWindow:UnPause()movie.unpause(); /继续播放void MyMainWin

26、dow:Pause()movie.pause(); /暂停播放void MyMainWindow:addSpeed()num+=20;movie.setSpeed(num); /以 20%增加速度void MyMainWindow:decSpeed()num-=20;movie.setSpeed(num); /以 20%减少/str 里存放动画的文件名MyMainWindow:MyMainWindow(char *str):movie(str) setGeometry(100,100,300,280);num=100; /初始速度为 100b1=new QPushButton(“Continu

27、e!“,this);b1-setGeometry(130,20,120,40);b1-setMinimumSize(40,20);b1-setFont(QFont(“Times“,18,QFont:Bold);b2=new QPushButton(“Pause!“,this);b2-setGeometry(130,70,120,40);b2-setMinimumSize(40,20);b2-setFont(QFont(“Times“,18,QFont:Bold);b3=new QPushButton(“Hurry!“,this);b3-setGeometry(130,120,120,40);b

28、3-setMinimumSize(40,20);b3-setFont(QFont(“Times“,18,QFont:Bold);b4=new QPushButton(“Slow!“,this);b4-setGeometry(130,170,120,40);b4-setMinimumSize(40,20);b4-setFont(QFont(“Times“,18,QFont:Bold);b5=new QPushButton(“Quit!“,this);b5-setGeometry(130,220,120,40);b5-setMinimumSize(40,20);b5-setFont(QFont(“

29、Times“,18,QFont:Bold);label=new QLabel(this);label-setGeometry(10,10,120,60);label-setMovie(movie);QVBoxLayout *vbox=new QVBoxLayout(this);vbox-addWidget(label);vbox-addWidget(b1);vbox-addWidget(b2);vbox-addWidget(b3);vbox-addWidget(b4);vbox-addWidget(b5);connect(b1,SIGNAL(clicked(),this,SLOT(UnPaus

30、e();connect(b2,SIGNAL(clicked(),this,SLOT(Pause();connect(b3,SIGNAL(clicked(),this,SLOT(addSpeed();connect(b4,SIGNAL(clicked(),this,SLOT(decSpeed();connect(b5,SIGNAL(clicked(),qApp,SLOT(quit();int main(int argc,char *argv)QApplication a(argc,argv);/给构造函数发送动画名,并且文件必须使.gif 格式MyMainWindow w(“trolltech.

31、gif“); a.setMainWidget(w.show();a.exec();在 Qt 程序窗口上点击任意区域移动窗体在 Qt 程序窗口上点击任意区域移动窗体 方法是截取组件 Widget 的鼠标事件函数,自己处理鼠标点击和移动的事件.Void MyWidget:mouseMoveEvent(QmouseEvent *e)Qpoint newpos=e-globalPos();/获得鼠标相对于屏幕坐标系的位置Qpooint upLeft=pos0+newpos-last;Move(upLeft); /选定区域 Void MyWidget:mousePressEvent(QmouseEven

32、t *e)last=e-globalPos();/获得鼠标相对于屏幕坐标系的位置 pos0= e-globalPos()-e-pos(); 解释:e-globalPos(); /获得鼠标相对于屏幕坐标系的位置e-pos(); /鼠标相对于窗体左上角的位置pos0; /窗体左上角的位置upLeft; /新的窗体左上角的位置这里,我们取得的鼠标位置是绝对位置,即相当于窗口的位置,同时也记录下窗体左上角的位置,当鼠标移动时,取得新的绝对位置,则窗口做上角的新位置应该时原来位置与鼠标移动的位置之差.- 在 Qt 中创建无边框窗口首先要设置窗体组件的 Wflags 是 WstyleNoBorder,无边

33、框窗口要求对整个窗口使用图像掩码.具体方法如下: 设置 Qpixmap 类型成员变量 m_pixmapBack; 在构造函数中书写: m_pixmapBack.load(“bg.bmp”);Qbitmap bitmaptmp(“bg.bmp”);/作为掩码的位图,白色部分透明,黑色部分保留.setMask(bitmaptmp); setBackgroundPixmap(m_pixmapBack); -对 QPixmap 对象进行缩放在 Qt 中进行绘图操作的时候我们常常需要对位图进行缩放,利用 QWMatrix 类 就可以很轻松的完成此功能,示例代码如下:QPixmap pm ; / do s

34、omething to pm if ( !pm.isNull() ) QWMatrix m;/创建一个 QWMatrix 类的对象m.scale(0.5f, 0.5f);/设立一个进行缩小到 1/2 的变换矩阵pm = pm.xForm(m);/进行变换操作 -Qt 系统对话框中文化1.安装 Qt4.5 的目录为/opt/qtsdk-2009.03/qt/translations/,在此目录下有 *_zh_CN.ts 和 *_zh_CN.qm 把它们拷贝到你的工程目录下。2.在主文件加入下列代码:QTranslator translator(0); translator.load(“qt_zh

35、_CN.qm“);QApplication app(argc, argv);app.installTranslator(别忘了头文件包含 QTranslator3.编译运行你的程序,就可以实现中文化了。 Qt: 绘图基础QPainter 能绘制: point, line, rectangle, ellipse, arc, chord, polygon, pie segment, Bezier curve, QPixmap, QImgeQt 支持的高级特性: antialising, alpha blending, gradient fill, vector path.QPaint 在什么上绘制

36、呢? 在“paint device“: QWidget, QPixmap, QImage, QSvgGenerator, 连接QPrinter 来打印和生成 PDF 文档 .通常在 protected void paintEvent(QPaintEvent *event)中进行绘制.protected :virtual void paintEvent(QPaintEvent *event) QPainter painter(this); / Pointer of the paint deviceQPainter 的 3 个主要设置是: pen, brush, font. painter.set

37、Pen(QPen();painter.setBruch(QBrush();painter.setFont(QFont();painter.setRenderHint(QPainter:Antialiasing, true);设置了 bursh 之后, 画的是效果即 fill.QPainter 的属性影响绘制的图形.通常使用 painter.paintXXX()来绘制图形.-Qt: 给 Widget 设置背景图片1.在要换背景的类的构造函数中装载一个图片,变量要为全局的,接下来会用到backgroundImage.load(“:image/bg.png“);setAutoFillBackgrou

38、nd(true);2.实现 resizeEvent 函数,在里面画背景void Example:resizeEvent(QResizeEvent *event) QWidget:resizeEvent(event);QPalette pal(palette();pal.setBrush(QPalette:Window,QBrush(backgroundImage.scaled(event-size(), Qt:IgnoreAspectRatio,Qt:SmoothTransformation);setPalette(pal); QtWidget: 给 widget 加上背景图关键使用 widg

39、et 的 palette 的 brush. int main(int argc, char *argv) QApplication a(argc, argv);QWidget *widget = new QWidget();widget-setAutoFillBackground(true); / 这句要加上, 否则可能显示不出背景图 .QPalette palette = widget-palette();palette.setBrush(QPalette:Window,QBrush(QPixmap(“1.png“).scaled( / 缩放背景图.widget-size(),Qt:Igno

40、reAspectRatio,Qt:SmoothTransformation); / 使用平滑的缩放方式widget-setPalette(palette); / 至此, 已给 widget 加上了背景图.QHBoxLayout *layout = new QHBoxLayout();layout-addWidget(widget);QWidget *mw = new QWidget();mw-setLayout(layout);mw-resize(500, 500);/mw-setWindowFlags(Qt:FramelessWindowHint);mw-show();return a.ex

41、ec();-Qt: 如何创建 QT 使用的 DLL如何创建 QT 使用的 DLL(.so)以及如何使用此 DLL(.so)答:创建 DLL 时其工程使用 lib 模板Quote:TEMPLATE=lib而源文件则和使用普通的源文件一样,注意把头文件和源文件分开,因为在其它程序使用此 DLL 时需要此头文件在使用此 DLL 时,则在此工程源文件中引入 DLL 头文件,并在.pro 文件中加入下面配置项:Quote:LIBS += -Lyourdlllibpath -lyourdlllibnameWindows 下和 Linux 下同样(Windows 下生成的 DLL 文件名为 yourdlll

42、ibname.dll 而在Linux 下生成的为 libyourdlllibname.so。注意,关于 DLL 程序的写法,遵从各平台级编译器所定的规则。-QtWidget: 设置 QTextEdit 的各种颜色Widget:Widget(QWidget *parent): QWidget(parent), ui(new Ui:Widget) ui-setupUi(this);connect(ui-button, SIGNAL(clicked(), this, SLOT(setColor();QPalette p = palette();p.setColor(QPalette:Text, QC

43、olor(0, 255, 0);setPalette(p); / 注意这里, 修改了 widget 的调色板, 子窗口 ui-lineEdit 的颜色变化.Widget:Widget() delete ui;void Widget:setColor() QPalette palette = ui-lineEdit-palette();const QColor if (color.isValid() palette.setColor(QPalette:Highlight, color);ui-lineEdit-setPalette(palette);palette.setColor(QPalet

44、te:Highlight, color);此处:QPalette:Highlight / 被选中后文字的背景色.QPalette:HighlightText / 被选中后文字的前景色.QPalette:Text / 文字的前景色QPalette:Base / QTextEdit 的背景色, 默认是白色的.Role: Qt 中会有一组数据, 当取得这些数据时, 使用同样的方法去获取, 为了指明是取得哪种数据, 所以就定义了 Role 这种概念, 来指明要获取的数据的类型, 例如在 View 中, 如有显示的文字, 图标, 真正有用的数据(可能没有显示出来 , 而是在内部存储着), 取得这些数据都

45、是用同一个方法 data(), 通过指明数据的角色来获得 .所有 Qt 窗口部件都拥有一个 QPalette, 并使用它绘制自己. 应用程序还有一个调色板, 通过 QApplication:palette()来获得. 修改一个窗口部件的调色板, 只影响这个窗口部件以及子窗口部件(不包含子窗口, 如只是以他作为父对象来管理内存, 而不在他里面显示), 而修改应用程序的调色板, 会影响到该应用程序的所有窗口部件-Qt: signal/slot 的三种调用方式signal/slot 目前有三种调用方式1.DirectConnection和以前一样,在 emit 处直接 invoke 你的 slot

46、函数,一般情况是 sender,receiver 在同一线程e.g. emit currentRowChanged(.);2.QueuedConnection将发送 Event 给你的 receiver 所在的线程postEvent(QEvent:MetaCall,.)slot 函数会在 receiver 所在的线程的 event loop 中进行处理,一般情况是 sender,receiver不在同一线程3.BlockingQueuedConnection调用 sendEvent(QEvent:MetaCall,.),在 receiver 所在的线程处理完成后才会返回;只能当sender,receiver 不在同一线程时才可以-

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报