栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++学习重点记录(Week12):这周主要在学习扩展QT知识

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++学习重点记录(Week12):这周主要在学习扩展QT知识

国庆放了个十天长假,也就犯懒没有记,10号来公司加了个小班把这一周Qt的学习内容记录一下。

一、QT入门

·①设置文本时,可以使用一些常见的HTML样式,来改变窗口的文本格式;

②Layout关键字:用来设置组件布局:

·QHBoxLayout:在水平方向上排列窗口部件;

·QVBoxLayout:在竖直方向上排列窗口部件;

·QGridLayout:把各个窗口部件排列在一个网格中。

使用方法:使用时,需要先创建一个窗口布局部件:QHBoxLayout *layout = new QHBoxLayout(),然后将需要布局的部件XXX加进来:layout->addWidget(XXX),最后再展示这个布局部件:widget.setLayout(layout)。

二、创建对话框

①tr函数:可以把文本根据指定的规则翻译成其他语言;

②在文本前加“&”,是表示可以让用户通过快捷键的方式来操作部件。例如:&Find,代表用户可以通过Alt+F来操作;&what,代表用户可以通过Alt+W来操作;

③setfault:设置默认按钮,即打开窗口时用户按下回车时对应的按钮;

④上面的layout->addWidget(XXX),是可以进行部件的布局,但有时候需要复杂布局,因此还有layout->addLayout(AnotherLayout),可以将另一个布局当做父布局的组件进行布局。还有layout->addStretch(),设置分隔符,来留白;

⑤setEnabled():可以用来控制组件是否可以被操作;

⑥槽(SLOT)和普通的C++成员函数几乎是完全一样的。可以是虚函数,可以被重载,可以是公有的、保护的、私有的,并且也可以被其他C++成员直接调用;另外,槽的参数可以是任意类型;

⑦一个信号可以连接多个槽,发射这个信号的时候,调用槽的顺序是不确定的;

⑧多个信号也可以连接同一个槽,发射任意一个信号都会调用这个槽;

⑨一个信号也可以和另一个信号连接,发射第一个信号时,也会发射第二个信号;

⑩连接可以用disconnect()函数来断开,但一般不用,因为删除对象时,QT会自动移除和这个对象相关的所有连接;

⑪信号和槽的参数必须具有相同的顺序和相同的类型;如果信号的参数比槽的参数多,多余的参数就会被忽略;

⑫QT设置了三个内置检验器类用来检验输入是否有效:QIntValidator、QDoublevalidot和QRegExpValidator。第一个是设置int型数据的范围,第二个是设置double型数据的范围,第三个则是按照给定的规则接受正则表达式;

⑬QT的父-子机制是在QObject中实现的,当删除一个对象时,会遍历子对象列表并且删除每一个子对象,然后这些子对象再去遍历他们的子对象列表,能够很大程度上简化内存管理工作,降低内存泄漏的风险;

⑭accept()和reject()槽都会关闭对话框,但accept()是将返回值设置为QDialog::Accepted,即返回1;reject()可以将返回值设置为QDialog::Rejected,即返回0.。

三、创建主窗口

①如果类要定义自己的信号和槽,就要在类的开头加上Q_OBJECT宏。一般不管定不定义都加上;

②QWidget::setWindowIcon()可以设置显示在窗口左上角的图标;

③为应用程序提供图片的常用方法有:

·把图片保存到文件中,并且在运行时载入他们;

·把XMP文件包含在源代码中;

·使用Qt的资源机制:比运行时载入文件的方法更方便,并且该方法适用于所支持的任意文件格式。我们需要将选中的图片存放在源代码树种名为images的子目录下。为了利用Qt的资源系统,必须创建一个资源文件,并且在识别该资源文件的.pro文件中添加一行代码:RESOURCES = source.qrc。

④在Qt中,创建菜单和工具栏包括以下步骤:

·创建并且设置动作;

·创建菜单并且把动作添加到菜单上;

·创建工具栏并且把动作添加到工具栏上。

⑤setShortcut()可以设置快捷键;

⑥setStatusTip()可以设置鼠标移到此处的提示;

⑦menuBar()可以创建一个菜单栏,通过调用addMenu()可以创建具体的菜单栏,例如:filemenu = menuBar()->addMenu(tr(“&File”));就可以创建一个名为File的菜单;

⑧menuBar()可以插入间隔器,才两个菜单中间设置间隔。使用格式:menuBar()->addSeparator()。有的系统风格没有间隔器设置,不会报错但无效;

⑨createStatusBar()可以用来设置状态栏;

⑩QMessageBox提供了五种函数,方便开发者弹出警告信息:

·warning(parent,title,message,buttons);

·information(parent,title,text,buttons);

·question(parent,title,buttons);

·critical(parent,title,buttons);

·about(parent,title,text)。

⑪getOpenFileName:可以打开文件对话框,让用户选择文件,并且返回一个带路径的文件名,点击取消则返回空字符串,可以改变其参数来达到一些目的;

⑫如果对话框是通过show()调用的,就是非模态对话框,如果是通过exec()调用的,就是模态对话框。

四、实现应用程序的功能

①QTableWidget:可以有效地用来表达二维稀疏数组。它可以在规定的维数内显示用户滚动到的任一单元格。当用户在一个空单元内输入一些文本的时候,QTableWidget会自动创建一个用来存储这些文本的QTableWidgetItem。

五、布局管理

①Qt提供了多个用于在窗体中摆放部件的类:QHBoxLayout、QVBoxLayout、QGridLayout和QStackLayout。他们可以确保窗体能够自动适应于不同的字体、语言和系统平台。例如:如果用户改变了系统的字体设置,窗体可以立即响应并重新改变自己的大小;

②可以执行布局管理功能的其他类还有QSplitter、QScrollArea、QMainWindow和QMdiArea。这些类所拥有的共同点在于他们提供了一种可以灵活掌控的布局方式。例如:QSplitter是提供了一个切分窗口拖动条,通过拖拽它,用户可以改变窗口部件的大小;

③一共有三种基本方法用于管理子窗口部件的布局:绝对位置法(设置固定大小、很不灵活)、人工布局法(给定的大小尺寸总是可以和窗口的大小成比例)、布局管理器法(使用Qt的布局管理器,可以考虑到多种因素,是最常用的管理方法);

④QHBoxLayout和QVBoxLayout都是一维方向上排列,因此调用时只需要把要放入的部件加入到参数列表中即可,但QGridLayout是二维布局,因此在使用时除了需要标明部件,还要标明这个部件安排的位置。具体函数的参数列表是:QGridLayout(widget,row,column,rowSpan,colSpan)。

例如:label部件想要同时占用(2,0)(2,1)两个方格,此时的row和column分别是2和0,rowSpan由于没有延伸,因此是1;columnSpan由于延伸了1格,因此范围是2,故设置函数为:

QGridLayout(label,2,0,1,2)。如果省略了rowSpan和columnSpan,就默认为1;

⑤addStretch()调用相当于一个分隔符,在设置布局的语句种放入addStretch(),,就相当于把前后两个部件用分隔符分开;

⑥由于不可能为每一种可能的布局都提供唯一的默认值,所以在一个窗体中,开发人员改变它上面的一个或两个窗口部件的大小策略是非常普遍的现象。一个QSizePolicy既包含一个水平分量也包含一个垂直分量,常见取值包括:

·Fixed:该窗口部件不能被拉伸或压缩。窗口部件的大小尺寸总是保持为其大小提示的尺寸;

·Minimum:该窗口部件的大小提示就是它的最小值,再不能把窗口部件压缩到比这个还要小的值,但可以拉伸;

·Maximum:和上面相反;

·Prefered:该窗口部件的大小提示就是它比较合适的大小。但是如果需要,还是可以对该窗口部件进行拉伸或压缩;

·Expanding:可以拉伸或者压缩该窗口部件,并且它特别希望窗口能够变成变高;

⑦影响布局方式的方法:可以设置它的子窗口部件的最小大小,最大大小或固定大小。当布局管理器在摆放这些部件的时候,它就会考虑这些约束条件。并且如果这样还不够的话,还可以对子窗口部件的类进行派生并且重新实现sizeHint()函数,由此获得所需的大小提示;

⑧QStackLayout:可以对一组子窗口部件进行摆放,或者对它们进行“分页”,而且一次只显示其中一个,而把其他的子窗口部件或者分页都隐藏起来;

⑨QSplitter切分窗口:就是把窗口切割成几块,然后块与块中间会有可以左右拉伸的切分条,用户可以通过拖动这些切分条来改变切分窗口中子窗口部件的大小;

⑩QSplitter中的子窗口部件将会自动按照创建时的顺序一个接一个地放在一起,并以切分窗口拖动条来分割相邻窗口部件。通过对多个QSplitter水平或者垂直方向的嵌套,就可以实现复杂的布局;

⑪QScrollArea(滚动条窗口):以我们想要添加滚动条的窗口部件为参,调用setWidget()。一般只有在视口的大小小于子窗口部件的大小时,才会把滚动条显示出来,但也可以强制显示;

⑫QDockWidget(停靠窗口和工具栏):停靠窗口是指一些可以停靠在QMainWindow中或是浮动为独立窗口的窗口。例如VS里的文件管理视图;

⑬QMdiArea(多文档界面):在Qt中,通过把QMdiArea类作为中央窗口部件(setCentralWidget(mdiArea)),并且通过让每一个文档窗口都成为这个QMdiArea的子窗口部件,就可以创建一个多文档界面应用程序。

六、事件处理

事件是由窗口系统或者Qt自身产生的,用以响应所发生的的各类事情。和信号不同的是,信号一般在使用窗口部件的时候调用;时间则是实现窗口部件的时候使用。

七、二维图形

 ①Qt的二维图形引擎是基于QPainter类的。QPainter既可以绘制几何形状,也可以绘制像素映射、图像和文字;

②使用QPainter的draw()函数可以绘制各种各样的形状。绘制的效果取决于QPainter的设置,三个主要的设置是画笔、画刷和字体:

·画笔用来画线和边缘,它包含颜色、宽度、线型、拐点风格以及连接风格;

·画刷用来填充几何形状的图案,它一般由颜色和风格组成,但同时也可以是纹理或者一个渐变;

·字体用来绘制文字,字体有很多属性,包括字体族和磅值大小;、

可以随时调用QPen、QBrush或者QFont对象的setPen、setBrush和setFont来修改这些设置。

③Qt支持三种类型的渐变:线性渐变、锥形渐变和辐射渐变;

·线性渐变:由两个控制点定义,连接这两点的线上有一系列的颜色断点。举例:

QLinearGradient gradient(50,100,300,350);

gradient.setColorAt(0,.0,Qt:white);

gradient.setColorAt(0.2,Qt:green);

gradient.setColorAt(1.0,Qt:black)。

在两个控制点之间的不同位置指定三种颜色,位置由0和1之间的浮点数来指定,0对应第一个控制点,1对应第二个控制点。两个指定断点之间的颜色由线型插值得出;

·辐射渐变:由一个中心点(x1,y1)、半径r、一个焦点(x2,y2)以及颜色断线定义。中心点和半径定义一个圆。颜色从焦点向外扩散,焦点可以使中心点或者圆内的其他点;

·锥形渐变:由一个中心点(x,y)和一个角度a定义,颜色在中心点周围像钟表的秒针一样扩散。

八、拖放

①拖放是在一个应用程序内或者多个应用程序之间传递信息的一种直观的现代操作方式。除了为剪贴板提供支持外,通常它还提供数据移动和复制的功能功能,我们能够通过复用代码来实现对剪贴板的支持,因为拖放与剪贴板的功能机理均是以QMimeData类为基础的,而QMimeData是一个可以提供不同格式数据的类;

②拖放操作包括两个截然不同的操作:拖动和放下。Qt窗口部件可以作为拖动点、放下点或者同时作为拖动点和放下点。

九、项视图类

①对于大数据集的可视化,一般使用一种非常灵活的方法:模型-视图-控制器(MVC),在MVC方法中,模型代表数据集,对数据的获取以及存储负责:视图即视觉图像,指用户能够看到的数据,控制器则是用户和视图之间的媒介,用户通过操作控制器来改变视图,获取自己想要得到的数据;

②在Qt中,使用的不是控制器,而是使用了一种稍微有些不同的抽象:委托。委托用于对项的如果显示和如何编辑提供精细控制。Qt对每种类型的视图都提供了默认的委托;

③除了读取视图中的数据,还可以通过QTableWidget部件对视图进行编辑;

④插入行或者删除行都是在模型中完成的,并且模型会自动更新列表视图;

⑤有时Qt提供的预定义模型和数据源不能一起工作,这时候就需要创建自定义模型,以方便对底层数据源进行优化;

⑥目前理解:视图对应的有一个模型,用户设定一个项的值得时候,会调用setData函数,这个函数会根据模型索引来设定当前项的值。

十、容器类

①Qt提供了属于自己的容器类,Qt容器能够在所有的平台上运行时都表现得一致,并且使用时能够把整个容器作为不太需要太多运行成本的值来专递的最优化;

②QVector、QList、QStack、QQueue这些和C++中STL库使用方式基本相同,但操作时的函数名不相同;

③Qt和C++一样,有个头文件,代表一个算法库,里面存放着一些通用算法。又因为Qt的容器类是跨平台的,因此算法库也是可以随意使用的。

后面的内容就不记录了,都是结合具体例子讲的,看一遍拓展广度就可以了,以后用的时候再翻阅。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312100.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号