保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
单击提交则表示您同意developerWorks
的条款和条件。 .
所有提交的信息确保安全。
developerWorks 社区:
我的概要信息
选择语言:
信号与槽作为 QT 的核心机制在 QT 编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。
(), 软件工程师
唐新华 软件工程师。Email:
QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象、易于扩展、真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上。QT 支持下列平台:MS/WINDOWS-95、98、NT 和 2000;UNIX/X11-Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX;EMBEDDED- 支持 framebuffer 的 Linux 平台。伴随着 KDE 的快速发展和普及,QT 很可能成为 Linux 窗口平台上进行软件开发时的 GUI 首选。概述信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。信号和槽是 QT 自行定义的一种通信机制,它独立于标准的 C/C++ 语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C++ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码。在我们所熟知的很多 GUI 工具包中,窗口小部件 (widget) 都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在 QT 中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。 信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生 core dumps。所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射 (emit) 出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。信号当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有 定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号 - 槽机制完全独立于任何 GUI 事件循环。只有当所有的槽返回以后发射函数(emit)才返回。 如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪 个后执行。信号的声明是在头文件中进行的,QT 的 signals 关键字指出进入了信号声明区,随后即可 声明自己的信号。例如,下面定义了三个信号:
void mySignal();
void mySignal(int x);
void mySignalParam(int x,int y);在上面的定义中,signals 是 QT 的关键字,而非 C/C++ 的。接下来的一行 void mySignal() 定义了信号 mySignal,这个信号没有携带参数;接下来的一行 void mySignal(int x) 定义 了重名信号 mySignal,但是它携带一个整形参数,这有点类似于 C++ 中的虚函数。从形式上 讲信号的声明与普通的 C++ 函数是一样的,但是信号却没有函数体定义,另外,信号的返回 类型都是 void,不要指望能从信号返回什么有用信息。信号由 moc 自动产生,它们不应该在 .cpp 文件中实现。槽槽是普通的 C++ 成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的 C++ 成员函数一样,槽函数也分为三种类型,即 public slots、private slots 和 protected slots。public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。槽也能够声明为虚函数,这也是非常有用的。槽的声明也是在头文件中进行的。例如,下面声明了三个槽:
public slots:
void mySlot();
void mySlot(int x);
void mySignalParam(int x,int y);信号与槽的关联通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:
bool QObject::connect ( const QObject * sender, const char * signal,
const QObject * receiver, const char * member ) [static]这个函数的作用就是将发射者 sender 对象中的信号 signal 与接收者 receiver 中的 member 槽函数联系起来。当指定信号 signal 时必须使用 QT 的宏 SIGNAL(),当指定槽函数时必须使用宏 SLOT()。如果发射者与接收者属于同一个对象的话,那么在 connect 调用中接收者参数可以省略。例如,下面定义了两个对象:标签对象 label 和滚动条对象 scroll,并将 valueChanged() 信号与标签对象的 setNum() 相关联,另外信号还携带了一个整形参数,这样标签总是显示滚动条所处位置的值。
QScrollBar *scroll = new QScrollB
QObject::connect( scroll, SIGNAL(valueChanged(int)),
SLOT(setNum(int)) );一个信号甚至能够与另一个信号相关联,看下面的例子:
class MyWidget : public QWidget
MyWidget();
void aSignal();
QPushButton *aB
MyWidget::MyWidget()
aButton = new QPushButton( this );
connect( aButton, SIGNAL(clicked()), SIGNAL(aSignal()) );
}在上面的构造函数中,MyWidget 创建了一个私有的按钮 aButton,按钮的单击事件产生的信号 clicked() 与另外一个信号 aSignal() 进行了关联。这样一来,当信号 clicked() 被发射时,信号 aSignal() 也接着被发射。当然,你也可以直接将单击事件与某个私有的槽函数相关联,然后在槽中发射 aSignal() 信号,这样的话似乎有点多余。当信号与槽没有必要继续保持关联时,我们可以使用 disconnect 函数来断开连接。其定义如下:
bool QObject::disconnect ( const QObject * sender, const char * signal,
const Object * receiver, const char * member ) [static]这个函数断开发射者中的信号与接收者中的槽函数之间的关联。有三种情况必须使用 disconnect() 函数:断开与某个对象相关联的任何对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或者多个信号,这些信号与另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就可以利用这个方法,非常之简洁。 disconnect( myObject, 0, 0, 0 )
myObject-&disconnect()断开与某个特定信号的任何关联。 disconnect( myObject, SIGNAL(mySignal()), 0, 0 )
myObject-&disconnect( SIGNAL(mySignal()) )断开两个对象之间的关联。 disconnect( myObject, 0, myReceiver, 0 )
myObject-&disconnect(
myReceiver )在 disconnect 函数中 0 可以用作一个通配符,分别表示任何信号、任何接收对象、接收对象中的任何槽函数。但是发射者 sender 不能为 0,其它三个参数的值可以等于 0。元对象工具元对象编译器 moc(meta object compiler)对 C++ 文件中的类声明进行分析并产生用于初始化元对象的 C++ 代码,元对象包含全部信号和槽的名字以及指向这些函数的指针。moc 读 C++ 源文件,如果发现有 Q_OBJECT 宏声明的类,它就会生成另外一个 C++ 源文件,这个新生成的文件中包含有该类的元对象代码。例如,假设我们有一个头文件 mysignal.h,在这个文件中包含有信号或槽的声明,那么在编译之前 moc 工具就会根据该文件自动生成一个名为 mysignal.moc.h 的 C++ 源文件并将其提交给编译器;类似地,对应于 mysignal.cpp 文件 moc 工具将自动生成一个名为 mysignal.moc.cpp 文件提交给编译器。元对象代码是 signal/slot 机制所必须的。用 moc 产生的 C++ 源文件必须与类实现一起进行编译和连接,或者用 #include 语句将其包含到类的源文件中。moc 并不扩展 #include 或者 #define 宏定义 , 它只是简单的跳过所遇到的任何预处理指令。程序样例这里给出了一个简单的样例程序,程序中定义了三个信号、三个槽函数,然后将信号与槽进行了关联,每个槽函数只是简单的弹出一个对话框窗口。读者可以用 kdevelop 生成一个简单的 QT 应用程序,然后将下面的代码添加到相应的程序中去。信号和槽函数的声明一般位于头文件中,同时在类声明的开始位置必须加上 Q_OBJECT 语句,这条语句是不可缺少的,它将告诉编译器在编译之前必须先应用 moc 工具进行扩展。关键字 signals 指出随后开始信号的声明,这里 signals 用的是复数形式而非单数,siganls 没有 public、private、protected 等属性,这点不同于 slots。另外,signals、slots 关键字是 QT 自己定义的,不是 C++ 中的关键字。信号的声明类似于函数的声明而非变量的声明,左边要有类型,右边要有括号,如果要向槽中传递参数的话,在括号中指定每个形式参数的类型,当然,形式参数的个数可以多于一个。关键字 slots 指出随后开始槽的声明,这里 slots 用的也是复数形式。槽的声明与普通函数的声明一样,可以携带零或多个形式参数。既然信号的声明类似于普通 C++ 函数的声明,那么,信号也可采用 C++ 中虚函数的形式进行声明,即同名但参数不同。例如,第一次定义的 void mySignal() 没有带参数,而第二次定义的却带有参数,从这里我们可以看到 QT 的信号机制是非常灵活的。信号与槽之间的联系必须事先用 connect 函数进行指定。如果要断开二者之间的联系,可以使用函数 disconnect。
//tsignal.h
class TsignalApp:public QMainWindow
// 信号声明区
// 声明信号 mySignal()
void mySignal();
// 声明信号 mySignal(int)
void mySignal(int x);
// 声明信号 mySignalParam(int,int)
void mySignalParam(int x,int y);
// 槽声明区
public slots:
// 声明槽函数 mySlot()
void mySlot();
// 声明槽函数 mySlot(int)
void mySlot(int x);
// 声明槽函数 mySignalParam (int,int)
void mySignalParam(int x,int y);
//tsignal.cpp
TsignalApp::TsignalApp()
// 将信号 mySignal() 与槽 mySlot() 相关联
connect(this,SIGNAL(mySignal()),SLOT(mySlot()));
// 将信号 mySignal(int) 与槽 mySlot(int) 相关联
connect(this,SIGNAL(mySignal(int)),SLOT(mySlot(int)));
// 将信号 mySignalParam(int,int) 与槽 mySlotParam(int,int) 相关联
connect(this,SIGNAL(mySignalParam(int,int)),SLOT(mySlotParam(int,int)));
// 定义槽函数 mySlot()
void TsignalApp::mySlot()
QMessageBox::about(this,"Tsignal", "This is a signal/slot sample without
parameter.");
// 定义槽函数 mySlot(int)
void TsignalApp::mySlot(int x)
QMessageBox::about(this,"Tsignal", "This is a signal/slot sample with one
parameter.");
// 定义槽函数 mySlotParam(int,int)
void TsignalApp::mySlotParam(int x,int y)
char s[256];
sprintf(s,"x:%d y:%d",x,y);
QMessageBox::about(this,"Tsignal", s);
void TsignalApp::slotFileNew()
// 发射信号 mySignal()
emit mySignal();
// 发射信号 mySignal(int)
emit mySignal(5);
// 发射信号 mySignalParam(5,100)
emit mySignalParam(5,100);
}应注意的问题信号与槽机制是比较灵活的,但有些局限性我们必须了解,这样在实际的使用过程中做到有的放矢,避免产生一些错误。下面就介绍一下这方面的情况。1 .信号与槽的效率是非常高的,但是同真正的回调函数比较起来,由于增加了灵活性,因此在速度上还是有所损失,当然这种损失相对来说是比较小的,通过在一台 i586-133 的机器上测试是 10 微秒(运行 Linux),可见这种机制所提供的简洁性、灵活性还是值得的。但如果我们要追求高效率的话,比如在实时系统中就要尽可能的少用这种机制。2 .信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。3 .如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。4. 宏定义不能用在 signal 和 slot 的参数中。既然 moc 工具不扩展 #define,因此,在 signals 和 slots 中携带参数的宏就不能正确地工作,如果不带参数是可以的。例如,下面的例子中将带有参数的宏 SIGNEDNESS(a) 作为信号的参数是不合语法的:
#ifdef ultrix
#define SIGNEDNESS(a) unsigned a
#define SIGNEDNESS(a) a
class Whatever : public QObject
void someSignal( SIGNEDNESS(a) );
};5. 构造函数不能用在 signals 或者 slots 声明区域内。的确,将一个构造函数放在 signals 或者 slots 区内有点不可理解,无论如何,不能将它们放在 private slots、protected slots 或者 public slots 区内。下面的用法是不合语法要求的:
class SomeClass : public QObject
public slots:
SomeClass( QObject *parent, const char *name )
: QObject( parent, name ) {}
// 在槽声明区内声明构造函数不合语法
};6. 函数指针不能作为信号或槽的参数。例如,下面的例子中将 void (*applyFunction)(QList*, void*) 作为参数是不合语法的:
class someClass : public QObject
public slots:
void apply(void (*applyFunction)(QList*, void*), char*); // 不合语法
};你可以采用下面的方法绕过这个限制:
typedef void (*ApplyFunctionType)(QList*, void*);
class someClass : public QObject
public slots:
void apply( ApplyFunctionType, char *);
};7. 信号与槽不能有缺省参数。既然 signal-&slot 绑定是发生在运行时刻,那么,从概念上讲使用缺省参数是困难的。下面的用法是不合理的:
class SomeClass : public QObject
public slots:
void someSlot(int x=100); // 将 x 的缺省值定义成 100,在槽函数声明中使用是错误的
};8. 信号与槽也不能携带模板类参数。如果将信号、槽声明为模板类参数的话,即使 moc 工具不报告错误,也不可能得到预期的结果。 例如,下面的例子中当信号发射时,槽函数不会被正确调用:
public slots:
void MyWidget::setLocation (pair&int,int& location);
public signals:
void MyObject::moved (pair&int,int& location);但是,你可以使用 typedef 语句来绕过这个限制。如下所示:
typedef pair&int,int& IntP
public slots:
void MyWidget::setLocation (IntPair location);
public signals:
void MyObject::moved (IntPair location);这样使用的话,你就可以得到正确的结果。9. 嵌套的类不能位于信号或槽区域内,也不能有信号或者槽。例如,下面的例子中,在 class B 中声明槽 b() 是不合语法的,在信号区内声明槽 b() 也是不合语法的。
public slots:
// 在嵌套类中声明槽不合语法
// 在信号区内声明嵌套类不合语法
};10. 友元声明不能位于信号或者槽声明区内。相反,它们应该在普通 C++ 的 private、protected 或者 public 区内进行声明。下面的例子是不合语法规范的:
class someClass : public QObject
signals: // 信号定义区
friend class ClassT // 此处定义不合语法
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
IBM PureSystems(TM) 系列解决方案是一个专家集成系统
通过学习路线图系统掌握软件开发技能
软件下载、试用版及云计算
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=LinuxArticleID=21277ArticleTitle=QT 的信号与槽机制介绍publish-date=&第5章使用Qt基本GUI工具 [喝小酒的网摘]http://blog./a/10324.htm
&&& ★使用QtDesigner(设计师)进行GUI设计
&&& ★使用QtDemo浏览Qt应用开发
&&& ★使用QtAssistant(助手)获取在线文档与帮助
5.1使用QtDesigner进行GUI设计
&&& QtDesigner,又被称作是Qt设计师,是一个所见即所得的全方位GUI构造器,它所
设计出来的用户界面能够在多种平台上使用。它是QtSDK的一部分,也是最为重要的开发
工具之一。利用QtDesigner,我们可以拖放各种Qt控件构造图形用户界面并可预览效
&&& 通常一个QtDesigner的样子如图5-1所示。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-1 QtDesigner的观感
----------------------- Page 2-----------------------
&&& 使用QtDesigner,开发人员既可以创建&对话框&样式的应用程序、又可以创建带有
菜单、工具栏、气球帮助以及其他标准功能的&主窗口&样式的应用程序。QtDesigner
提供了多种窗体模板,开发人员可以创建自己的模板,确保某一应用程序或某一系列应用程
序界面的一致性。编程人员可以创建自己的自定义窗体,这些窗体可以轻松与 QtDesigner
&&& QtDesigner支持采用基于窗体的方式来开发应用程序。窗体是由用户界面 (.ui)文
件来表示的,这种文件既可以转换成 C++并编译成一个应用程序,也可以在运行时加以处
理,从而生成动态用户界面。Qt的构建系统能将用户界面的编译构建过程自动化,使设计
过程更轻松。
&&& QtDesigner可以轻松的与许多常见的IDE集成Windows平台的商业许可证持有人可
以在MicrosoftVisualStudio&内充分享受到QtDesigner用户界面设计所带来的便
利。在MacOSX中,开发人员则可在 Apple'sXcode&环境内使用 QtDesigner。另外,
Nokia还为跨平台的Eclipse集成环境开发了Qt的集成插件,以将QtDesigner及其他Qt
技术嵌入到集成环境框架中。
5.1.2启动并设置QtDesigner
&&& 要运行QtDesigner,在Windows下,可单击&开始&菜单中的&QtSDKbyNokia
v2009.3(OpenSource)|designer&;在UNIX下,可在命令行终端中输入designer命
令;在MacOSXFinder中,只需双击designer即可。以Linux系统为例,启动Qt
Designer通常有2种方法:
1.程序组启动
&&& 一般的,如果你的Qt是采用发行版已经编译好的Qt包的话,安装完毕后就已经在程
序组中设置了链接项,一般是在【开发】或是在【编程】组中。以笔者的RedFlag为例,
依次点击【应用程序】&【开发】&【Qt】&【Qt4Designer&InterfaceDesigner】
后,QtDesigner就会启动了。
2.命令行启动
&&& 如果你是自己采用编译源代码的方式安装Qt,并且没有设置快捷方式的话,你可以从
命令行启动QtDesigner。方法是进入到命令行方式,或者打开一个终端,进入你Qt安装
的目录,以笔者的RedFlag为例,进入 /usr/bin/目录,输入./designer-qt4,即可启
动QtDesigner。
&&& 注意,不同的Linux发行版的菜单设置以及可执行文件命名可能会有所不同。
3.设置QtDesigner
&&& 启动QtDesigner后,首先需要需要对它进行设置。
&&& QtDesigner支持两种界面排列形式:一种是多个顶极窗口并列分布形式;一种是与
----------------------- Page 3-----------------------
Windows上常见的IDE类似的单窗口(即多停靠窗锚接)形式。
&&& 多个顶级窗口的样子如图5-2所示,QtDesigner的各个子窗口都作为独立的顶级窗口
排列在屏幕中,用户可以自由改变其位置和尺寸大小。
&&&&&&&&&&&&&&&&&&&&&&& 图5-2 处于&多个顶级窗口&模式下的QtDesigner
&&& 锚接窗口模式下的QtDesigner的样子如图5-3所示。
----------------------- Page 4-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&& 图5-3 处于&锚接的窗口& 模式下的QtDesigner
&&& 在Qt4.5版以前,QtDesigner默认情况下以多个顶极窗口并列的形式显示,在Qt4.5
之后,默认是锚接窗口的形式。这一改动受到了大多数开发者的欢迎,因为大家还是习惯使
用锚接窗口的界面布局形式。
&&& 如果你想变更QtDesigner的界面布局形式,在主菜单上依次选择【设置】&【属性】
&【外观】&【锚接的窗口/多个顶极窗口】即可。
5.1.3功能说明
&&& 1.界面布局
&&& QtDesigner主要由窗口部件盒、对象查看器、属性编辑器、资源浏览器、动作编辑器
和信号/槽编辑器组成,它们都是锚接窗口,通常排列在窗体的两侧,也可以定制它们的位
置。如图所示,界面中间是新建立的窗体。
&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-4 QtDesigner的布局
&&& 2.功能项说明
&&& 表5-1示出了QtDesigner主菜单项的功能说明。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 表5-1菜单项功能说明
&菜单项&&& 说明
&文件&&&& 提供文件的新增、读取、存储、打印以及退出Qt Designer等命令
&编辑&&&& 提供数据的剪贴、复制、查找,光标的跳转、代码补全;编辑窗口部件、编辑信号/槽、伙伴、Tab顺序等命令
----------------------- Page 5-----------------------
窗体&&&&&&&&& 提供窗体属性设定、布局设置、调整 大小、预览等命令
视图&&&&&&&&& 提供各种配置窗口、工具栏等的显示和隐藏设置等命令
设置&&&&&&&&& 提供窗体属性设定,附加字体设定等命令
窗口&&&&&&&&& 提供窗口的切换以及最小化等命令
帮助&&&&&&&&& 提供调用QtAsssistant等帮助命令
&&&& 表5-2示出了文件工具栏功能说明。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 表5-2 文件工具栏功能说明
名称与图标&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 功能
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 新建窗体
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 打开窗体
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 保存窗体
&&&& 表5-3示出了编辑工具栏功能说明。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 表5-3 编辑工具栏功能说明
名称与图标&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 功能
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 撤销上一次操作
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 恢复操作
----------------------- Page 6-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 剪切
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 复制
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 粘贴
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 放到后面
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 放到前面
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 编辑窗口部件
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 编辑信号/槽
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 编辑伙伴
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 编辑标签顺序
&&&& 表5-4示出了窗体布局工具栏功能说明。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 表5-4 窗体布局工具栏功能说明
名称和图标&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 功能
----------------------- Page 7-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 设置为水平布局
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 设置为垂直布局
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 设置为分裂器水平布局
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 设置为分裂器垂直布局
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 设置为栅格布局
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 设置为表单布局
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 打破布局
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 调整大小;
&&& 3.主要部件的使用
&&& ◆窗口部件盒(WidgetBox)
&&& 窗口部件盒是QtDesigner为使用者提供的窗口部件集合,根据你安装的Qt包的版本
和种类的不同,窗口部件盒中部件的种类也不尽相同,通常有Layouts、Spacers、
Buttons、ItemsWidgets(Model-Based)、ItemWidgets(Item-Based)、Containers、Input
Widgets、DisplayWidgets等大类。
&&& 以笔者使用的Qt4.5.2开源版为例,通常一个窗口部件盒的样子如图5-5所示
----------------------- Page 8-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-5 窗口部件盒
&&& 使用窗口部件盒的方法是用左键选中某一个部件,将它拖动到你的窗体屏幕上去,并
释放鼠标左键,这样就在界面上添加了这个部件。
&&& ◆属性编辑器(PropertyEditor)
&&& 属性编辑器是另一个非常重要的组件,当我们将界面上的窗体放置好后,就需要对各
个组件的属性进行设置,通常一个属性编辑器的样子如图5-6所示。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-6 属性编辑器
&&& 属性编辑器的使用也是非常简单的,使用者点击界面上的某一个部件,然后在属性编
辑器中设置属性即可,属性编辑器中属性栏的项目都是以英文来显示的,只要你对常用的计
算机编程中的英文词汇有所了解,理解它们的意思并正确的设置属性并不难。我们会在后面
结合具体实例为大家讲解。
----------------------- Page 9-----------------------
&&& ◆对象查看器(ObjectInspector)
&&& 对象查看器用来查看和设置窗体中的各个对象及其属性。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-7 对象查看器
&&& 对象查看器通常与属性编辑器配合使用,一般是在设置好界面元素后,在对象查看器
中查阅各个元素的分布以及总体的布局情况,然后选中其中某个窗口部件,切换到属性编辑
器中编辑它的属性。
&&& QtDesigner还有几个重要的部件如资源浏览器、动作编辑器、信号/槽编辑器等,我
们将在下面各节以及后面的各章中结合实例为大家介绍。
5.1.4QtGUI设计基本流程
&&& 使用QtDesigner设计窗体十分简单,一般遵循如下的步骤。
&&& 第1步,启动QtDesigner,选择要创建的应用类型。
&&& 启动QtDesigner后,将出现如图5-8所示的新建窗体对话框。
----------------------- Page 10-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-8 新建窗体对话框
&&& Qt4.5默认为使用者提供了3大类模板供选择,即常见的窗口模板
(templatesforms)、窗口部件盒自定义窗口部件。我们最为常用的是第1大类,其中包
括了对话框、主窗口和普通窗口部件等几种应用类型模板。这里我们以最后一项Widget为
例,选中它,再点击【创建】按钮,一个空白的Widget就创建好了,如图5-9所示。
----------------------- Page 11-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-9 创建Widget类型界面
&&& 第2步,将控件从窗口部件盒拖到窗体上,然后使用标准编辑工具来选择、剪切、粘
贴窗体并重新调整大小。以图5-10为例说明,我们从窗口部件盒里面,拖动出2个
Label、2个LineEdit、1个PushButton和1个HorizontalSpacer,大致排列一下放在窗
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-10 添加窗口部件
----------------------- Page 12-----------------------
&&&&&&&& 第3步,使用属性编辑器来更改窗体和每个控件的属性。
&&&&&&&& 基本的属性包括窗口部件的objectName、text以及大小位置等。在表5-5中列出
&&& 了这几个窗口部件的常见属性设置,这里我仅仅举出objectName和text这两个最为
&&& 常用的属性,其它的属性设置与此类似。这样设置完成后的界面大致如图5-11所示的
&&& 样子。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 表5-5 窗口部件的属性设置
&&&&& 部件类别&&&&&&&&&&& objectName&&&&&&&&&&&& text(WindowTitle)
&&&&& Widget&&&&&&&&& myForm&&&&&&&&&&&&&&&& 布局示例
&&&&& Label&&&&&&&&&& label_name&&&&&&&&&&&& 姓名
&&&&& Label&&&&&&&&&& label_phone&&&&&&&&&&& 电话
&&&&& LineEdit&&&&&&& lineEdit_name&&&&&&&&& 无
&&&&& LineEdit&&&&&&& lineEdit_phone&&&&&&&& 无
&&&&& HorizontalSpacer horizontalSpacer&&&&& 无
&&&&& PushButton&&&&& pushButton_ok&&&&&&&&& 确定
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-11设置好部件属性的窗体
&&& 第4步,保存窗口设置,按下Ctrl+Shift+S组合键,在弹出的如图5-12所示的【窗
体另存为】对话框中输入文件名,然后点击保存按钮。
----------------------- Page 13-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-12保存窗体
&&& 第5步,设置界面布局。
&&& 与我们习惯的在MSVisualStudio中不同,QtDesigner在设计界面时时,不必
刻意手工调整窗体的大小和精确位置,我们只需选中窗体,并对它们运用布局。例
如,您可以选中一些按钮控件,并通过选择【水平布局】选项将它们水平并列排放。
采用这种方法,可以使设计更快速,设计完成后,控件会根据最终用户需要的窗体大
小正确缩放。
&&& 在Qt4.5中,常见的窗体布局有6种,表5-6示出了这些布局的种类和功用。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 表5-6 常见的布局类型
&布局类型&&&&&&&&&&&&&&&&&&& 作用
&水平布局&&&&&&&&&&&&&&&&&&& 按规则水平排列布局内的窗口部件
&垂直布局&&&&&&&&&&&&&&&&&&& 按规则垂直排列布局内的窗口部件
&分裂器水平布局&&&&&&&&&&&&&&&& 按规则水平排列布局内的窗口部件,并将整体作为一个水平分裂器
&分裂器垂直布局&&&&&&&&&&&&&&&& 按规则垂直排列布局内的窗口部件,并将整体作为一个垂直分裂器
&栅格布局&&&&&&&&&&&&&&&&&&& 按二维栅格的方式排列布局内的窗口部件
&窗体布局中布局&&&&&&&&&&&&&&&& 将布局内的窗体部件分成两列,通常用于有输出输出的GUI场合
----------------------- Page 14-----------------------
&&&&&&& 好了,有了上面的指导思想,回到我们的界面设计上来。我们同时按下Ctrl和A
&&& 键,这就选中了窗体上的所有部件,在它们上面点击鼠标右键,在上下文菜单上依次
&&& 选择【布局】-&【栅格布局】,我们就选中栅格布局,这时界面情形如图5-13所示,
&&& 是不是比较美观了。其实,这样设置还是有一些问题存在,比如最好还要设置窗体的
&&& 顶级布局(TopLevelLayout)等。我们在后面再为大家详细讲解,这里不再深入讨
&&& 论了。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-13采用栅格布局后的效果
&&& 第6步,设置窗口部件的标签顺序。
&&& 说到标签顺序,大家可能听起来有些糊涂,在Windows平台上我们通常称作焦点顺序
或者Tab顺序,顾名思义,就是按下Tab键时,窗口焦点在这些部件间的移动顺序。
&&& 设置方法是点击工具栏上的那个带有数字图标的按钮,或者依次点击主菜单的【编
辑】-&【编辑Tab顺序】,这就进入了标签设置模式,如图5-14所示,窗体中各个具有获
得焦点能力的部件上会出现一个蓝色的小框,框内的数字表示该部件的标签顺序,即焦点顺
序。我们可以通过单击蓝色小框来修改标签顺序,被点中的小框将变为红色,完成设置后按
下F3键,切换回到编辑窗口部件模式。
&&&&&&&&&&&&&&&&&&&&&&&&& 图5-14设置窗口部件的标签(Tab)顺序
&&& 第7步,设置信号与槽
&&& 按下F4键,或者依次点击【编辑】-&【编辑信号/槽】,进入编辑信号/槽模式,如图
----------------------- Page 15-----------------------
5-15所示。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-15创建信号/槽
&&& 这时单击【确定】按钮,然后拖动鼠标,可以发现有一根红色的类似接地线形状的标
志线被拖出,松开鼠标,弹出信号/槽连接配置窗口,注意选中左下角的【显示从Qwidget
继承的信号和槽】按钮,界面上将列出所有可以使用的信号和槽,如图5-16所示。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-16连接信号/槽
&&& 在这个连接配置窗口的左侧列出了【确定】按钮的所有信号,右侧列出了myForm这个
Widget的所有槽,选择按钮的clicked()信号和myForm的close()槽,单击【确定】按
钮,完成设置,如图5-17所示。
----------------------- Page 16-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-17完成信号/槽的连接
&&& 到此,有关Designer的操作就结束了,它将生成一个.ui文件。
&&& 注意,QtDesigner有4种编辑模式,即编辑窗口部件模式、编辑信号/槽模式、编辑
伙伴模式和编辑Tab顺序模式,其中编辑伙伴模式不常用到。
&&& 关于QtDesigner的使用,有非常丰富的内容,这里只是使大家有一个初步的感性认
识,在下面的各章中,笔者将结合具体实例向大家详细的一一介绍。
5.2使用QtAssistant获取在线文档与帮助
&&& 对于大多数复杂的程序来说,在线文档和帮助是必不可少的。Qt通过Qt助手-一个
帮助文件和文档的在线阅读器,来满足这一需求。简单的说,QtAssistant就是浏览Qt
参考文档的工具,它具有强大的查询和索引功能,使用时能够比Web浏览器更加快速和容
易。而且它可定制,并且可随用户自己的应用程序一起发布,从而形成用户自己的帮助系
&&& 开发人员可以将QtAssistant部署为自有应用程序和文档集的帮助浏览器。使用
QAssistantClient类,可以集成 QtAssistant。QtAssistant使用QTextEdit来显示
Qt的HTML参考文档;如有必要,开发人员也可以使用此类来直接实现自己的帮助浏览
器。QTextEdit支持HTML4.0的子集,它与 Qt提供的富文本(RichText)类一起使用
时,也可以用来显示其他格式的文档。
5.2.2Qt的参考文档
&&& Qt的参考文档包括大约 3,100页HTML文档,描述了Qt的所有类和工具,并概述
了Qt编程的各个方面,所以对于任何一名Qt开发人员来说,它都是一个基本工具。通常
任何一本Qt书籍都不能完全覆盖到Qt中所有的类和函数,同时也无法提供全部的细节。
所以如果想尽可能的从Qt获益,那么就应当尽可能的达到对Qt参考文档了如指掌的程
&&& 在Qt的doc/html目录下可以找到HTML格式的参考文档,并且可以使用任何一种Web
浏览器来阅读它。也可以使用Qt的帮助浏览器QtAssistant,它具有强大的查询和索引功
能,使用时能够比Web浏览器更加快速和容易。
----------------------- Page 17-----------------------
&&& 另外,可以从中获取Qt的当前版和一些早期版本的在线
参考文档。这个网站也选摘了Qt季刊(QtQuarterly)中的一些文章。Qt季刊是Qt程序
员的时事通讯,会发给所有获得Qt商业许可协议的人员。
5.2.3使用QtAssistant
&&& 1.运行Qt Assistant
&&& 要运行QtAssistant,在Windows下,如果是采用QtSDK方式安装的Qt库,那么你
在程序组里面是找不到QtAssistant的快捷方式的,它被整合到了QtCreator里面,你
可以在运行QtCreator时,按下F1键,即可调出QtAssistant,或者可以去Qt的安装目
录下面找到QtAssistant的执行文件,双击运行或者干脆为它在桌面上设置一个快捷方
式;如果使用框架方式安装Qt库的话,可以在程序组里面找到它的快捷方式,点击后即可
运行;在X11下,可在命令行终端中输入assistant命令;在MacOSXFinder中,只需
双击assistant即可。
&&& 注意,上述指的是一般的情况,比如各个Linux发行版对QtAssistant的命名也有所
不同,甚至有时路径也不完全一样。下面是个具体例子:
&&& 如果你是自己编译源代码安装的Qt,而且没有配置快捷方式的话,可以启动命令行,
进入你的Qt安装目录,以笔者的RedFlag6.0为例,依次键入下列命令。
&&& $cd /usr/bin
&&& $./assistant-qt4
&&& 一般的,QtAssistant运行起来的效果如图5-18所示
----------------------- Page 18-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-18Qt4 Assistant
&&& 2.使用方法
&&& 其实读者朋友如果用过Windows上微软出品的MSDN的话,就会发现Qt4Assistant的
界面布局与MSDN十分相似,操作方法也是大同小异,很容易上手。
&&& ⑴界面布局
&&& 图示出了QtAssistant的界面布局结构,它通常分为3个部分,最上面是主窗口,左
侧下面是内容索引窗口,右侧下面是主浏览区。
----------------------- Page 19-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 主浏览区
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-19Qt4Assistant界面功能分布
&&&&&&& ⑵菜单和工具栏
&&&&&&& 表5-7示出了QtAssistant主要菜单项的功用。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 表5-7 QtAssistant菜单项
&& 菜单&&&&&&&&&&&&&& 说明
&& 文件&&&&&&&&&&&&&& 提供文档设置、打印等相关操作操作命令
&& 编辑&&&&&&&&&&&&&& 提供首选项设置、复制文本、查找等操作命令
&& 查看&&&&&&&&&&&&&& 提供工具栏、各个标签页的显隐设置,显示比例设置等操作命令
&& 前往&&&&&&&&&&&&&& 提供登录Qt主页以及在QtAssistant各个页面间导航等操作命令
&& 书签&&&&&&&&&&&&&& 提供添加书签操作命令
&& 帮助&&&&&&&&&&&&&& 提供帮助命令
&&&&&&& 表5-8示出了导航工具栏的功用。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 表5-8 Qt Assistant导航工具栏
----------------------- Page 20-----------------------
名称和图标&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 功能
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 后退
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 前进
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 登录Qt主页
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 同步目录
&&&& 表5-9示出了文件和编辑工具栏的功用。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 表5-9 QtAssistant文件和编辑工具栏
名称和图标&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 功能
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 复制选中的文本
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 打印
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 在文本中查找
&&&& 表5-10示出了查看工具栏的功用。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 表5-10 Qt Assistant查看工具栏
名称和图标&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 功能
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 放大
----------------------- Page 21-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 缩小
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 正常大小
&&& ⑶使用内容索引窗口
&&& 默认情况下,内容索引窗口分为3个标签页,分别是&内容&、&索引&和&书
签&,如图5-20所示。其中最常用的是前两个。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-20内容索引窗口
&&& 内容标签页分成了5个大类,分别对应到QtAssistant操作、QtDesigner操作、Qt
Linguist操作、QMake使用、Qt参考文档和例子这几项内容。
&&& 如果你能确定你在使用和开发中遇到的问题属于哪种类别的时候,使用&内容&标签
页是合适和方便的,你只需点击选取某个大类,然后在展开的树形列表中选中某一个具体类
别,双击即可在右面的&主浏览区&内阅读详细的内容,如图5-21所示的是你想查看如何
使用qmake工具的情形。
----------------------- Page 22-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-21使用内容标签页
&&& 可以看到,在主浏览区的内容也是分层次管理起来的,读者可以根据需要进行操作。
&&& ⑷使用&索引&标签页
&&& &索引&标签页是使用频率很高的,因为好多时候我们并不能准确定位出现的问题是
属于哪一类的情况,这时候,使用&索引&标签页,如图5-22所示,在&查找&编辑框内
输入你的问题或是问题概述或是包含的几个字母都可以,QtAssistant将列出所有符合你
的需求的类别,选中你觉得合适的类别,双击它即可在右面的主浏览区内查阅相关内容。
&&& 比如我们想浏览QtDemo的情况,在编辑框内输入qtde,这时QtAssistant已经智能
的显示出了相关的索引结果,然后我们选中qtdemo,双击它,就可以在右面的主浏览区内
----------------------- Page 23-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-22使用索引标签页
&&& ⑸使用&标签&标签页
&&& &标签&标签页也是经常会用到的,当你某次查询时觉得某条资料很有用,希望下次
再来使用,就可以使用&标签&。一个书签页的情形如图5-23所示。
----------------------- Page 24-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-23使用&标签&标签页
&&& 注意在窗口的左下角有一个蓝色的【添加】按钮和一个红色的【移除】按钮,它们就
是用作添加和删除书签的,你可能还注意到在右边的主浏览区内有一个【搜索】标签页,下
面就结合这两者的使用说一下如何添加和移除标签。
&&& 第1步,在右边的主浏览区内的&搜索&编辑栏内输入你想输入的字符,比如输入
qt,那么主浏览区将会把与qt相关的所有条目罗列出来,如图5-24所示
----------------------- Page 25-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-24输入关键词进行搜索
&&& 第2步,你需要选中一个条目(图中蓝色的是条目),比如条目中的第2项,如图5-
25所示,系统将跳转到相应的页面
----------------------- Page 26-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-25选中一个条目,跳转到相应界面
&&& 第3步,点击【添加】按钮,QtAssistant将弹出&添加书签&对话框,请使用者添
加书签,如图5-26所示。
&&&&&&& 高级配置按钮
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-26添加书签对话框
&&& 如果没有特别要求,就可以在对话框上点击【确定】按钮,添加书签,如图5-27所
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-27添加书签后的情形
&&& 如果还需要进一步定制书签,那就这样做:
&&& 第1步,点击【添加书签】对话框上点击那个带加号形状的按钮,对话框将伸展开
----------------------- Page 27-----------------------
来,显示进一步的配置选项,如图5-28所示。
&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-28定制书签第1步-点击+号按钮
&&& 第2步,点击【新建文件夹】按钮,这时默认建立了一个名为&新建文件夹&的标签
类别,这个过程分别如图5-29和图5-30所示。
----------------------- Page 28-----------------------
图5-29定制书签第2步-点击【新建文件夹】按钮
----------------------- Page 29-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-30建立好的书签文件夹
&&& 第3步,在你新建立的文件夹上点击鼠标右键,弹出配置菜单,你可以选择【删除文
件夹】或是【重命名文件夹】,如图5-31所示
----------------------- Page 30-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-31第3步-配置文件夹
&&& 第4步,选择【重命名文件夹】后,输入你想定义的文件夹名称,如图5-32所
----------------------- Page 31-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-32重命名文件夹
&&& 第5步,点击【确定】按钮,QtAssistant将为你建立一个标签,如图5-33所
----------------------- Page 32-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-33建立好的标签页
&&& 第6步,依据标签进行检索。在左侧建立好的标签页上双击,QtAssistant将跳转到
对应的页面,如图5-34所示。
----------------------- Page 33-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-34依据标签进行检索
&&& 第7步,删除标签页。选中建立好的标签,然后点击【删除】按钮,即可删除标签;
也可以选中建立好的文件夹,然后点击【删除按钮】,系统会出现提示信息,选择【是】按
钮即可删除整个文件夹下的所有标签,如图5-35所示。
----------------------- Page 34-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-35删除文件夹下的书签
&&& 至此,关于QtAssistant的使用方法就讲解完了。QtAssistant在编程实践中经常会
用到,必须熟练掌握。
5.3使用QtDemo学习Qt应用程序开发
&&& 1.简介
&&& QtDemo是Qt套件之一,它包含了大量的演示和示例程序,基本涵盖了Qt编程中的
主要类别,将它与QtAssistant结合使用能够收到很好的效果。
&&& 2.运行Qt Demo
&&& 要运行QtDemo,在Windows下,如果是可依次单击【开始】&【(所有)程序】&
【QtSDKbyNokiav2009.03(OpenSource)】&【QtDemo】;在X11下,可在命令行终端
中输入assistant命令;在MacOSXFinder中,只需双击assistant即可。
&&& 注意,上述指的是一般的情况,请根据你自己安装Qt的实际情况进行调整,如采用
SDK方式安装和采用框架方式安装后,程序组中的指向QtDemo的名字会有所不同,但区别
不大;而各个Linux发行版对链接QtDemo的快捷方式命名也有所不同,甚至有时路径也
不完全一样。下面举个具体例子:
&&& 如果你是编译源代码来安装的Qt,并且没有为其配置快捷方式的话,那么可以用命令
行方式运行QtDemo,这里以RedFlag6.0为例,进入命令行界面,依次键入:
----------------------- Page 35-----------------------
&&& $cd/usr/bin
&&& $./qtdemo-qt4
&&& 即可运行QtDemo了。
&&& 通常QtDemo运行起来的样子如图5-36所示,比较遗憾的是目前Qt4Demo还是全英
文的,这就要求使用者对计算机相关的计算机英语有熟练的掌握,如果能够做到这一点,那
么使用Qt4Demo并不是一件困难的事情。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-36 Qt4Demo的样子
&&& 3.使用Qt Demo
&&& Qt4Demo的界面十分清爽,左边列出了可供参考示例的类别,右边则是这个类别的概
述,在左下角还有导航按钮,可以在各个不同页面间跳转。
&&& 在界面的最下方中间是Qt的标志,左边是【退出】按钮,用于退出Qt4Demo,右边是
用于切换全屏显示和正常显示的按钮。
&&& 下面介绍使用使用QtDemo的主要流程。
&&& 第1步,选择某一个大类
&&& 这里是选择【Dialogs】,方法是用鼠标左键在上面单击一下,Qt4Demo将跳转到该类
----------------------- Page 36-----------------------
别的页面,如图5-37所示。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-37选择QtDemo中大的类别
&&& 第2步,选择细分类别。在左侧的细分类别中点选一个,如【Configuration
Dialog】,如图5-38所示。
----------------------- Page 37-----------------------
&&&&&&&&&&&&&&&&&&&&&&&& 图5-38选中【ConfigurationDialog】后的情形
&&& 第3步,查看示例的运行效果。点击【Lauch】按钮,QtDemo将运行示例程序,如图
5-39所示。
----------------------- Page 38-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-39查看示例运行效果
&&& 第4步,查阅例子代码和参考文档。这实际上是和QtAssistant配合起来使用的,点
击【Documentation】按钮,将调用QtAssistant并切换到相应的页面,如图5-40所示。
----------------------- Page 39-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-40查看例子代码和参考文档
&&& 第5步,使用代码或文档。下面实际上就是QtAssistant的相关操作了,进入到某一
个源代码文件中,可以浏览、复制源代码,或者稍作修改作为自己代码中的一部分。这里不
再详述,请读者自行实验。
&&& 关于QtDemo的使用就就讲解到这里,请读者朋友在使用中与QtAssistant结合起
来,往往能收到事半功倍的效果。
5.4问题与解答
&&& 问:如何使用QtAssistant浏览Qt类结构?
&&& 答:启动QtAssistant后,点击那个home链接标签,就来到它的主页上的&API
Reference&小节中的链接提供了浏览Qt类的几种不同方式,如图所示。&AllClasses&
页面列表会列出QtAPI的每一个类,而&MainClasses&页面列表只会列出那些最为常用
&&& 需要注意的是,通过继承得到的函数的文档会显示在它的基类中,例如,QPushButton
就没有它自己的show()函数,因为它是从QWidget那里继承的函数,并且没有重载。
----------------------- Page 40-----------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5-41通过主页浏览类结构
&&& 问:如果我是使用以前版本的QtDesigner设计的用户界面,比如Qt4.3.4版,那么
它还可以用在基于Qt4.5版构建的工程中吗?
&&& 答:这种情况是可以的,QtDesigner在设计之初就考虑到了这个问题,它是向下兼容
的,但如果使用的是更老的版本,比如Qt3甚至Qt2制作的界面,就不一定了。因为它们
之间的变化实在很大,尤其是从Qt3到Qt4。Qt发展到了今天,在桌面平台上,推荐你还
是尽量使用Qt4;在嵌入式平台则要视你的平台情况选用。
5.5总结与提高
&&& 能够熟练使用Qt基本工具是一项必需的技能。本章重点讲述了QtDesigner、Qt
Assistant以及QtDemo的使用方法和技巧,更多的经验和方法还需要读者朋友在实践中不
断的摸索和总结。
&&& 在Qt应用程序开发过程中,通常并不是仅仅使用某个单一的工具,而是经常需要综合
使用它们。在下一章里,我们将讲解Qt应用程序开发的基本方法和流程,其中的内容也会
涉及到Qt工具的综合使用,请大家注意结合阅读。 [喝小酒的网摘]http://blog./a/10324.htm
相关文章第4章 Qt4集成开发环境
★了解常见的Qt4的IDE
★掌握QtCreator的安装和配置
★掌握Eclipse与Qt4结合使用的安装步骤和配置方法
★掌握VisualStudio与Qt4结合使用的安装步骤和配置方法