下面的例子说明了创建自己的部件的基本形式。这个程序创建了一个MyLabel部件,并在主窗口中显示。MyLabel部件相当简单,它从QLabel继承了所有的东西,并未增加任何功能。这个类的定义在头文件mylabel.h中。
1 /* mylabel.h */
2 #ifndef MYLABEL_H
3 #define MYLABEL_H
4
5 #include <qlabel.h>
6 #include <qstring.h>
7
8 class MyLabel: public QLabel
9 {
10 public:
11 MyLabel(QWidget *parent);
12 ~MyLabel();
13 };
14
15 #endif
第2、3和15行显示的预处理命令是不需要的,但它们提供了一个非常好的想法。由于正在不断发展的应用程序会变得越来越复杂,同一个头文件很可能不仅仅被某一个源文件所包含,因为它很可能也被其它的源文件包含,这种情况是非常普遍的。创建MYLABEL_H的定义,这个头文件就可以多次被包含但只编译一次,这样就非常方便了。
在第8行中,MyLabel类的定义使用了QLabel作为它的基类,因此需要像第5行那样的使用include语句,这样就可以使用QLabel的定义了。为了方便,在第6行包含了头文件qstring.h,因为在MyLabel构造函数中需要QString定义。
MyLabel类是在它自己的源代码中实现的,它只是把父widget的地址从MyLabel构造函数传送到QLabel基类的构造函数,除此之外,什么也不做:
1 /* mylabel.cpp */
2 #include "mylabel.h"
3
4 MyLabel::MyLabel(QWidget *parent): QLabel(parent)
5 {
6 }
7 MyLabel::~MyLabel()
8 {
9 }
下面的例程用来创建并显示MyLabel部件,除了使用的对象外,此程序的main()函数和前面一个例程非常相似。
1 /* helloobject.cpp */
2 #include "mylabel.h"
3 #include <qapplication.h>
4
5 int main(int argc, char **argv)
6 {
7 QApplication app(argc, argv);
8 MyLabel *mylabel = new MyLabel(NULL);
9 QString string("Hello, object");
10 mylabel->setText(string);
11 mylabel->setAlignment(
12 Qt::AlignVCenter | Qt::AlignHCenter);
13 mylabel->setGeometry(0, 0, 180, 75);
14 mylabel->show();
15 app.setMainWidget(mylabel);
16 return(app.exec());
17 }
MyLabel对象的创建、控制和显示的方式和前面例子中的QLabel对象处理方式完全相同。setAlignment()函数直接从QLabel继承,而setGeometry()和show()是从QWidget中继承的。
注意:面向对象的编程方式具有许多优越性,但最广为人知的主要是在处理图形用户界面方面所表现出来的优点。实际上Qt充分发挥了这一优势。每一个可显示的对象从它们的基类QWidget中继承了基本的功能,这意味着每个可显示的窗口——标签、按钮、顶层窗口或者其它任何东西,都拥有同样的一套基本的功能,如大小、颜色、光标现状、鼠标事件的测定和滚动条件等。这不仅使得你可以轻松创建自己的部件,同时它自动采用了一套默认的统一行为和外观来显示屏幕上的任何事务。
makefile文件和前面程序非常粮食,只不过它必须考虑对两个分开的.cpp文件进行编译,并把它们链接到一起:
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++
helloobject: helloobject.o mylabel.o
$(CC) $(LFLAGS) -o helloobject helloobject.o mylabel.o $(LIBS)
helloobject.o: helloobject.cpp mylabel.h
mylabel.o: mylabel.cpp mylabel.h
clean:
rm -f helloobject
rm -f mylabel.o
rm -f helloobject.o
.SUFFIXES: .cpp
.cpp.o:
$(CC) -c $(CFLAGS) $(INCL) -o $@ $<