当前位置:首页 > 学习方法 > 语文学习方法 > 正文
 

qt学习方法

发布时间:2024-04-26 13:05:37 影响了:

小编语:为你精心整理的qt学习方法,希望对你有帮助! 如果喜欢就请继续关注我们博文学习网(www.hnnscy.com)的后续更新吧!

qt学习方法篇一:QT学习心得

关系类

1.QGraphicsscene,QGraphicsItem,QGraphicsView

制作动画:QGraphicsItemAnimation和QTimeLine或QSlider QGraphicsItem 和QTimer

变换可以用QMatrix

文件处理类:

QFile QFileDialog QTextStreamQStringList

模型/视图编程介绍

Qt 4引入了一系列基于模型/视图构架的类,用于管理数据及其呈现之间的关系。由这个构架带来的功能的分离能够使得开发者更加灵活地自定义数据的呈现方式。Qt也提供了一些标准的接口,能够使大部分数据可以用已有的视图来显示。在帮助文档中主要介绍了这些模块的大概,基本概念和基本函数的用法。给出了每一个部件的用法,也提供了一些例子。

模型/视图构架

模型-视图-控制器(MVC)是一个基本的设计模式。这种设计模式定义了3个部件。模型即应用实体,视图就是屏幕呈现,控制器定义了用户接口和对用户输入的反馈。在MVC之前,用户界面的设计将这些模块糅合到了一起。MVC从功能上将3个部件分开,从而提供了更多的灵活性和复用性。

如果讲视图和控制器结合到一起,结果就是模型/视图构架。这种构架仍然将数据的存储和用户的呈现分

开,能够使同一数据用不同的视图来显示,而不用改变内在的数据结构。为了能够灵活把握用户输入,Qt引入了代理(delegate)的概念。代理能够在视图中灵活定义用户将用哪种方式输入数值,是用LineEdit直接输入,还是用ComboBox选择,还是用SpinBox调节。

模型与数据源想关联,并且提供了接口供构架中的其他模块访问数据,至于如何访问数据,决定于数据的类型和模块是如何实现与数据的相关的。视图从模型中获得数据的索引(index,专有类QModelIndex),这些索引是对数据的引用。在视图中,当数据元素需要编辑时,代理便负责提供编辑的接口,代理直接与模型通信,并使用模型提供的索引。

模型,视图和代理通过信号(signals)和槽(slots)相互通信:来自模块中的信号通知视图数据源中数据的改变。来自视图的信号提供了用户交互和数据显示方式的信息。当用户编辑数据时,代理发出信号,提示模型和视图编辑的状态等信息。

先来看一下最基本的三个类,Model/View框架中其他的类都是派生自这三个基本类。

QAbstractItemModel 这个类就是Model的抽象接口

QAbstractItemView 这个是视图的抽象接口

QAbstractItemDelegate View和model的“中间接口”,当你需要在视图中编辑item时,这个类就派上用场了。

模型

模型提供了接口给视图和代理,但有一点要清楚,它并不提供数据的存储。数据并不存储在模型中,而存储在由一些数据结构中或者类所定义的另外的容器中,例如文件,数据库,或者别的应用程序部件中。 QAbstractItemModel提供了足够的接口供表格,树形目录,列表等显示数据。但要用特定视图显示数据时,最好从QAbstractListModel、QAbstractTableModel中派生,它们提供了对一些常用函数更合适的默认实现。这些类通过子类化之后,能提供更加自定义的,更加特定的列表,表格视图。(一般子类化这三个抽象类)

Qt提供了一些已经完成的模型类来处理数据:

l QStringListModel:用列表来处理QString的数据。

l QStandardItemModel管理了复杂的树形结构。

l QFileSystemModel提供了本地文件系统中的文件和目录信息。

l QSqlQueryModel,QSqlTableModel,QSqlRelationalTableModel是用来存取数据库的。

视图

已经定义好的视图有3个:QListView,QTableView,QTreeView。从名称可以看出来它们各自的功能,以后会一一介绍。这三个类都基于抽象(出自:WwW.HNNscy.Com 博 文学习 网:qt学习方法)类QAbstractItemView。

代理

代理的抽象类是QAbstractItemDelegate,基于它的标准实现是QStyledItemDelegate,这个代理被用在以上3个标准视图中。然而还有一个代理QItemDelegate,它与QStyledItemDelegate是完全独立的两个代理类。因为QStyleItemDelegate使用当前风格绘制元素,所以当你用自定义代理或者使用Qt样式表的时候,最好是子类化这个。

使用模型和视图

下面将介绍如何使用模型/视图模式。

两个标准模型

Qt已经为我们实现了2种模型,QStandardItemModel和QFileSystemModel。QStandardItemModel是一个多用途的模型,可以用来表示多种不同类型的数据,可以显示在列表,表格,树视图中。这个模型存储了数据元素。

QFileSystemModel是一个维持了内容路径的模型,它自己不存储任何数据元素,仅仅表示了本地文件系统中的文件和路径。它拿来就能用,并能非常容易地设置好药显示的数据,用这个模型可以示范一下如何搭建一个可用使用的视图,同时也可以看看如何操作模型中数据的索引。

使用已经存在的模型搭建视图

QListView和QTreeView比较适合用来显示路径信息。下图中左边用了树状图,右边是列表视图。并且两个视图共享了用户的选择(即选择一个视图中的一个项目,另一个视图中的项目会同时被选中),选择项目牵扯到另外一些类,后面有详细探讨。

代码很简单:

这里index()的用法是专门针对QFileSystemModel的,给它一个路径,它返回一个QModelIndex值。这个类后面会讨论,专门用于对模型中每个项目的索引操作。

view plainprint? 1. int main(int argc, char *argv[])

2. {

3.QApplication app(argc, argv);

4.QSplitter *splitter = new QSplitter;//QSplitter用户分割两个widget

5.QFileSystemModel *model = new QFileSystemModel;

6.model->setRootPath(QDir::currentPath());7.QTreeView *tree = new QTreeView(splitter);

8.tree->setModel(model); //为视图设置模型

9.tree->setRootIndex(model->index(QDir::currentPath()));

10.QListView *list = new QListView(splitter);

11.list->setModel(model);

12.list->setRootIndex(model->index(QDir::currentPath()));

13.splitter->setWindowTitle("Two views onto the same file system model");

14.splitter->show();

15.return app.exec();

16. }

模型类

到这里可能你还对模型视图框架中的基本概念还不是很清楚,这数据如何在model中存储呢?视图到底如何从Model中获取数据?让我来看看基本概念。

首先模型为视图和代理提供了一个标准接口用于存取数据,它就是QAbstractItemModel类。无论数据项是用什么数据结构存储的,QAbstractItemModel的子类(作为一个抽象类,你总要子类化一下才能用吧)

总是用一种抽象的表结构来表示各个数据项。下面的图表示了数据的存储结构,可以发现数据都是以行、列的形式表示的,list和tree也可以有多个列。由此可以发现,其实ModelIndex对象里面应该有一个行号和一个列号用于表示其中一个数据项目。

当用setModel()设置好一个视图的model之后,模型和视图之间的联系通过信号和槽联系,当数据改变后,不管是在Model中改变的还是在视图中改变的,它们都能发出信号通知对方。

既然Model index与模型中数据表示息息相关,那就先讲这个模型索引。

模型索引(model index)

为什么要引入一个index来连接视图和模型呢?视图直接操作模型中的数据吗?Qt为了使它们分工明确,视图只管显示,模型只管存储,于是引入一个model index来存取数据提供给视图。于是视图类中只要定义一个接口函数,其参数为一个QModelIndex就行了,我不管里面的数据是什么样子的。代理类(delegate)也一样。

这样做的结果就是,只需要模型知道数据如何获得就可以了,另外一点就是模型操作的数据类型可以一般化定义,就是QVarient类(可以表示很多不同的Qt标准化类型)。Model index数据结构中也有一个其指代的模型的指针,这样使得有多个模型要显示时不至于混乱。

view plainprint?

1. QAbstractItemModel *model = index.model();//获取index指代的模型

Model index获得的数据信息只是临时的,因为model可以实时地了解内部数据结构,但是index作为一个买了东西就走的顾客,可不知道你这商店里面到底有什么类型东西。于是Qt提供了一个回头客——QPersistentModelIndex,据说可以更新model中的信息,这个以后再说。一般的index由类QModelIndex表示。

qt学习方法篇二:QT基础学习知识整理

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类别的说明。

接着建立QLabel组件,它用以显示所指定的文字(在这边指定了"Hello!World! Orz..."),setWindowTitle()用以设定窗口标题,如果不设定标题,则会自动以程序的文件名称作为标题,resize()方法用以设定组件的长、宽,单位是像素(Pixel),Qt的组件预设是不可视的,所以要使用show()方法将之显示出来。

在最后一行,执行QApplication的exec()方法,这将程序的控制权交给了QApplication,exec()方法会提供一个事件处理循环,窗口显示之后会不断倾听(listen)事件,像是键盘、鼠标等动作所引发的事件,

写好程序存盘之后,就可以开始进行make的动作,必须先产生Makefile,Qt提供了qmake程序来协助建立Makefile,它可以自动根据目前目录下档案产生*.pro的专案档(project file): qmake -project

然后根据项目档产生Makefile:

qmake

接下来就可以进行make:

make

make完成之后,可以在debug目录下找到产生的hello.exe档案,直接执行:

hello

如果您要可以在Windows下直接double click就执行程序,记得系统环境变量中要设定PATH包括Qt安装目录下的bin目录,执行时的参考画面如下所示:

如果要建构release版本,则使用make时指定-f与Makefile名称,例如:

make -f Makefile.Release

则您可以在release数据夹下看到建构好的档案。

QLabel支持HTML卷标,如果您把程序改为以下的内容:

#include <QApplication>

#include <QLabel>

int main(int argc, char *argv[]) {

QApplication app(argc, argv);

QLabel *label = new QLabel(

"<h1><font color=blue>Hello!World!</font><font

color=red>Orz...</font></h1>");

label->setWindowTitle("First Qt!");

label->resize(200, 50);

label->show();

return app.exec();

}

重新建置之后,执行结果将显示如下:

2.2信号和槽机制

信号和槽用于对象间的通讯。信号/槽机制是Qt的一个中心特征并且也许是Qt与其它框架非常不同的核心特性。

在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知给另一个窗口部件。更一般地,我们希望任何一类的对象可以和其它对象进行通讯。例如,如果我们正在解析一个XML文件,当我们遇到一个新的标签时,我们也许希望通知列表视图我们正在用来表达XML文件的结构。

较老的工具包使用一种被称作回调的通讯方式来实现同一目的。回调是指一个函数的指针,所以如果你希望一个处理函数通知你一些事件,你可以把另一个函数(回调)的指针传递给处理函数。处理函数在适当的时候调用回调。回调有两个主要缺点。首先他们不是类型安全的。我们从来都不能确定处理函数使用了正确的参数来调用回调。其次回调和处理函数是非常强有力地联系在一起的,因为处理函数必须知道要调用哪个回调。

一个关于一些信号和槽连接的摘要图

在Qt中我们有一种可以替代回调的技术。我们使用信号和槽。当一个特定事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是我们总是可以通过继承来加入我们自己的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件又很多预定义的槽,但是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号。

信号和槽的机制是类型安全的:一个信号的签名必须与它的接收槽的签名相匹配。(实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名。)因为签名是一致的,编译器就可以帮助我们检测类型不匹配。信号和槽是宽松地联系在一起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号。Qt的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的:不会再有回调核心转储(core dump)。

从QObject类或者它的一个子类(比如QWidget类)继承的所有类可以包含信号和槽。当对象改变它们的状态的时候,信号被发送,从某种意义上讲,它们也许对外面的世界感兴趣。这就是所有的对象通讯时所做的一切。它不知道也不注意无论有没有东西接收它所发射的信号。这就是真正的信息封装,并且确保对象可以用作一个软件组件。

例子

以下的例子将看到有参数的Signal发送及Slot接受,并也将介绍Qt组件的parent/child关系,这个程序将建立一个LCD数字显示组件,以及一个拉杆组件,LCD数字将反应目前拉杆的进度:

#include <QApplication>

#include <QWidget>

#include <QSlider>

#include <QLCDNumber>

int main(int argc, char *argv[]) {

QApplication app(argc, argv);

QWidget *parent = new QWidget;

parent->setWindowTitle("Signal & Slot");

parent->setMinimumSize(240, 140);

parent->setMaximumSize(240, 140);

QLCDNumber *lcd = new QLCDNumber(parent);

lcd->setGeometry(70, 20, 100, 30);

QSlider *slider = new QSlider(Qt::Horizontal, parent);slider->setRange(0, 99);

slider->setValue(0);

slider->setGeometry(70, 70, 100, 30);

QObject::connect(slider, SIGNAL(valueChanged(int)),lcd, SLOT(display(int)));

parent->show();

return app.exec();

}

在Qt中建立Widget时,要建立在heap区(即以new的方式),Qt会自动管理parent下child的delete,让您不用亲自管理具有parent/child关系的Widget建构与删除,这可以避免memory leak,您要delete的只有那些没有parent的对象,如果您将对象建立在stack区,程序将可能会有错误发生。

QWidget是Qt中所有使用者图形接口组件的父类别,可在屏幕上绘制自身,可接受鼠标、键盘等接口操作,一个QWidget可以指定它的parent 为哪个组件,而这也表示child可显示的范围将是在parent之内,parent没有显示的话,子组件也不会显示。没有指定parent的QWidget是一个独立窗口(window)。

qt学习方法篇三:QT 学习心得

QT 学习心得体会

1:#include <sys/*.h>中,sys代表这个是linux的系统文件

2:fcntl.h 文件控制,包含了open read write等等文件函数,O_RDONLY只读方式打开文件,O_WRONLY只写方式打开文件,O_RDWR可读写方式打开文件,O_NOCTTY如果欲打开的文件为终端设备时,则不会将终端机当成进程控制终端机,O_NONBLOCK以不可阻挡方式打开文件,也就是无论有无数据读取活等待,都会立即返回进程之中。

3:unistd.h是POSIX标准定义的unix类符号常量的头文件,包含了许多UNIX系统服务的函数原型,例如read函数、write函数和getpid函数

4:我们所用的版本是qtopia2.2 头文件格式 #include<qpushbutton.h>而在qt4己以后版本中,头文件格式如下:#include<QPushButton>

5:v4l2是内核提供给应用程序访问音,视频驱动的统一接口

6:v4l2的工作流程

打开设备->检查和设置设备属性->设置抮格式->设置一种输入输出方法->循环获取数据->关闭设备,在对底层设备如摄像头或串口操作时,需要调用fcntl.h unistd.h,int

fd=open(“/dev/video0”,O_RDWR),将终端设备打开,前面是设备名称,后面为打开的方式,读,写,读写

7:ioctl是中对设备的进行管理的函数。所谓对I/O通道进行管理,就 是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数 如下:

int ioctl(int fd, int cmd, …);

其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设 备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和 cmd的意义相关的。

8:memset将s所指向的某一块内存中的每个的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指void *memset(void *s, int ch, unsigned n);

9:由于qt designer不支持中文,所以需要编码显示中文,通常操作方法,添加头文件#include<qtextcodec.h>,在源文件的构造函数中添加如下代码;QTextCodec * BianMa = QTextCodec::codecForName ( "utf8" );

SnapButton->setText(BianMa->toUnicode("执行"));

10:在控制水平滑动条(垂直滑动条)移动的时候,为减少画面闪烁感,采用双缓冲技术

11:

Qt是诺基亚开发的一个跨平台的C++图形用户界面框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的, 很容易扩展,并且允许真正地组件编程。自从 1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。 Qt也是流行的 Linux桌面环境KDE 的基础。 基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。

qt是跨平台的程序设计框架,在不同平台上版本不同。写好的代码需要在什么平台上运行,就采用那个平台上的qt编译器进行编译。

qt支持嵌入式开发,qtopia是它的嵌入式版本。在主机上开发的程序,通过qtopia编译之后,传到嵌入式平台上就可以运行。前提是这个平台上已经安装了qtopia程序的运行环境。

12:V4L2 (video 4 linux 2)

程序有发现设备的能力和操作设备.它主要是用过一系列的回调函数来实现这些功能.像设置高频头的频率,帧频,视频压缩格式和图像像参数等等(在我写的FM驱动中就主要是设置频率,设置音量等)

查询设备属性:VIDEOC_QUERYCAP

所以IOCTL主要用来控制I/O的属性,可用来获取设备信息,或用来显示所有侦格式,获取内存等等IO操作

int ioctl(int fd,int request,struct v4l2_capability *argp);

显示设备信息:struct v4l2_capability cap;

ioctl(fd,VIDIOC_QUERYCAP,&cap);

printf(“Driver Name:%s”,cap.driver);

13:connect ( const * sender, const char * signal, const * receiver,

const char * member ) [静态]

把从sender对象发送的signal和receiver对象中的member连接起来,并且如果连接成功返回真,否则返回假 ,

所以当Sinal和SLOT信号都在同一个页面文件时候,sender和receiver都是this

14: BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop); 该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。 可以用以双缓冲技术

15:在调用libjpeg库之前,首先要多libjpeg的源代码进行交叉编译,再将库中声称的部分文件拷到工作目录下

相关热词搜索:

相关文章
最新文章

Copyright © 2008 - 2017 版权所有 博文学习网

工业和信息化部 湘ICP备09005888号-2