• 11190阅读
  • 2回复

【摘录】《KDE2/Qt编程金典》第二章:创建并显示一个窗口——2.1 一个关于Qt的简单例子:Hello Qt [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-08-27
《KDE2/Qt编程金典》第二章:创建并显示一个窗口——2.1 一个关于Qt的简单例子:Hello Qt


  下面的例程用于创建和显示一个简单的窗口,此程序只显示一行文本,不做其它任何事情,但这个程序可以让用户了解一下Qt程序最基本的样子。

1     /* helloworld.cpp */
2     #include <qapplication.h>
3     #include <qlabel.h>
4     #include <qstring.h>
5    
6     int main(int argc, char **argv)
7     {
8         QApplication app(argc, argv);
9         QLabel *label = new QLabel(NULL);
10         QString string("Hello, world");
11         label->setText(string);
12         label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
13         label->setGeometry(0, 0, 180, 75);
15         label->show();
16         app.setMainWidget(label);
17         return(app.exec());
18     }

  在第2行中包含了文件qapplication.h,此文件总是被包含在同样的源文件中,它里面包含了main()函数。这个领程使用了QLabel widget来显示文本,所以也必须包含文件qlabel.h。此外,需要用QString对象来指明由QLabel对象显示的文本,因此在第4行中包含了文件qstring.h。
  第8行创建了一个QApplication对象,命名为app。QApplication对象是一个容器,包含了应用程序顶层的窗口(或者一组窗口)。顶层窗口是独一无二的,它在应用程序中从来没有父窗口。因为QApplication对象的任务是控制管理你的应用程序,因此在每个程序中只能有一个QApplication对象。此外,由于创建QApplication对象的过程将初始化Qt系统,所以在使用其它任何Qt工具之前,QApplication对象必然已经存在了。
  一个Qt程序就是一个C++程序。这就意味着为了启动程序,函数main()将被操作系统所调用。而且,像所有的C++程序一样,命令行选项可能会也可能不会传递给main()函数。命令行选项作为初始化过程的一部分传递给Qt系统,见第8行所示。
  两个命令行参数,argc和argv,在app结构中使用,因为这样可以指定一些特殊的标志和设置。例如,用-geometry参数启动Qt程序,将可以指定窗口显示的位置和大小。通过修改启动程序的外观信息,用户可以自己按照喜好定义程序的外观风格。
  QLabel部件在第9行被创建。QLabel部件是一个简单的窗口,能够显示一个字符串。标签指定的父类部件创建为NULL,因为这个标签将作为顶层的窗口,而顶层窗口是没有父类的。当此部件被创建时,标签中并没有包含文本,在第10行创建的QString对象将文本传递给QLabel对象。在第11行,随着调用setText(),QString对象被插入到QLabel中。
  QLabel默认的动作是以垂直方向中心对齐的方式显示字符串,以左边为基准,这样第12行的调用setAlignment()使得文本在水平和垂直方向上都位于中心位置。
  在第14行对setGeometry()的调用决定了标签部件在QApplication窗口中的位置、高度和宽度。对于这个例程来说,标签被定位在(0, 0)的位置,是在主窗口的左上角,同时它被设置成180个像素点宽、75个像素点高。在显示任何东西之前,主窗口将检查标签,知道它的大小,然后主窗口将把自己的尺寸调整到能够显示这个标签。
  在第16行对show()的调用是为了实现标签在窗口上的显示所必需的。 show()函数并不立刻显示widget,它只是为显示做好准备,以便需要的时候能够显示出来。在这个例子中,父窗口,即QApplication窗口,负责显示标签,但它只是在调用标签的show()方法时才会完成显示。另一个函数,叫做hide(),用于使一个部件从屏幕上消失。
  在第11行对setMainWidget()的调用把标签插入到主窗口中。为了保持这个例程的简单性,使用了QLabel对象,然而实际上通常部件应该是某种复合部件,是多个部件、以及其它应用程序主窗口元件的集合。
  最后,在第17行调用了exec()函数,这个函数只有当程序停止执行的时候才返回,它返回一个整型的值,代表程序的完成状态,由于我们并不处理状态代码,这个值只是被简单地返回给系统。
  由于这个例程非常简单,只由一个源文件,因此编译它的makefile文件相当的简单:

INCL= -I$(QTDIR)/include -I$(KDEDIR)/include
CFLAGS= -pipe -O2 -fno-strength-reduce
LFLAGS= -L$(QTDIR)/lib -L$(KDEDIR)/lib -L/usr/X11R6/lib
LIBS= -lqt -lX11 -lXext
CC=g++

helloworld: helloworld.o
    $(CC) $(LFLAGS) -o helloworld helloworld.o $(LIBS)

helloworld.o: helloworld.cpp

clean:
    rm -f helloworld
    rm -f helloworld.o

.SUFFIXES: .cpp

.cpp.o:
    $(CC) -c $(CFLAGS) $(INCL) -o $@ $<


  makefile认为环境变量QTDIR和KDEDIR都已经被定义好了,它们用来指明Qt和KDE开发系统的安装路径。通常,这两个环境变量在安装软件的时候就已经配置好它们的定义了。在makefile中定义了5个名字:

INCL:
  定义头文件的路径名。它们被传送给编译器,告诉编译器到哪里去寻找头文件。编译器总是在/usr/include路径下寻找标准头文件
CFLAGS:
  定义传输给编译器的选择项列表。-pipe选项指示编译器在两个编译平台间传输数据时使用管道,而不是临时文件。-O2选项设置了一个相当高的最优化级别。-fno-strength-reduce选项为防止最优化过程缩减或者消除重复的变量
LFLAGS:
  定义传给连接器的选择项列表。每个-L选项所设置的是包含一个或者多个库的路径
LIBS:
  定义这个程序需要用到的库的名称列表,将会在LFLAGS指明的路径下寻找这些库。这些名称都将被扩展成库文件的名字。例如,-lqt将改变为libqt.so,而-lX11则成为libX11.so
CC:
  定义编译器的名字

  makefile文件的最后两行是用来指示make如何形成命令以便把一个.cpp文件转换成一个.o文件。在这个例程中,只有一个源文件,但如果有多个源文件时,使用转换规则允许只定义一次编译命令,而在整个makefile文件中就可应用此编译命令。
  注意:编写makefile的方式有无限多种,这个例程相对比较简单,因此容易阅读。在开发应用程序时,很可能会发现还有其它的一些东西需要加入到你的makefile文件中。
[ 此贴被XChinux在2005-08-27 10:40重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线mathbox

只看该作者 1楼 发表于: 2006-10-14
顶一下,呵呵
离线wbj1984
只看该作者 2楼 发表于: 2008-06-13


快速回复
限100 字节
 
上一个 下一个