多年来开发QT累计的笔记.docx

上传人:b****8 文档编号:23572951 上传时间:2023-05-18 格式:DOCX 页数:29 大小:70.14KB
下载 相关 举报
多年来开发QT累计的笔记.docx_第1页
第1页 / 共29页
多年来开发QT累计的笔记.docx_第2页
第2页 / 共29页
多年来开发QT累计的笔记.docx_第3页
第3页 / 共29页
多年来开发QT累计的笔记.docx_第4页
第4页 / 共29页
多年来开发QT累计的笔记.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

多年来开发QT累计的笔记.docx

《多年来开发QT累计的笔记.docx》由会员分享,可在线阅读,更多相关《多年来开发QT累计的笔记.docx(29页珍藏版)》请在冰豆网上搜索。

多年来开发QT累计的笔记.docx

多年来开发QT累计的笔记

QT学习笔记-1.QT主要的对象

说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面

所以现在想认认真真的学习一个c++图形界面框架库

本来想学习Xwidget但是这个资料不大好找有啥问题不好解决

那就学习QT吧

不说QT的优缺点,不说如何编译QT

从QT的主要库类开始吧

知道了基本的对象之后如果需要学习看看文档就知道了

如果需要编译QT的话再下个代码试着编译吧

QApplication应用程序类          管理图形用户界面应用程序的控制流和主要设置

QLabel标签类                      提供文本或者图像的显示

QPushButton按钮类              提供了命令按钮按钮的一种

QButtonGroup按钮组合类          按钮组相关按钮的组合

QGroupBox群组类                一个有标题的组合框

QDateTimeEdit日期时间编辑框类  

QLineEdit行编辑框类              单行文本编辑器

QTextEdit文本编辑框类            单页面多信息编辑器对象

QComboBox组合框类

QProgressBar进度条类

QLCDNumber数字显示框类

QScrollBar滚动条类

QSpinBox微调框类

QSlider滑动条类

QIconView图标视图类

QListView列表视图类

QListBox列表框类

QTable表格类

QValidator有效性检查类

QImage图像类

QMainWindow主窗口类

QPopupMenu弹出性菜单类

QMenuBar菜单栏类

QToolButton工具按钮类

QToolTip提示类

QWhatsThis这是什么类

QAction动作类

QHBoxLayout水平布局类

QVBoxLayout垂直布局类

QGridLayout表格布局类

QT对话框类

QMessageBox消息对话框类

QProgressDialog进度条对话框类

QWizard向导对话框类

QFileDialog文件对话框类

QColorDialog颜色对话框类

QFontDialog字体对话框类

QPrintDialog打印对话框类

基本就这些对象了

要系统学习QT还需要看看QT的slot系统,QT库类接口等

具体的学习就是看例子咯

QT学习笔记-2.QT窗体布局和皮肤加载

学习QT的一个原因是貌似QT做出来的界面比较绚丽

我倒想看看能做出来啥样子的

从QT窗体布局说起

凡是窗体布局无非就是如何摆放的问题

1.想当然如果摆放有2个方式一个是所见即所得,一个是使用布局管理器

先说后者吧

2.QT有好几种布局管理器无非就是啥子流式布局,格子布局等等

从这个层级上说软件界面都是布局嵌套的

3.布局和控件的关系

  一般是一个布局对应于一个控件容器(或者顶层控件)

  使用当前布局管理器加挂子控件(容器)即可

然后给当前控件挂上布局管理器即可

下面是一个简单的QTLayout的例子(从QT例子改的)

1.classDialog:

publicQDialog

2.{

3.  Q_OBJECT

4.public:

5.  Dialog();

6.private:

7.  voidcreateHorizontalGroupBox();

8.

9.  enum{button_number=4};

10.  QGroupBox*groupbox;

11.  QPushButton*buttons[button_number];

12.  QDialogButtonBox*buttonBox;

13.};

复制代码

实现如下:

1.#include

2.

3.#include"dialog.h"

4.

5.//!

[0]

6.Dialog:

:

Dialog()

7.{

8.  createHorizontalGroupBox();

9.

10.  buttonBox=newQDialogButtonBox(QDialogButtonBox:

:

Ok

11.                        |QDialogButtonBox:

:

Cancel);

12.

13.  connect(buttonBox,SIGNAL(accepted()),this,SLOT(accept()));

14.  connect(buttonBox,SIGNAL(rejected()),this,SLOT(reject()));

15.

16.  QVBoxLayout*mainLayout=newQVBoxLayout;

17.  mainLayout->addWidget(groupbox);

18.  mainLayout->addWidget(buttonBox);

19.  setLayout(mainLayout);

20.

21.  setWindowTitle(tr("LayoutTest"));

22.}

23.

24.voidDialog:

:

createHorizontalGroupBox()

25.{

26.  groupbox=newQGroupBox(tr("LayoutTest"));

27.  QHBoxLayout*layout=newQHBoxLayout;

28.

29.  buttons[0]=newQPushButton(tr("Button1"));

30.  buttons[1]=newQPushButton(tr("Button2"));

31.  buttons[2]=newQPushButton(tr("Button3"));

32.  buttons[3]=newQPushButton(tr("Button4"));

33.

34.  for(inti=0;i

35.      layout->addWidget(buttons[i]);

36.  groupbox->setLayout(layout);

37.}

复制代码

几个知识点:

1.groupbox=newQGroupBox(tr("LayoutTest"));

LayoutTest是个文本这个无须解释

那tr呢?

查查资料知道是为了支持多语言

先知道即可以后使用的话在具体查查吧

2.QDialogButtonBox是个什么东西

  看看最终的程序界面吧

  原来是对话框的确认和取消按钮

  再看信号槽函数无非就是绑定按钮到操作函数

  connect(buttonBox,SIGNAL(accepted()),this,SLOT(accept()));

  connect(buttonBox,SIGNAL(rejected()),this,SLOT(reject()));

  那accepted和accept函数有啥区别?

  看看文档

  accept函数的解释是:

HidesthemodaldialogandsetstheresultcodetoAccepted

  accpeted函数的解释是:

Thissignalisemittedwhenthedialoghasbeenacceptedeither

在说说QT皮肤

学习QT的主要目的就是想做做脸蛋好看好的软件界面

那就试试看吧

查到的QT有一个名叫QSS(CSS?

)的文件可以原来换肤

那就改改看吧

#include

#include

#include

#include

#include"dialog.h"

voidsetSkin(QApplication*constapp,QStringconst&skinFile);

intmain(intargc,char*argv[])

{

  QApplicationapp(argc,argv);

  setSkin(&app,"skin.qss");

  Dialogdialog;

  dialog.show();

  returnapp.exec();

}

voidsetSkin(QApplication*constapp,QStringconst&skinFile)

{

  QFileqss(skinFile);

  qss.open(QFile:

:

ReadOnly);

  app->setStyleSheet(qss.readAll());

  qss.close();

}

相应的QSS文件如下:

QPushButton

{

  color:

red;

  background:

url(setting.png)

}

这里把PushButton的文本颜色设置为红色

同时把它的背景设置为图片stting.png

QT学习笔记-3.Codecs例子学习

QT自带的例子Codecs是一篇关于保存和载入不同编码文本的例子

其界面比较简单一个简单的单文档而已

有2个主要的对象

一个是MainWindow用于窗体主界面

另外一个是PreviewForm用于显示编码格式列表

1.其编码格式的获取

部分代码如下:

  QMapcodecMap;

  QRegExpiso8859RegExp("ISO[-]8859-([0-9]+).*");

  foreach(intmib,QTextCodec:

:

availableMibs()){

      QTextCodec*codec=QTextCodec:

:

codecForMib(mib);

      QStringsortKey=codec->name().toUpper();

      intrank;

      if(sortKey.startsWith("UTF-8")){

        rank=1;

      }elseif(sortKey.startsWith("UTF-16")){

        rank=2;

      }elseif(iso8859RegExp.exactMatch(sortKey)){

        if(iso8859RegExp.cap

(1).size()==1)

          rank=3;

        else

          rank=4;

      }else{

        rank=5;

      }

      sortKey.prepend(QChar('0'+rank));

      codecMap.insert(sortKey,codec);

  }

  codecs=codecMap.values();

通过使用foreach循环来获取支持的编码格式并保存

不过看上去foreach(intmib,QTextCodec:

:

availableMibs())有点奇怪

查查资料

解释是foreach(variables,container)关键字是Qt对c++的一个扩展,主要用于按顺序历经容器(container)中的对象

2关于文件菜单的生成和设置

菜单的构造

一个例子

saveAsMenu=newQMenu(tr("&SaveAs"),this);这里有2个参数一个是菜单显示文另外一个是当前窗体指针

然后就可以加载子菜单,设置分隔符,设置事件响应等操作了

例子为:

  fileMenu=newQMenu(tr("&File"),this);

  fileMenu->addAction(openAct);

  fileMenu->addMenu(saveAsMenu);

  fileMenu->addSeparator();

  fileMenu->addAction(exitAct);

那如何绑定菜单到当前窗体呢

如下:

menuBar()->addMenu(fileMenu);

menuBar()->addSeparator();

menuBar()->addMenu(helpMenu);

menuBar()是QmainWindow的成员函数用于获取窗体菜单项指针

3.QT对象QAction

QT文档对QAction的解释是可以抽象用户接口对象-可以插入控件

例子如下:

  openAct=newQAction(tr("&Open"),this);

  openAct->setShortcuts(QKeySequence:

:

Open);

  connect(openAct,SIGNAL(triggered()),this,SLOT(open()));

无非就是对象声明,设置快捷键,链接函数和响应而已

4.窗体设置

  setWindowTitle(tr("Codecs"));

  resize(500,400);

5.消息对话框

  QMessageBox:

:

about(this,tr("AboutCodecs"),

        tr("TheCodecsexampledemonstrateshowtoreadandwrite"

          "filesusingvariousencodings."));

QT学习笔记-4.信号与插槽

本文主要是对C++GUIProgrammingwithQt4一书SignalsandSlotsinDepth部分的翻译

信号与插槽机制是Qt编程的基础.它可以绑定对象而不需要对象之间彼此了解。

槽类似于c++中的成员函数他可以是虚拟的,可重载的,私有的,公开的,受保护的。

不同点式槽可以链接到信号。

通过这种方式可以在每次信号发射的的时候做到调用槽函数

connect()语句是这样的

1.connect(sender,SIGNAL(signal),receiver,SLOT(slot));

复制代码

在这里sender和receiver是指向信号对象和槽对象的指针。

宏SIGNAL()和SLOTS()负责转换他们的参数到字符串。

当然一个信号可以连接到多个槽(似乎都是这样的)

1.connect(slider,SIGNAL(valueChanged(int)),

2.      spinBox,SLOT(setValue(int)));

3.connect(slider,SIGNAL(valueChanged(int)),

4.      this,SLOT(updateStatusBarIndicator(int)));

复制代码

同样多个信号可以连接到单个槽

例如:

1.connect(lcd,SIGNAL(overflow()),

2.      this,SLOT(handleMathError()));

3.connect(calculator,SIGNAL(divisionByZero()),

4.      this,SLOT(handleMathError()));

复制代码

除此之外信号可以连接到其他信号(见过的其他插槽系统似乎不大可以?

connect(lineEdit,SIGNAL(textChanged(constQString&)),

      this,SIGNAL(updateRecord(constQString&)));

需要指出的是信号信号链接和信号插槽连接时不同的

既然信号和插槽可以连接那么他们应该可以断开,如下:

1.disconnect(lcd,SIGNAL(overflow()),

2.        this,SLOT(handleMathError()));

复制代码

一个简单的例子:

1.classEmployee:

publicQObject

2.{

3.  Q_OBJECT

4.public:

5.  Employee(){mySalary=0;}

6.  intsalary()const{returnmySalary;}

7.publicslots:

8.  voidsetSalary(intnewSalary);

9.signals:

10.  voidsalaryChanged(intnewSalary);

11.private:

12.  intmySalary;

13.};

14.voidEmployee:

:

setSalary(intnewSalary)

15.{

16.  if(newSalary!

=mySalary){

17.      mySalary=newSalary;

18.      emitsalaryChanged(mySalary);

19.  }

20.}

21.

复制代码

说明

关键字publicslots:

和signals

他们用于修饰插槽函数和信号函数

至于信号的反射通过关键字emit来实现

通过本文基本掌握了QT的信号插槽机制

QT学习笔记-5.QT容器和算法

本文涉及QT中的容器对象系列

一容器

QVector类似stl中的vector插入尾部数据速度很快

基本例子如下:

QVectorvect(3);

vect[0]=1.0;

vect[1]=0.540302;

vect[2]=-0.416147;

这样也可以

QVectorvect;

vect.append(1.0);

vect.append(0.540302);

vect.append(-0.416147);

另外也可以通过流

vect<<1.0<<0.540302<<-0.416147;

2.QLinkedList没有提供[]操纵

随机访问速度很慢

3.QList序列容器是一种数组链表它具有前2者的大部分操作支持随机访问

在容器头部尾部插入数据很迅速

4.QStringList是QList的子类提供以下操作

排序,过滤,正则表达式处理等

5.QStack提供push,pop,top等操作

6.QueueQT的队列模板

7.QMap

基本操作如下:

QMapmap;

map.insert("eins",1);

map.insert("sieben",7);

map.insert("dreiundzwanzig",23);

当然也可以这样插入数据

map["eins"]=1;

map["sieben"]=7;

map["dreiundzwanzig"]=23;

但是这样做有一个问题那就是会生成空值

为了不出现这样的结果可以使用成员函数value()来代替[]来获取数据,如果对于键不存在则返回默认的对象值

8.QHash使用散列存储键值对

二通用算法

需要说明的是QT中的容器是stl风格的,这意味着可以使用Stl中的算法。

当然在QT库中QtAlgorithm文件包含了基本的算法模板

主要的函数有

qFind-查找给定元素在容器中的位置类似std:

:

find

qBinaryFind-类似qFind需要查找元素有序排列

qFill-类似std:

:

fill使用给定元素填充容器

qCopy,qSort..

qDeleteAll-函数对容器中的每个元素做删除处理

基本的容器和算法就这么多了

其实熟悉stl的话学习这个上手很快的

QT学习笔记-6.QApplication和基本控件的使用

接上文,这篇学学QT中基本控件的使用和QApplication对象

1.什么是QApplication?

文档说明:

TheQApplicationclassmanagestheGUIapplication'scontrolflowandmainsettings.

Application类管理GUI程序控制流和主要参数设置

QApplication继承于QCoreApplication。

后者提供了控制台程序的事件流

2.基本控件的使用例子:

#include

#include

#include

#defineQT_HTML

QLabel*label=NULL;

voidinitlabel()

{

#ifndefQT_HTML

  label=newQLabel("HelloQt!

");

#else

  label=newQLabel("

HelloQt!

");

#endif

  //!

setsize

  label->setBaseSize(64,48);

  //!

setalignment

  label->setAlignment(Qt:

:

AlignHCenter);

  

  //!

shtbackgroundcolor

  QColorbk(100,100,125);

  QPalettepalette(bk);

  label->setPalette(palette);

}

intmain(intargc,char*argv[])

{

  QApplicationapp(argc,argv);

  ap

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

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1