在NOKIA reserch center做过的两个Qt项目,每个项目分别都做了三个版本,一个是QWidget体系版本,一个是QGraphicsWidget体系版本,一个则是Orbit版本。
首先解释下三者之间的关系:
①:QWidget体系是我们平时最常用的Qt体系,亦即其中所有使用的窗口类都是QWidget或其派生类!
②:QGraphicsWidget体系则是《c++ GUI Qt4编程(第二版)》中第8章8.4所讲的基于项的图形视图架构:
书上的称呼是:Qt的视图体系。
其主窗口MainWindow类框架的一般写法为:
//MainWindow.h
class MainWindow : public QGraphicsView
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QGraphicsScene * iScene;
};
//MainWindow.cpp
MainWindow::MainWindow(QWidget *parent): QGraphicsView(parent)
{
iScene = new QGraphicsScene();
//此处创建各个item项,并加入到上边创建的scene场景中。
this->setScene(iScene);
}
亦即:此时主窗口是一个view场景,而我们是在其中创建了并设置了一个含有很多item项的scene场景而已。
个人认为:官方教材对这部分讲解太多简略!就拿出一章的一节来讲解实在是不应该,理由是(希望不会牵扯商业机密,仅仅谈技术):Qt自从被NOKIA收购之后,大家都知道以后等到symbian4的时候:整个symbian OS框架都会抛弃原有复杂的AvKon框架,而转而使用Qt,但是这里使用的Qt并非通常意义上的Qt,它是对Qt再次进行了封装,添加了很多针对移动终端的新功能。而封装的基础则就是上边所说的场景视图体系!! 亦即:以后NOKIA主推的Qt开发技术就是使用上边所有的QGraphicsWidget体系的,而非我们平时常使用的QWidget体系!!
1:有人可能会问:为什么使用项视图这个QGraphicsWidget体系,而不用QWidget体系?这里边原因太多了,举个最简单的例子:在手机中当你横竖屏转换时,你肯定希望此时打开的应用程序也跟着横竖屏旋转。如果这个程序是一个Qt程序,则是指:Qt中的窗口需要可以旋转!! 对于这一点:QWidget是做不到的!亦即一个QWidget窗口无法实现旋转(顶多是上边刷的内容旋转,但是窗口本身不会旋转)! 但是QGraphicsItem则可以直接旋转!基于很多这样的理由,所以NOKIA选择了QGraphicsWidget体系。
2:也有人会问:你上边说每个项目都做了三个版本,这第三种版本是什么?其实这第三种版本就是以后symbian3 symbian4中所有的再次封装后的Qt,亦即:在GraphicsWidget体系基础上添加一些新功能封装后的新SDK。 这个东西SDK的内部代号叫Orbit,不知道对外发布时名称是什么,这里暂且就还是称呼它为Orbit吧。(我们当时开发的时候,Orbit也也还是在开发过程中,每天我们都要去服务器上版本控制拉下最新的版本来用)
3:等到了symbian3,手机中已经内置了Qt的库并做了优化,此时依旧可以使用symbian c++那一套来开发手机程序,也可以用Qt来开发,两者兼容。第一款symbian3手机N8马上就要上市了,已经出了宣传片了,前两天在组里玩过它的原型机,挺玄。 而等到了symbian4, symbian原本那一套AvKon框架就彻底废除了,只能用Qt来开发了!(这些消息是前段时间参加NOKIA在北航举办的Qt培训时:听NOKIA forum部门的人说的,所以好好学Qt还是很有前景的。)
基于以上原因,还是需要我们好好学学QGraphicsWidget体系的!!尤其是现在玩这一架构的人很少。
③:Orbit体系,正如上边所说,它是对QGraphicsWidget进行了再次封装之后,用于symbian3 symbian4的Qt版本!
总结:Qt主要分QWidget体系和QGraphicsWidget体系(视图体系),而Orbit则是对后者的再封装!!
===============================================================================
通过上边的介绍,大家初步了解了三者的关系,但是很多人会说了:我平时一直用的QWidget体系,现在转到QGraphicsWidget体系是不是很困难?是不是以前学的都没什么帮助了? 其实这个转换也不怎么困难。
首先:整个应用程序框架上边已经给出了,只不过变为场景视图项而已。
其次:其实在后者的场景中我们不仅仅可以添加Item项,更可以直接添加QWidget!!这样的话,我们平时开发完全可以还按照QWidget体系那一套来写,只不过最后将他们都挨个加到scene中即可!!!而添加QWidget是用scene的 addWidget函数!!这也是我平时开发时最常用的方式!!
虽然QGraphicsView继承自QWidget,但是这两种体系之间的区别非常非常大,以至于很多相同的操作在这两种架构下的设置方法都不一样! 这也是我们对一些问题进行探讨时候都要分这两种情况进行的原因!(比如:如何使QTextEdit背景透明? 这在这两种架构下设置方法是不一样的,详见文章http://blog.csdn.net/NRC_DouNingBo/archive/2010/05/09/5571088.aspx)