QT中按了F4进入到了qt 信号量与槽的模式,怎样返回到原来的状态

保持登录。 单击提交则表示您同意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结合使用的安装步骤和配置方法

我要回帖

更多关于 qt信号和槽 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信