多年来开发QT累计的笔记_第1页
多年来开发QT累计的笔记_第2页
多年来开发QT累计的笔记_第3页
多年来开发QT累计的笔记_第4页
多年来开发QT累计的笔记_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、QT学习笔记-1.QT主要的对象说来惭愧学习c+很长时间了一直没有使用c+开发过软件界面所以现在想认认真真的学习一个c+图形界面框架库本来想学习Xwidget但是这个资料不大好找 有啥问题不好解决那就学习QT吧不说QT的优缺点,不说如何编译QT从QT的主要库类开始吧知道了基本的对象之后如果需要学习看看文档就知道了如果需要编译QT的话再下个代码试着编译吧QApplication 应用程序类 管理图形用户界面应用程序的控制流和主要设置QLabel 标签类 提供文本或者图像的显示QPushButton 按钮类 提供了命令按钮 按钮的一种QButtonGroup 按钮组合类 按钮组 相关按钮的组合QG

2、roupBox 群组类 一个有标题的组合框QDateTimeEdit 日期时间编辑框类QLineEdit 行编辑框类 单行文本编辑器QTextEdit 文本编辑框类 单页面多信息编辑器对象QComboBox 组合框类QProgressBar 进度条类QLCDNumber 数字显示框类QScrollBar 滚动条类QSpinBox 微调框类QSlider 滑动条类QIconView 图标视图类QListView 列表视图类QListBox 列表框类QTable 表格类QValidator 有效性检查类QImage 图像类QMainWindow 主窗口类QPopupMenu 弹出性菜单类QMenu

3、Bar 菜单栏类QToolButton 工具按钮类QToolTip 提示类QWhatsThis 这是什么类QAction 动作类QHBoxLayout 水平布局类QVBoxLayout 垂直布局类QGridLayout 表格布局类QT对话框类QMessageBox 消息对话框类QProgressDialog 进度条对话框类QWizard 向导对话框类QFileDialog 文件对话框类QColorDialog 颜色对话框类QFontDialog 字体对话框类QPrintDialog 打印对话框类基本就这些对象了要系统学习QT 还需要看看QT的slot系统,QT库类接口等具体的学习就是看例子咯Q

4、T学习笔记-2.QT窗体布局和皮肤加载学习QT的一个原因是貌似QT做出来的界面比较绚丽我倒想看看能做出来啥样子的从QT窗体布局说起凡是窗体布局无非就是如何摆放的问题1.想当然如果摆放有2个方式一个是所见即所得,一个是使用布局管理器先说后者吧2.QT有好几种布局管理器无非就是啥子流式布局,格子布局等等从这个层级上说软件界面都是布局嵌套的3.布局和控件的关系 一般是一个布局对应于一个控件容器(或者顶层控件) 使用当前布局管理器加挂子控件(容器)即可然后给当前控件挂上布局管理器即可下面是一个简单的QT Layout的例子(从QT例子改的) 1. class Dialog : public QDial

5、og2. 3. Q_OBJECT4. public:5. Dialog();6. private:7. void createHorizontalGroupBox();8.9. enum button_number = 4;10. QGroupBox *groupbox;11. QPushButton *buttonsbutton_number;12. QDialogButtonBox *buttonBox;13. ;复制代码实现如下: 1. #include 2.3. #include dialog.h4.5. /! 06. Dialog:Dialog()7. 8. createHorizo

6、ntalGroupBox();9.10. buttonBox = new QDialogButtonBox(QDialogButtonBox:Ok11. | QDialogButtonBox:Cancel);12.13. connect(buttonBox, SIGNAL(accepted(), this, SLOT(accept();14. connect(buttonBox, SIGNAL(rejected(), this, SLOT(reject();15.16. QVBoxLayout *mainLayout = new QVBoxLayout;17. mainLayout-addWi

7、dget(groupbox);18. mainLayout-addWidget(buttonBox);19. setLayout(mainLayout);20.21. setWindowTitle(tr(LayoutTest);22. 23.24. void Dialog:createHorizontalGroupBox()25. 26. groupbox = new QGroupBox(tr(Layout Test);27. QHBoxLayout *layout = new QHBoxLayout;28.29. buttons0 = new QPushButton(tr(Button1);

8、30. buttons1 = new QPushButton(tr(Button2);31. buttons2 = new QPushButton(tr(Button3);32. buttons3 = new QPushButton(tr(Button4);33.34. for(int i = 0;iaddWidget(buttonsi);36. groupbox-setLayout(layout);37. 复制代码几个知识点:1.groupbox = new QGroupBox(tr(Layout Test);Layout Test 是个文本这个无须解释那tr呢?查查资料知道是为了支持多语言

9、先知道即可以后使用的话在具体查查吧2.QDialogButtonBox是个什么东西 看看最终的程序界面吧 原来是对话框的确认和取消按钮 再看信号槽函数无非就是绑定按钮到操作函数 connect(buttonBox, SIGNAL(accepted(), this, SLOT(accept(); connect(buttonBox, SIGNAL(rejected(), this, SLOT(reject(); 那accepted和accept函数有啥区别? 看看文档 accept函数的解释是:Hides the modal dialog and sets the result code to

10、Acceptedaccpeted函数的解释是:This signal is emitted when the dialog has been accepted either在说说QT皮肤学习QT的主要目的就是想做做脸蛋好看好的软件界面那就试试看吧查到的QT有一个名叫QSS(CSS?)的文件可以原来换肤那就改改看吧#include #include #include #include #include dialog.hvoid setSkin(QApplication* const app, QString const &skinFile);int main(int argc, char *ar

11、gv) QApplication app(argc, argv); setSkin(&app ,skin.qss); Dialog dialog; dialog.show(); return app.exec();void setSkin(QApplication* const app, QString const &skinFile) QFile qss(skinFile); qss.open(QFile:ReadOnly); app-setStyleSheet(qss.readAll(); qss.close();相应的QSS文件如下:QPushButton color:red; back

12、ground:url(setting.png)这里把PushButton的文本颜色设置为红色同时把它的背景设置为图片stting.pngQT学习笔记-3.Codecs例子学习QT自带的例子Codecs是一篇关于保存和载入不同编码文本的例子其界面比较简单一个简单的单文档而已有2个主要的对象一个是MainWindow用于窗体主界面另外一个是PreviewForm用于显示编码格式列表1.其编码格式的获取部分代码如下: QMap codecMap; QRegExp iso8859RegExp(ISO- 8859-(0-9+).*); foreach (int mib, QTextCodec:avail

13、ableMibs() QTextCodec *codec = QTextCodec:codecForMib(mib); QString sortKey = codec-name().toUpper(); int rank; if (sortKey.startsWith(UTF-8) rank = 1; else if (sortKey.startsWith(UTF-16) rank = 2; else if (iso8859RegExp.exactMatch(sortKey) if (iso8859RegExp.cap(1).size() = 1) rank = 3; else rank =

14、4; else rank = 5; sortKey.prepend(QChar(0 + rank); codecMap.insert(sortKey, codec); codecs = codecMap.values();通过使用foreach循环来获取支持的编码格式并保存不过看上去foreach (int mib, QTextCodec:availableMibs()有点奇怪查查资料解释是foreach(variables ,container)关键字是Qt对c+的一个扩展,主要用于按顺序历经容器(container)中的对象2关于文件菜单的生成和设置菜单的构造一个例子saveAsMenu

15、= new QMenu(tr(&Save As), this);这里有2个参数一个是菜单显示文另外一个是当前窗体指针然后就可以加载子菜单,设置分隔符,设置事件响应等操作了例子为: fileMenu = new QMenu(tr(&File), this); fileMenu-addAction(openAct); fileMenu-addMenu(saveAsMenu); fileMenu-addSeparator(); fileMenu-addAction(exitAct);那如何绑定菜单到当前窗体呢如下:menuBar()-addMenu(fileMenu);menuBar()-addSe

16、parator();menuBar()-addMenu(helpMenu);menuBar()是QmainWindow的成员函数用于获取窗体菜单项指针3.QT对象QActionQT文档对QAction的解释是可以抽象用户接口对象-可以插入控件例子如下: openAct = new QAction(tr(&Open), this); openAct-setShortcuts(QKeySequence:Open); connect(openAct, SIGNAL(triggered(), this, SLOT(open();无非就是对象声明,设置快捷键,链接函数和响应而已4.窗体设置 setWin

17、dowTitle(tr(Codecs); resize(500, 400);5.消息对话框 QMessageBox:about(this, tr(About Codecs), tr(The Codecs example demonstrates how to read and write files using various encodings.);QT学习笔记-4.信号与插槽本文主要是对C+ GUI Programming with Qt4一书 Signals and Slots in Depth 部分的翻译信号与插槽机制是Qt编程的基础.它可以绑定对象而不需要对象之间彼此了解。槽类似于c

18、+中的成员函数他可以是虚拟的,可重载的,私有的,公开的,受保护的。不同点式槽可以链接到信号。通过这种方式可以在每次信号发射的的时候做到调用槽函数connect()语句是这样的 1. connect(sender, SIGNAL(signal), receiver, SLOT(slot);复制代码在这里sender和receiver是指向信号对象和槽对象的指针。宏SIGNAL()和SLOTS()负责转换他们的参数到字符串。当然一个信号可以连接到多个槽(似乎都是这样的) 1. connect(slider, SIGNAL(valueChanged(int),2. spinBox, SLOT(set

19、Value(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();复制代码除此之外信号可以连接到其他信号(见过的其他插槽系统似乎不大可

20、以?)connect(lineEdit, SIGNAL(textChanged(const QString &), this, SIGNAL(updateRecord(const QString &);需要指出的是信号信号链接和信号插槽连接时不同的既然信号和插槽可以连接那么他们应该可以断开,如下: 1. disconnect(lcd, SIGNAL(overflow(),2. this, SLOT(handleMathError();复制代码一个简单的例子: 1. class Employee : public QObject2. 3. Q_OBJECT4. public:5. Employe

21、e() mySalary = 0; 6. int salary() const return mySalary; 7. public slots:8. void setSalary(int newSalary);9. signals:10. void salaryChanged(int newSalary);11. private:12. int mySalary;13. ;14. void Employee:setSalary(int newSalary)15. 16. if (newSalary != mySalary) 17. mySalary = newSalary;18. emit

22、salaryChanged(mySalary);19. 20. 21.复制代码说明关键字 public slots:和signals他们用于修饰插槽函数和信号函数至于信号的反射通过关键字 emit来实现通过本文基本掌握了QT的信号插槽机制QT学习笔记-5.QT容器和算法本文涉及QT中的容器对象系列一容器QVector类似stl中的vector插入尾部数据速度很快基本例子如下:QVector vect(3);vect0 = 1.0;vect1 = 0.540302;vect2 = -0.416147;这样也可以QVector vect;vect.append(1.0);vect.append(0

23、.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.Queue QT的队列模板7.QMap基本操作如下:QMap map;map.insert(eins, 1);map.insert(sieben, 7);map.inse

24、rt(dreiundzwanzig, 23);当然也可以这样插入数据mapeins = 1;mapsieben = 7;mapdreiundzwanzig = 23;但是这样做有一个问题那就是会生成空值为了不出现这样的结果可以使用成员函数value()来代替来获取数据,如果对于键不存在则返回默认的对象值8.QHash 使用散列存储键值对二通用算法需要说明的是QT中的容器是stl风格的,这意味着可以使用Stl中的算法。当然在QT库中QtAlgorithm文件包含了基本的算法模板主要的函数有qFind-查找给定元素在容器中的位置类似std:findqBinaryFind - 类似qFind 需要查

25、找元素有序排列qFill-类似std:fill 使用给定元素填充容器qCopy,qSort.qDeleteAll-函数对容器中的每个元素做删除处理基本的容器和算法就这么多了其实熟悉stl的话学习这个上手很快的QT学习笔记-6.QApplication和基本控件的使用接上文,这篇学学QT中基本控件的使用和QApplication对象1.什么是QApplication?文档说明:The QApplication class manages the GUI applications control flow and main settings.Application类管理GUI程序控制流和主要参数设

26、置QApplication继承于QCoreApplication。后者提供了控制台程序的事件流2.基本控件的使用例子:#include #include #include #define QT_HTMLQLabel* label = NULL;void initlabel()#ifndef QT_HTML label = new QLabel(Hello Qt!);#else label = new QLabel(HelloQt!);#endif /! set size label-setBaseSize(64,48); /! set alignment label-setAlignment(

27、Qt:AlignHCenter); /! sht background color QColor bk(100,100,125); QPalette palette(bk); label-setPalette(palette);int main(int argc, char *argv) QApplication app(argc, argv); app.setApplicationName(QT Test); initlabel(); label-show(); return app.exec();QLabel是QT中的标签控件它具有控件的一般属性比如设置大小setBaseSite,设置对齐

28、格式,当然也可以设置背景色或者图片-这都是通过QPalette调色板来实现的需要说明的是QT中的控件文本可以使用Html语法的文本来操作具体如上。那觉这个功能比较给力!3.那么什么是QPalette?QPalette负责控制控件状态的颜色组-注意是控件状态。那么对一个控件每个状态的颜色都可以是不一样的咯至于QPalette的详细功能和使用方法以后需要的时候再看吧4.基本的信号链接使用例子#include #include int main(int argc, char *argv) QApplication app(argc, argv); QPushButton *button = new

29、QPushButton(Quit); /! when click button, app exit. QObject:connect(button, SIGNAL(clicked(),&app, SLOT(quit(); button-show(); return app.exec();5.一个复杂点的例子#include #include #include #include #include int main(int argc, char *argv) QApplication app(argc, argv); QWidget* widget = new QWidget; QIcon ico

30、n(config.png); widget-setWindowIcon(icon); widget-setWindowTitle(Using QT); QSlider* slider = new QSlider(widget); slider-setRange(0,99); QSpinBox* spinbox = new QSpinBox(widget); spinbox-setRange(0,99); widget-show(); return app.exec();编译运行可以看出QWidget中默认的布局管理器是竖直向下排列的在QT中可以通过setWindowIcon来设置窗体图标通过s

31、etWindowTitle设置窗体标题6.加上布局管理器和信号连接的话代码大致应该是这个样子 1. #include 2. #include 3. #include 4. #include 5. #include 6.7. int main(int argc, char *argv)8. 9. QApplication app(argc, argv);10. QWidget* widget = new QWidget;11. QIcon icon(config.png);12. widget-setWindowIcon(icon);13. widget-setWindowTitle(Using

32、 QT);14.15. QSlider* slider = new QSlider(widget);16. slider-setRange(0,99);17.18. QSpinBox* spinbox = new QSpinBox(widget);19. spinbox-setRange(0,99);20.21. QHBoxLayout* layout = new QHBoxLayout;22. layout-addWidget(spinbox);23. /! adjust sliders direction24. slider-setOrientation(Qt:Horizontal);25

33、. layout-addWidget(slider);26.27. spinbox-setValue(28);28.29. /! connect signals and slots30. QObject:connect(spinbox, SIGNAL(valueChanged(int),slider,SLOT(setValue(int);31. QObject:connect(slider,SIGNAL(valueChanged(int),spinbox,SLOT(setValue(int);32.33. widget-setLayout(layout);34. widget-show();3

34、5. return app.exec();36. 复制代码需要说明的是在这里QSlider,QPinBox控件是互动编译程序并运行界面如下: 2011-6-30 09:29 上传下载附件 (14.46 KB) 这是关于QT的第六篇笔记总结下吧QT功能还是很强大贴心的比较容易上手不过有2点我感觉不大舒服的地方是对这个变量命名格式有点不大喜欢比如setValue我喜欢写成SetValue.仅此而已QT学习笔记-7.QString和QByteArray1.QString在c+标准库中有2种类型的字符串char*和std:stringQT则提供了对象QStringQString除了具备字符串对象一般功

35、能函数之外还提供了自己特有的功能比如:str.sprintf(%s %.1f%, perfect competition, 100.0); -格式化输出当然也可以使用匿名形式str = QString(%1 %2 (%3s-%4s).arg(permissive).arg(society).arg(1950).arg(1970);%1,%2,%3是占位符另外QString还提供了一系列类型类型装换函数比如:str = QString:number(59.6);str.setNum(59.6);当然还有其他功能下面是具体的测试例子:#include #include #include int m

36、ain(int argc, char *argv) QCoreApplication a(argc,argv); QString str; str.append(Hello QT); qDebug()str.left(3); qDebug()str.right(3); qDebug()str.mid(2,2); qDebug()str.mid(2); qDebug()str.indexOf(QT); qDebug()str.startsWith(Hello); qDebug()str.toLower(); str.replace( ,O(_)O); qDebug()str; str.inser

37、t(0,.); qDebug()str; str.remove(0,3); qDebug()str; str = QString(%1%2%3).arg(1).arg(2).arg(3); qDebug()str; return a.exec();当然还有其他它功能2.QByteArrayQByteArray是比特数组为了掌握它的基本功能还是测试下功能大致就知道了#include #include #include int main(int argc, char *argv) QCoreApplication a(argc,argv); QByteArray arr; arr.append(1

38、23); qDebug()arr.at(2); arr = lotst ofnwhitespacern ; qDebug()arr; qDebug()arr.simplified(); qDebug()arr; arr.chop(3); qDebug()arr; qDebug()arr.count(); qDebug()arr.isEmpty(); qDebug()arr.isNull(); arr.fill(244,10); qDebug()arr; return a.exec();QT学习笔记-8.查找文件对话框只所以选择这个QT自带的例子有2个原因1是界面简单容易理解2是当点击more按

39、键会动态改变窗体出现高级选项(我想知道这个是如何做到的)基本代码如下: 1. #ifndef FINDDIALOG_H2. #define FINDDIALOG_H3.4. #include 5.6. QT_BEGIN_NAMESPACE7. class QCheckBox;8. class QDialogButtonBox;9. class QGroupBox;10. class QLabel;11. class QLineEdit;12. class QPushButton;13. QT_END_NAMESPACE14.15. class FindDialog : public QDial

40、og16. 17. Q_OBJECT18.19. public:20. FindDialog(QWidget *parent = 0);21.22. private:23. QLabel *label;24. QLineEdit *lineEdit;25. QCheckBox *caseCheckBox;26. QCheckBox *fromStartCheckBox;27. QCheckBox *wholeWordsCheckBox;28. QCheckBox *searchSelectionCheckBox;29. QCheckBox *backwardCheckBox;30. QDial

41、ogButtonBox *buttonBox;31. QPushButton *findButton;32. QPushButton *moreButton;33. QWidget *extension;34. ;35.36. #endif37.38. .cpp39. #include 40. #include finddialog.h41.42. FindDialog:FindDialog(QWidget *parent)43. : QDialog(parent)44. 45. label = new QLabel(tr(Find &what:);46. lineEdit = new QLi

42、neEdit;47. /! 这个成员函数的作用是当点击控件快捷键则把响应发送到Buddy控件48. label-setBuddy(lineEdit);49.50. caseCheckBox = new QCheckBox(tr(Match &case);51. fromStartCheckBox = new QCheckBox(tr(Search from &start);52. fromStartCheckBox-setChecked(true);53.54. findButton = new QPushButton(tr(&Find);55. findButton-setDefault(t

43、rue);56.57. moreButton = new QPushButton(tr(&More);58. moreButton-setCheckable(true);59.60. /moreButton-setAutoDefault(false);61.62. /! 又是对话框按钮盒,不过这次使用和上次有点区别 其子按钮是加上去的63. buttonBox = new QDialogButtonBox(Qt:Vertical);64. buttonBox-addButton(findButton, QDialogButtonBox:ActionRole);65. buttonBox-add

44、Button(moreButton, QDialogButtonBox:ActionRole);66.67. extension = new QWidget;68.69. wholeWordsCheckBox = new QCheckBox(tr(&Whole words);70. backwardCheckBox = new QCheckBox(tr(Search &backward);71. searchSelectionCheckBox = new QCheckBox(tr(Search se&lection);72.73. /! 绑定时间(需要注意的是SINGLA,SLOT中的函数必须

45、是形式完备的)74. connect(moreButton, SIGNAL(toggled(bool), extension, SLOT(setVisible(bool);75.76. /! 扩展控件部分(使用QVBox布局)77. QVBoxLayout *extensionLayout = new QVBoxLayout;78. extensionLayout-setMargin(0);79. extensionLayout-addWidget(wholeWordsCheckBox);80. extensionLayout-addWidget(backwardCheckBox);81. e

46、xtensionLayout-addWidget(searchSelectionCheckBox);82. extension-setLayout(extensionLayout);83.84. /! 文本框和搜索键85. QHBoxLayout *topLeftLayout = new QHBoxLayout;86. topLeftLayout-addWidget(label);87. topLeftLayout-addWidget(lineEdit);88.89. /! 辅助控件组90. QVBoxLayout *leftLayout = new QVBoxLayout;91. leftL

47、ayout-addLayout(topLeftLayout);92. leftLayout-addWidget(caseCheckBox);93. leftLayout-addWidget(fromStartCheckBox);94. leftLayout-addStretch(1);95.96. /! 主布局使用格子管理器97. QGridLayout *mainLayout = new QGridLayout;98. /! 设置大小不能更改99. mainLayout-setSizeConstraint(QLayout:SetFixedSize);100. /! 把LeftLayout管理

48、器放在左上角即0,0位置处101. mainLayout-addLayout(leftLayout, 0, 0);102. mainLayout-addWidget(buttonBox, 0, 1);103. mainLayout-addWidget(extension, 1, 0);104. setLayout(mainLayout);105.106. setWindowTitle(tr(Extension);107.108. extension-setVisible(false);109. 复制代码需要说明的是#include 是包含所有的GUI控件头文件我们不再需要#include #include 不过看看代码还真应了那句话复杂界面都是布局管理器堆积出来的另外注意这句话mainLayout-addWidget(extension, 1, 0);把extension放在格子管理器的1,0位置如果注销掉这句

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论