2011年(4)
分类: C/C++
2011-01-17 12:03:28
你们的团队接到了一个任务,然后你把这个任务细分为具体的模块,然后你的组员们顺利的完成了你布置的任务。他们做好了模块,然后提交给你了。现在,轮到你把他们的模块合并成一个程序了……
这网网是很困难的,原因是:
1, 每个人所做的模块都有自己的界面,你在总的程序中要设计和定义好什么时候,在什么位置,谁的模块会生效?
2, 不同人的模块会有不同的功能和操作,你如何布置与此操作对应的按钮,这些按钮和时出现,何时被激活?
3, 怎么让他们的模块和主程序完美的融合,某个按钮的隐藏不会造成整个布局混乱?
4, 工程文件是混乱的么?是不是分不清哪里是谁做的?
所有的答案,就在QT设计师里,使用QT设计师的Promte to功能配合QT的强大信号和插巢功能,让你的类轻松自由的进化成你想要的样子,当然也可以进化成你的组员提交给你的模块……
我们以一个具体的工程来讲解:
A同学负责制作一个显示模块,这个模块是一个日历(随便定的,只是为了演示方便)
B同学负责制作一个统计模块,这个模块有一个计数器和一个数字输入框(QspinBox)
你来把这两个部分和在一起,不能影响布局的基础上尽量使界面美观。
首先是A同学的模块,我们很快就可以做好:
我们可以看到生成的工程是以Student_A的名字命名的,对应的类名,头文件(.h),源文件(.cpp)以及窗体(.ui)文件均是以stua_widget来命名。表示这个类是继承字Qwidget,由studentA负责开发。
然后就是托控件了,也很简单……
我们可以加一个布局(Qlayout),以适应拉伸或者压缩。
同理可以制作StudentB的模块:
跟刚才一样,这里不再赘述……
然后是主工程,由负责人CG创建:
首先建好工程:
然后是界面,可以使用一个QstackWidget以避免不同的模块与对应按钮之间互不干扰,一会还会在说……,是这个样子:
有人也许会问:啊?你放东西了么?为什么我什么也看不到?呵呵,如果你观察的够自己的话,就会发现右上角有一个向左右的箭头:其实我不仅放了一个QstackWidget,我还为这个Widget做了一个布局。不信你看:
这个StackWidget有两页,每个页都有自己的Qwidget,这个是非常科学的。因为所有的QT GUI类,包括窗体部件和QmainWindow都是直接或者间接的继承自Qwidget!而我们今天要做的就是让这两个Qwidget进化,进化为StudentA和StudentB制作的模块——也就是这个帖子的重点了:
首先我们要把StudentA和StudentB工作的成果添加到工程中来:
打开这个工程所在的文件夹,将StudentA和StudentB的工程(连文件夹一起拷贝过来):
然后在工程文件中添加需要的文件,
除了main.cpp不用添加以外(因为一个工程只能有一个main)其余看你的需要,如果你需要在主工程中也能编辑StudentA和StudentB的模块可以把Ui也添加进来(到时候CG工程在编译的过程中会重新生成ui_StudentA.h和 ui_StudentB.h,这是后话,不表……),于是就变成了这样:
我们可以看到,哪个文件,是谁写的在我们的工程中一目了然,并且也可编辑,由于文件存在于工程文件中,所以Gcc在编译的时候也会重新根据我们的更改来编译这些文件。
好了,终于到了今天最有趣的地方了,准备好享受编程的乐趣了么?
让我们的类进化吧!!!
第一步,选中pageone这个Qwidget,鼠标右键,promote to:
第二步,填入信息:
Base class就选择Qwidget
Promote to class要输入StudentA和StudentB在他们的头文件(.h)文件中定义的类名(不要敲错了哦!):
最后是头文件的位置:当然是Student_A文件夹下的stua_widget.h啊,因为那个文件就在那里呆着嘛(好像是废话……):
总之就是这样,先点Add按钮,一个可进化类就做好了,选中它点promote就行了:
哈哈,就这么简单,看看你原来是Qwidget的page变成什么了:
并且你一编译,就会奇迹般的发现StudentA做的日历已经乖乖的躺在你QstackWidget的page里啦:
同理可以在QstackWidget中加入B同学的模块,并且你可以在主工程中直接对A,B两位同学的模块进行修改。你做的改动会被Gcc编译器重新编译。(这主要是你可以在他们的类中写一些插巢,然后在你的类也就是cg_widget初始化的时候去绑定这些巢,这样就可以向A,B这两个类发送消息完成类之间的通信了,哈哈……
最后补充说点QstackWidget的页面切换吧:
使用这个代码可以在程序中去改变当前的页:
你可以在主面板上做一个按钮,通过绑定信号和插巢来分页来切换分页。当然插巢中应该有的代码,自然是上句啦,嘿嘿,好了,今天就说道这吧,好好利用这个功能,把大家的努力整合在一起,以更高效的进行开发,这个项目负责人应该掌握的,自己好好体会吧……