• 1. QT开发培训2011年2月
  • 2. 一、Qt的整体介绍 二、开发入门 三、插件平台使用 四、编程规范及STL应用主 要 内 容
  • 3. Qt的整体介绍 QT是挪威TROLLTECH公司开发的跨平台C++工具,在UNIX下非常出名;他的宗旨是“一次编码到处编译”与JAVA的“一次编译到处运行”有着本质的区别,作为跨平台开发工具,他的运行速度非常的快(因为他不需要虚拟机的支持),开发的GUI非常漂亮(有人认为比VISUAL C++强的多,而且简单)。
  • 4. 优良的跨平台特性: Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。 支持平台
  • 5. 面向对象 Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单。
  • 6. 其他特性丰富的 API Qt 包括多达 250 个以上的 C++ 类,还替供基于模板的 collections, serialization, file, I/O device, directory management, date/time 类。甚至还包括正则表达式的处理 功能。 支持 2D/3D 图形渲染,支持 OpenGL 大量的开发文档 XML 支持
  • 7. Qt的授权是分为两条线,商业版和开源版。如果使用商业版的Qt,那么开发出的程序可以是私有的和商业的;如果使用的是开源版的Qt,由于其使用的是GPL(GNU通用公共许可)协议(不是LGPL),那么可发出的程序也必须是GPL的。 QT授权
  • 8. Qt的历史以及与其他开源项目的关系Qt最初由Haavard Nord(Trolltech的CEO)和Eirik Chambe-Eng(Trolltech的总裁)开发。他们在挪威科技学院的计算机科学硕士学位。 1990年, Haavard 和Eirik 因为一个超声波图像方面的C++数据库应用程序在一起工作,这个系统要求在Unix, Macintosh, windows上运行,他们萌发开发一个“面向对象的显示系统”。 1991年,开始设计,提出了信号/槽的设想。 1993年,开发出了qt的第一个图形核心。 1994年,艰难的一年,幸好得到家人的支持。选择Q作为类的前缀(在Emacs字体中看起来特别漂亮),t代表(toolkit)。同年建立公司,最初为“Quasar Technologies” ,后更名为“Troll Tech”,现为“Trolltech”。中文名为“奇趣科技”。 1995年,签订了第一个合同,走上了快速发展的道路。
  • 9. 日期 win/x11 1996 1.0 1999 2.0 2001 3.0 2005 4.0 现在 4.4.4 ?Qt版本
  • 10. 在 Unix 的图形界面一向是以 MIT 的 X Window 系统为标准, 可是在商业应用上有两大流派,一派是以 Sun 公司领导的 Openlook 阵营,一派是 IBM/HP 领导的OSF (Open Software Foundation) 的 Motif, 双方经过多年竞争之后, Motif 最终胜出,成为最普遍使用的界面库, 后来双方又妥协出一个 CDE(Common Desktop Enviroment) 作为一个标准的图形界面。 但是 Motif/CDER 的价格非常昂贵,在这同时微软的 Windows 图形界面发展速度非常快,而 Unix 界的后起之秀 Linux 也急需一个可靠并且免费的图形界面。 KDE/qt与GNOME /gtk的战争
  • 11. 1996 年 10 月,由开发图形排版工具Lyx的德国人 Matthias Ettrich 发起了 KDE 计划。 KDE 的全称为 K Desktop Environment,可以看出是针对 CDE。 KDE 本身 是采用 GPL 宣言的,但是 KDE 却是使用 Qt 来作为其底层库,因为当时 Qt 已经将其 Unix 版本自由发布了,但是 Qt 并不遵循 GPL, 因此 KDE 被很多自由软件的作者攻击,认为利用非自 由软件开发违背了 GPL 的精神,于是 GNU 的狂热信徒兵分两路,一路是去制作 Harmonny,试图重写一套兼容于 Qt 的替代品,另一路是由一个 26 岁的墨西哥程序员 Miguel De Icaza 领导 下重新开发一套叫 GNOME(GNU Network Object Enviroment)来替代 KDE。 KDE/qt与GNOME /gtk的战争
  • 12. 由于 Linux 界的老大 RedHat 不喜欢 KDE/Qt 的版权,因此 RedHat 甚至专门派出了几个全职程序员来加入 GNOME 进行开发工作,于是一场同 Motif VS Openlook 相似的圣战就这么打起来了。 Trolltech 为了 KDE 曾数次修改 Qt 的版权,从成立 KDE Free Qt 基 金会到采用 QPL,可谓是费尽心机,但是 GNOME 采用的 GTK 一开始就是完全的 GPL,因此在这个方 面 GNOME 有一定的优势,加上 Qt/KDE 采用 C++ 开发,入门的门槛比较高,而 GTK/Gnome 采用 C, 因此 GNOME 吸引了更多的自由软件开发者,但是 KDE 毕竟先走了一步, 推出的 KDE1.1.2 十分稳定, 而当时急忙中推出的 GNOME1.0 的系统稳定性奇差,有人甚至笑称 GNOME1.0 还没有 KDE 1.0 Alpha 稳定。但是 GNOME 后来发展比较快,大有迎头赶上的势头。当时双方的开发者在网络 上炒得天翻地覆,连 Linux 之父 Linus 只是说了一句喜欢用 KDE 都倍受指责。 KDE/qt与GNOME /gtk的战争
  • 13. 战争到了第三个年头,也就是2000年,可谓是风云突变,一个接一个重大的事件先后发生: 首先是一批从 Apple 公司出来的工程师成立了一个叫 Eazel 的公司替 GNOME 设计界面,然后是一批 GNOME 程序员成立了一个 Helix Code 公司替 GNOME 提供商业支持,而大家期待以久的 KDE 2.0 也终于发布了,这恐怕是目前最为庞大的自由 软件了之一, 除了 KDE 本身,还包括 Koffice 套件,和集成开发环境 Kdevelop 等等大批软件,其主力软件 Kounqueror 也是第一个可以同微软的 Internet Exploer 相抗衡的浏览器。 而 Sun 公司,Red Hat 公司, Eazel 公司,Helix Code 等一批公司成立了一个GNOME 基金会, Sun 还宣布将把重量级办公软件 Star office 同 GNOME 集成, Trolltech 公司自然不能坐以 待毙,于今年 10 月 4 日将 Qt 的 free edition 变为 GPL 宣言,彻底解决了 KDE 的版权问题, 又推出了嵌入式 Qt ,给了 GNOME 阵营一个有力的回击。 KDE/qt与GNOME /gtk的战争
  • 14. 到现在为止,这场战争还在继续,相信我们不能很快看到结果。一般说来, 目前 GNOME 吸引的公司比较多,但是 KDE/Qt 的开发的效率和质量比 GNOME 高,而且在 Office/嵌入式 环境中先走一步,在一定时间内还将处于优势地位。 那么对于用户来说,如何在 Qt/GTK 中作出选择呢?一般来说,如果用户使用 C++,对库的稳定性,健壮性要求比较高,并且希望跨平台开发的话,那么使用 Qt 是较好的选择, 但是值得注意的是,虽然 Qt 的 Free Edition 采用了 GPL 宣言,但是如果你开发 Windows 上的 Qt 软件或者是 Unix 上的商业软件,还是需要向 Trolltech 公司支付版权费用的。KDE/qt与GNOME /gtk的战争
  • 15. Qt应用软件的整体结构基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。
  • 16. QtQObjectQBrushQPainterQEventQApplicationQLayoutQWidgetQButtonQDialogQFrameQLabelQScrollViewQTextEditQToolBarQStatusBarQt应用软件的整体结构
  • 17. 开发入门Qt常用开发工具 Qt开发的主要类介绍 信号与槽机制 窗口布局 QGraphview(二维图层管理绘图) OPenGL(三维显示)
  • 18. Qt Designer(设计界面) VS2005 (Windows环境下,编辑,调试,编译) Gcc (Linux环境下)Qt常用开发工具
  • 19. Qt常用开发工具一、Qt Designer Qt Designer是一个GUI工具,它可以帮助我们加快写Qt程序的速度。利用Qt Designer,我们可以用一种所见既所得的方式,来生成Qt程序的GUI界面代码。
  • 20. Qt常用开发工具
  • 21. Qt常用开发工具二、VS2005 Windows系统下一款基于C++的强大的可视化开发工具。
  • 22. Qt常用开发工具1、Qt与VC2005的联合开发
  • 23. Qt常用开发工具2、由Qt工程生成Vs工程 打开cmd,切换到Qt工程目录下,输入命令:qmake –t vcapp。 然后就可以像开发一般的VC程序一样,在VC环境下进行开发了。 需要注意的是,如果修改了Qt工程,则必须用qmake命令重新生成相应的VC工程。
  • 24. Qt常用开发工具三、Gcc Linux下一款常用的C++编译器。 一般情况下,我们都先在Windows下进行编码、调试,成功之后再移植到Linux下用Gcc进行调试、编译。
  • 25. Qt开发的主要类介绍QtQObjectQBrushQPainterQEventQApplicationQLayoutQWidgetQButtonQDialogQFrameQLabelQScrollViewQTextEditQToolBarQStatusBar
  • 26. Qt程序基本结构#include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton *button = new QPushButton("Quit", 0); QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit())); app.setMainWidget(button); button->show(); return app.exec(); }
  • 27. QPainter在窗口上绘图的接口Qt类一方面是Qt所有其他类的基类,另一方面在内部定义的其他类共用的常量QBrush QPen绘图的辅助类,分别定义绘图的填充方式以及线条绘制方式QPixmap基于象素、与显示无关的绘图设备,可以和QImage、QBitmap配合实现图片的生成等
  • 28. QEvent所有其他事件类的基类。其子类包含鼠标事件QMouseEvent、键盘事件QKeyEvent、计时器时间QTimerEvent等等QCursor定义鼠标显示的外观
  • 29. QObject该类从Qt类继承,同时作为大量类的基类。Qt中的信号和槽机制是以该类为基础的,所有需要用到信号和槽的类都需要从该类继承,并且遵循一定的规则。另外,时间、计时器和国际化等功能都是以该类为基础的QApplication该类从QObject类继承,管理GUI程序的基本设置以及交互。通过该类可以控制窗口的显示风格,以及设置语言翻译等等
  • 30. QLayout窗口布局的基类,其各种子类提供了网格、横向、纵向等各种具体的布局方案。该类系列可以根据窗口的大小,自动设置各控件在窗口中的大小和布局,极大的简化界面代码的编写。QWidget所有窗口类的基类。提供了所有窗口共用的诸多接口函数,类似于MFC中的CWnd类
  • 31. QGLWidget在该窗口上渲染OpenGL图像。提供了OpenGL的基本配置,以及OpenGL程序的基本框架,用户只需要在适当的位置编写渲染代码即可显示OpenGL图像QGraphView用于显示Qgraphsene(画布)的窗口类。画布是Qt提供的、基于图元的绘图接口,是一种高层次的绘图手段QPopupMenu弹出菜单类。一个该类的对象对应一个弹出菜单。可以通过该类编写以及显示弹出菜单
  • 32. QPushButton, QDialog, QComboBox, QScrollBar, QStatusBar提供了各种窗口控件(按钮、对话框等)的接口
  • 33. 窗口部件的使用概述 所见即所得方式开发窗口部件 代码实现方式开发窗口部件
  • 34. 窗口部件的使用一、概述 打开Qt Designer,可以看到左边有一个ToolBox,这里面有大多数的窗口部件。这些窗口部件被分为许多类型,放在不同的组里面(这些组由ToolBox中不同的标签分开)。利用ToolBox,我们可以以所见即所得的方式,便捷的开发出用户需要的UI界面。 其他一些不能由所见即所得方式开发的窗口部件,如FileDialog等,需要代码实现。
  • 35. 窗口部件的使用二、所见即所得方式开发窗口部件 1、ListBox 在ToolBox中,选中Views标签,可以看到一个ListBox按钮。点下ListBox按钮,然后在中间工作区中的UI界面中选择放置的位置,并调整大小。这样就可以生成一个ListBox了。
  • 36. 窗口部件的使用
  • 37. 窗口部件的使用2、ListView 生成方法同ListBox,同样是在Views标签中。
  • 38. 窗口部件的使用3、IconView(同上)
  • 39. 窗口部件的使用4、其他 包括PushButton、RadioButton、CheckButton、TextEdit、LineEdit、TextLabel等等。其生成方法同上。
  • 40. 窗口部件的使用三、代码实现方式开发窗口部件 1、文件对话框 最简单的方法是使用QFileDialog类的静态函数来创建一个文件对话框。 如果想要创建一个打开文件对话框,则调用QFileDialog::getOpenFileName函数;如果想要创建一个保存文件对话框,则需要调用QFileDialog::getSaveFileName函数。 函数具体参数请查阅帮助文档。
  • 41. 窗口部件的使用打开文件对话框: QString fileName = QFileDialog::getOpenFileName( QString::null, "Model(*.mdl);;All(*.*)", this, "DlgOpenFile", tr( "打开文件" ) ); 保存文件对话框: QString fileName, suffix; fileName=QFileDialog::getSaveFileName( QDir::currentDirPath(), "Model(*.mdl);;All(*.*)", this, "DlgSaveFile", tr( "保存文件" ), &suffix );
  • 42. 窗口部件的使用2、颜色对话框 想要生成一个颜色对话框,可以使用QColorDialog类的静态函数getColor()。 QColor color = QColorDialog::getColor( QColor( "steelblue" ), this, "DlgSetSurfaceColor" );
  • 43. 窗口部件的使用3、消息框 根据不同的需求,使用QMessageBox类的静态函数information()、warning()等,可以生成不同类型的消息框。 QMessageBox::information( this, “提示”, “操作成功!” ); QMessageBox::warning( this, “警告”, “除数不能为0!” );
  • 44. 窗口部件的使用4、其他 其他如打印设置对话框、字体设置对话框、进度条框等,都是属于这一类窗口部件。这类窗口部件,在Qt里面都有一个类与其对应(如QFileDialog对应文件对话框)。我们只需要参照帮助文档正确的使用这些类,就可以创建出我们需要的窗口部件了。
  • 45. 信号(signal)和槽(slot)类似于windows中的消息和消息响应 都是通过C++类成员函数实现的 信号和槽是通过连接实现相互关联的 包含信号或槽的类必须从QObject继承信号与槽机制
  • 46. 信号(signal)和槽(slot)——声明class Employee : public QObject { Q_OBJECT public: Employee(); int salary() const; public slots: void setSalary(int newSalary); signals: void salaryChanged(int newSalary); private: int mySalary; }; emit salaryChanged(50);信号与槽机制
  • 47. 信号(signal)和槽(slot)——连接 connect(sender, SIGNAL(signal), receiver, SLOT(slot));一个信号可以连接多个槽,这些槽被调用的顺序是随机的connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int))); connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateStatusBarIndicator(int)));信号与槽机制
  • 48. 信号(signal)和槽(slot)——连接一个槽可以连接多个信号,每个信号都可以触发该槽connect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError())); connect(calculator, SIGNAL(divisionByZero()), this, SLOT(handleMathError()));信号与槽机制
  • 49. 信号(signal)和槽(slot)——连接信号之间可以相互连接,相互连接的信号会相互触发槽和槽之间不能相互连接connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &)));信号与槽机制
  • 50. 信号(signal)和槽(slot)——连接信号和信号、信号和槽之间在运行时连接,而且可以在运行时取消连接;Qt会在适当的时候自动取消连接,所以一般没有必要手动取消连接connect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError())); disconnect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));信号与槽机制
  • 51. 信号(signal)和槽(slot)——连接信号和槽需要具有相同的参数列表;如果信号的参数比槽多,那么多余的参数会被忽略;如果参数列表不匹配,Qt会产生运行时错误信息connect( ftp, SIGNAL(rawCommandReply(int, const QString&)), this, SLOT(processReply(int, const QString&))); connect( ftp, SIGNAL(rawCommandReply(int, const QString&)), this, SLOT(checkErrorCode(int)));信号与槽机制
  • 52. 窗口布局基本布局 MainWindow窗口的窗口布局 对话框的窗口布局 分裂器(spliter) 窗口部件栈 滚动视图 锚接窗口 多文档界面
  • 53. 窗口布局一、基本布局 <一> MainWindow窗口的窗口布局 MainWindow窗口的布局包括菜单栏、工具栏、工作区、状态栏。工具栏工作区状态栏菜单栏
  • 54. 窗口布局1、菜单栏 创建菜单栏的步骤: (1).创建QAction对象; (2).QAction对象添加到QPopupMenu对象中; (3).将QPopupMenu对象添加到QMenuBar对象中; (4).用connect函数为QAction对象设置响应函数。
  • 55. 窗口布局(1).创建QAction对象 QAction *fileNewAction = new QAction( this, “fileNewAction" ); fileNewAction-> setIconSet( QIconSet( QPixmap::fromMimeSource( “FileNew.png” ) ) ); //设置图标 fileNewAction->setText( tr( “新建” ) ); //状态信息 fileNewAction->setMenuText( tr( “新建...” ) );//菜单文本 fileNewAction->setAccel( tr( “Ctrl+N” ) ); //设置快捷键
  • 56. 窗口布局(2).QAction对象添加到QPopupMenu中 QPopupMenu *fileMenu = new QPopupMenu(this); fileNewAction->addTo(fileMenu); (3).QPopupMenu对象添加到QMenuBar中 QMenuBar *menuBar = new QMenuBar(this,“menuBar"); menuBar->insertItem( tr( "文件" ), fileMenu, 1 );
  • 57. 窗口布局(4).为QAction对象设置响应函数 利用connect函数(connect函数具体介绍见“信号与槽机制”部分): connect( fileNewAction, SIGNAL( activated() ), this, SLOT( fileNew() ) ); …… void MainWindow::fileNew() {……}
  • 58. 窗口布局2、工具栏 创建工具栏的步骤: (1).创建QAction对象; (2).将QAction对象添加到QToolBar对象中。
  • 59. 窗口布局(1).创建QAction对象 QAction对象在创建菜单栏时已经生成,这里直接使用。 (2).将QAction对象添加到QToolBar中 QToolBar *toolBar = new QToolBar( QString(""), this, DockTop ); fileNewAction->addTo(toolBar);
  • 60. 窗口布局3、工作区 工作区的布局要根据实际需求来定。比如,如果希望做的是一个画图程序,工作区就应该是一个CanvasView;如果希望做一个文本编辑程序,工作区就应该是一个TextEdit,等等。很多时候,工作区也可以由多个部分组成(此时其布局方法跟对话框的布局相同)。
  • 61. 窗口布局4、状态栏 对于MainWindow窗口,Qt会自动生成一个状态栏。因此只需要调用MainWindow的statusBar()函数,得到该状态栏的指针就可以了。 QStatusBar *statusBar = statusBar();
  • 62. 窗口布局 对于状态栏,如果用户不加任何处理,Qt会有默认的显示信息。如果用户需要让其显示自己的信息,则要在状态栏上添加一个窗口(widget),然后在这个窗口上显示信息。 QLabel *statusLabel = new QLabel( “Hello", this ); statusBar->addWidget(statusLabel);
  • 63. 窗口布局<二>对话框的窗口布局 对话框(以及MainWindow窗口中的工作区)的窗口布局情况随实际需求的不同而不同。在大多数情况下,对话框都需要借助Layout来进行布局。 Layout分为垂直Layout、水平Layout和网格化Layout。此外,Layout可以组合使用,以实现任意的布局。
  • 64. 窗口布局1、垂直Layout 可以让子窗口在该Layout中垂直排列。首先,创建一个QVBoxLayout对象,然后按顺序调用addWidget()函数,将子窗口加入到该Layout里面去。
  • 65. 窗口布局QVBoxLayout *vLayout = new QVBoxLayout(this); QLabel *label = new QLabel( "Label", this ); vLayout->addWidget(label); QLineEdit *edit = new QLineEdit(this); vLayout->addWidget(edit); QPushButton *button = new QPushButton( "button", this ); vLayout->addWidget(button);
  • 66. 窗口布局2、水平Layout 可以让子窗口在该Layout中水平排列。此时,应该先创建一个QHBoxLayout对象,然后的操作同垂直Layout。
  • 67. 窗口布局3、网格化Layout 可以以网格的形式进行窗口布局。这要用到QGridLayout类,操作与垂直Layout、水平Layout相似。不过在创建QGridLayout对象时,必须指定网格的行数和列数,在调用addWidget()函数时,也必须指定子窗口所放位置的行号和列号。另外,还可以调用函数addMultiCellWidget() 添加跨越多个网格单元的子窗口。
  • 68. 窗口布局下面是一个二行三列的网格化Layout的例子: QGridLayout *gridLayout = new QGridLayout(this, 2, 3); QLabel *label1 = new QLabel( "Label1", this ); gridLayout->addWidget( label1, 0, 0 ); //0行0列
  • 69. 窗口布局QLineEdit *edit1 = new QLineEdit(this); gridLayout->addWidget( edit1, 0, 1 ); //0行1列 QLabel *label2 = new QLabel( "Label2", this ); gridLayout->addWidget( label2, 1, 0 ); //1行0列 QLineEdit *edit2 = new QLineEdit(this); gridLayout->addWidget( edit2, 1, 1 ); //1行1列 QPushButton *button = new QPushButton( "button", this ); gridLayout->addMultiCellWidget( button, 0, 1, 2, 2 ); //跨越0行2列、1行2列两个网格单元的窗口
  • 70. 窗口布局4、组合使用Layout 组合使用Layout,其实质就是将子Layout作为子窗口放到父Layout里面去。方法是创建Layout时,为其指定父Layout。
  • 71. 窗口布局QVBoxLayout *parentLayout = new QVBoxLayout(this); QHBoxLayout *childLayout = new QHBoxLayout(parentLayout); //指定父Layout QLabel *label = new QLabel( "Label", this ); childLayout->addWidget(label); QLineEdit *edit = new QLineEdit(this); childLayout->addWidget(edit); QPushButton *button = new QPushButton( "button", this ); parentLayout->addWidget(button);
  • 72. 窗口布局二、分裂器(Splitter) 分裂器是一个可以包含其他窗口并且使用分裂柄分隔它们的窗口部件。用户可以拖动分裂柄来改变分裂器的子窗口的大小。分裂器本身也可以作为其他分裂器的子窗口。 Qt使用QSplitter来支持分裂器,QSplitter的子窗口将会被自动按照被创建的顺序一个挨一个的放在一起,分裂柄在相邻的窗口中间。
  • 73. 窗口布局Splitter的实例:
  • 74. 窗口布局实现: //父Splitter: QSplitter *s1 = new QSplitter( QSplitter::Vertical, 0 ); //子Splitter(上): QSplitter *s2 = new QSplitter( QSplitter::Horizontal, s1 ); TestWidget *t1 = new TestWidget(s2); //左上窗口 TestWidget *t2 = new TestWidget(s2); //右上窗口 //子Splitter(下): QSplitter *s3 = new QSplitter( QSplitter::Horizontal, s1 ); TestWidget *t3 = new TestWidget(s3); //左下窗口 TestWidget *t4 = new TestWidget(s3); //中下窗口 TestWidget *t5 = new TestWidget(s3); //右下窗口
  • 75. 窗口布局三、窗口部件栈 窗口部件栈QWidgetStack包含一组子窗口或称为“页”,并且每次只显示一个,而把其他的都隐藏起来。在QWidgetStack中,用id号来标识每一个子窗口。
  • 76. 窗口布局窗口部件栈的实现: 创建 QWidgetStack *ws = new QWidgetStack; 添加子窗口 ws->addWidget( widget, id ); 删除子窗口 ws->removeWidget(widget); 切换当前可见的子窗口 ws->raiseWidget(id);
  • 77. 窗口布局四、滚动视图 QScrollView类提供了一个可以滚动的视窗、两个滚动条和一个“角”窗口部件。如果我们想在一个窗口中添加滚动条,直接使用QScrollView比我们自己添加QScrollBar并且实现滚动功能要简单得多。
  • 78. 窗口布局 使用QScrollView最简单的方式是直接对我们要添加滚动条的窗口部件调用addChild()。 例: QScrollView *sv = new QScrollView; TestWidget *t = new TestWidget; sv->addChild(t); //视窗
  • 79. 窗口布局五、锚接窗口 锚接窗口是可以锚接到锚接区域中的窗口。工具栏是锚接窗口的最常见的实例。锚接窗口
  • 80. 窗口布局 在Qt中,锚接窗口由QDockWindow类实现和管理。通过声明QDockWindow对象,就可以生成一个锚接窗口。一个空的锚接窗口什么都没有,需要向里面添加子窗口。
  • 81. 窗口布局在锚接窗口中添加单个子窗口 调用函数setWidget()。 在锚接窗口中添加多个子窗口 首先,调用函数boxLayout()得到一个Layout指针;然后调用该Layout的addWidget()函数就可以实现添加多个子窗口。
  • 82. 窗口布局六、多文档界面 在Qt中,实现多文档界面需要先声明一个QWorkSpace对象,这样就会生成一个空的工作区,然后在这个工作区里面创建多个子窗口,即实现了多文档。
  • 83. 窗口布局创建子窗口 在工作区中创建子窗口跟创建一般的窗口操作相同,只需要在声明窗口对象时将父窗口设置为工作区即可。 获得当前激活窗口 调用函数activeWindow() 。
  • 84. 插件平台的开发
  • 85.   谢  谢 !