您的位置:首页 > 编程语言 > Qt开发

从零开始做3D地图编辑器(四)(基于QT与OGRE)

2010-07-10 15:42 218 查看
四、QT基本知识

回到QT,先在VS中新建一个QT Application,项目里面有几个目录:

1、 Form Files目录,它里面放的是使用QT designer制作的基于XML的布局文件,双击它就会自动进入QT designer。

2、 Generated Files目录,它里面放的是一些临时生成的文件,这些文件用来处理QT的信号和槽等机制。

3、 Resource Files目录,它里面放的是基于XML的资源文件,你可以在窗体里面使用它们。

4、 Header Files和Source Files这两个和VS默认是一样的。

理解了目录结构之后,先来试着写一个Hello World,先把除了main.cpp之外的所有文件移除(使用QT designer会提高制作效率,但是会让QT入门门槛变高)!打开main.cpp,仅保留以下代码:

]#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
return a.exec();
}


编译通过。运行没有任何反应,因为还没有往里面增加任何东西。

在代码中,Main函数是C语言的入口,之后申请的QApplication用来管理控制流和主要设置,这是核心,一定要保留。
按钮是GUI中最基本的一个控件,先看看怎么增加一个按钮。使用按钮控件必须先包含头文件:

]#include <QtGui/QPushButton>


然后在QApplication a(argc, argv);与return a.exec();中间插入下面代码:

]QPushButton button("hello");
button.setGeometry(100, 100, 300, 300);
button.show();


代码第一行是申请一个按钮,并把按钮的Caption标题设为HELLO,第二行表示这个按钮出现在屏幕坐标(100,100)的位置,宽高为(300,300),最后一行是显示这个按钮,你可以尝试把它去掉看看效果(官方助手里有QPushButton的更多资料,请自行查看)。

编译出来,发现屏幕上出现一个框,框里面有一个按钮,按钮可以点击,但是没有任何反应,因为还没有为这个按钮增加任何的槽(Slot)。在MFC对控件的处理一般是通过事件机制,而在QT中是使用信号(Signal)和槽(Slot)机制,其实你也可以把它理解为事件机制。

简单理解信号其实就是输入,而槽就是输出,拿按钮打比方,在一次点击中,这个点击,就是一个信号,而点击后的反馈,就是槽。

每一个控件都拥有一些默认的Signal和Slot,这些都可以在官方提供的助手中查看。

绑定Signal和slot是使用静态函数connect。函数原型是:

]Bool connect ( const QObject * sender,
const char * signal,
const QObject * receiver,
const char * method,
Qt::ConnectionType type = Qt::AutoConnection )


其中sender是发送者,而receiver是接收者,signal是信号,而method就是slot,type里面提供了几种绑定方式,可以详细查看助手。
先看一个例子,在上面代码中加入点击按钮后关闭应用程序的效果。很简单,只需要在

]button. setGeometry(100,100,300,300);


后面加入

]QObject::connect(&button, SIGNAL(clicked()), &a, SLOT(quit()));


编译运行,点击后窗体关闭。
这是使用默认槽的例子,有时候需要点击按钮之后执行自定义的效果,那么就需要使用自定义槽了。

下面是一个使用自定义Slot的例子,鼠标点击按钮之后,文本框文字会改变。
先加入一个QLabel控件,你先加入头文件:

]#include <QtGui/QLabel>


然后在connect前加入

]QLabel label("World");
label.setGeometry(50,50,300,300);


先尝试编译一下,结果label没有出现在窗体里面!它当然不会出现在窗体里面,因为我们只是对Button使用了Show()函数,尝试加入label.show(),结果出现了两个窗体,一个里面有按钮,另一个里面有一个label。那么怎么把它们放在一起呢?

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/vickylh/archive/2010/05/18/5603613.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: