加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 QT教程

QT教程.pdf

QT教程

zhengguo
2009-10-11 0人阅读 举报 0 0 暂无简介

简介:本文档为《QT教程pdf》,可适用于IT/计算机领域

译者:Cavendish整理:http:wwwmculibcomQt教程一第一章:Hello,World!第一个程序是一个简单的HelloWorld例子。它只包含你建立和运行Qt应用程序所需要的最少的代码。上面的图片是这个程序的快照。********************************************************************Qt教程一******************************************************************#include<qapplicationh>#include<qpushbuttonh>intmain(intargc,char**argv){QApplicationa(argc,argv)QPushButtonhello("Helloworld!",)helloresize(,)asetMainWidget(hello)helloshow()returnaexec()}一行一行地解说#include<qapplicationh>这一行包含了QApplication类的定义。在每一个使用Qt的应用程序中都必须使用一个QApplication对象。QApplication管理了各种各样的应用程序的广泛资源比如默认的字体和光标。#include<qpushbuttonh>这一行包含了QPushButton类的定义。参考文档的文件的最上部分提到了使用哪个类就必须包含哪个头文件的说明。译者:Cavendish整理:http:wwwmculibcomQPushButton是一个经典的图形用户界面按钮用户可以按下去也可以放开。它管理自己的观感就像其它每一个QWidget。一个窗口部件就是一个可以处理用户输入和绘制图形的用户界面对象。程序员可以改变它的全部观感和它的许多主要的属性(比如颜色)还有这个窗口部件的内容。一个QPushButton可以显示一段文本或者一个QPixmap。intmain(intargc,char**argv){main()函数是程序的入口。几乎在使用Qt的所有情况下main()只需要在把控制转交给Qt库之前执行一些初始化然后Qt库通过事件来向程序告知用户的行为。argc是命令行变量的数量argv是命令行变量的数组。这是一个CC特征。它不是Qt专有的无论如何Qt需要处理这些变量(请看下面)。QApplicationa(argc,argv)a是这个程序的QApplication。它在这里被创建并且处理这些命令行变量(比如在X窗口下的display)。请注意所有被Qt识别的命令行参数都会从argv中被移除(并且argc也因此而减少)。关于细节请看QApplication::argv()文档。注意:在任何Qt的窗口系统部件被使用之前创建QApplication对象是必须的。QPushButtonhello("Helloworld!",)这里在QApplication之后接着的是第一个窗口系统代码:一个按钮被创建了。这个按钮被设置成显示“Helloworld!”并且它自己构成了一个窗口(因为在构造函数指定为它的父窗口在这个父窗口中按钮被定位)。helloresize(,)这个按酒被设置成像素宽像素高(加上窗口系统边框)。在这种情况下我们不用考虑按钮的位置并且我们接受默认值。asetMainWidget(hello)这个按钮被选为这个应用程序的主窗口部件。如果用户关闭了主窗口部件应用程序就退出了。你不用必须设置一个主窗口部件但绝大多数程序都有一个。helloshow()译者:Cavendish整理:http:wwwmculibcom当你创建一个窗口部件的时候它是不可见的。你必须调用show()来使它变为可见的。returnaexec()这里就是main()把控制转交给Qt并且当应用程序退出的时候exec()就会返回。在exec()中Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。}你现在可以试着编译和运行这个程序了。编译编译一个C应用程序你需要创建一个makefile。创建一个Qt的makefile的最容易的方法是使用Qt提供的连编工具qmake。如果你已经把maincpp保存到它自己的目录了你所要做的就是这些:qmakeprojectqmake第一个命令调用qmake来生成一个pro(项目)文件。第二个命令根据这个项目文件来生成一个(系统相关的)makefile。你现在可以输入make(或者nmake如果你使用VisualStudio)然后运行你的第一个Qt应用程序!行为当你运行它的时候你就会看到一个被单一按钮充满的小窗口在它上面你可以读到著名的词:HellowWorld!练习试着改变窗口的大小。按下按钮。如果你在X窗口下运行使用geometry选项(比如geometryx)来运行这个程序。现在你可以进行第二章了。译者:Cavendish整理:http:wwwmculibcomQt教程一第二章:调用退出你已经在第一章中创建了一个窗口我们现在使这个应用程序在用户让它退出的时候退出。我们也会使用一个比默认字体更好的一个字体。********************************************************************Qt教程一******************************************************************#include<qapplicationh>#include<qpushbuttonh>#include<qfonth>intmain(intargc,char**argv){QApplicationa(argc,argv)QPushButtonquit("Quit",)quitresize(,)quitsetFont(QFont("Times",,QFont::Bold))QObject::connect(quit,SIGNAL(clicked()),a,SLOT(quit()))asetMainWidget(quit)quitshow()returnaexec()}一行一行地解说#include<qfonth>因为这个程序使用了QFont所以它需要包含qfonth。Qt的字体提取和X中提供的可怕的字体提取大为不同字体的载入和使用都已经被高度优化了。QPushButtonquit("Quit",)译者:Cavendish整理:http:wwwmculibcom这时按钮显示“Quit”确切的说这就是当用户点击这个按钮时程序所要做的。这不是一个巧合。因为这个按钮是一个顶层窗口我们还是把作为它的父对象。quitresize(,)我们给这个按钮选择了另外一个大小因为这个文本比“Helloworld!”小一些。我们也可以使用QFontMetrics来设置正确的大小。quitsetFont(QFont("Times",,QFont::Bold))这里我们给这个按钮选择了一个新字体Times字体中的点加粗字体。注意在这里我们调用了这个字体。你也可以改变整个应用程序的默认字体(使用QApplication::setFont())。QObject::connect(quit,SIGNAL(clicked()),a,SLOT(quit()))connect也许是Qt中最重要的特征了。注意connect()是QObject中的一个静态函数。不要把这个函数和socket库中的connect()搞混了。这一行在两个Qt对象(直接或间接继承QObject对象的对象)中建立了一种单向的连接。每一个Qt对象都有signals(发送消息)和slots(接收消息)。所有窗口部件都是Qt对象。它们继承QWidget而QWidget继承QObject。这里quit的clicked()信号和a的quit()槽连接起来了所以当这个按钮被按下的时候这个程序就退出了。信号和槽文档详细描述了这一主题。行为当你运行这个程序的时候你会看到这个窗口比第一章中的那个小一些并且被一个更小的按钮充满。(请看编译来学习如何创建一个makefile和连编应用程序。)练习试着改变窗口的大小。按下按钮。注意!connect()看起来会有一些不同。是不是在QPushButton中还有其它的你可以连接到quit的信号?提示:QPushButton继承了QButton的绝大多数行为。译者:Cavendish整理:http:wwwmculibcom现在你可以进行第三章了。Qt教程一第三章:家庭价值这个例子演示了如何创建一个父窗口部件和子窗口部件。我们将会保持这个程序的简单性并且只使用一个单一的父窗口部件和一个独立的子窗口部件。********************************************************************Qt教程一******************************************************************#include<qapplicationh>#include<qpushbuttonh>#include<qfonth>#include<qvboxh>intmain(intargc,char**argv){QApplicationa(argc,argv)QVBoxboxboxresize(,)QPushButtonquit("Quit",box)quitsetFont(QFont("Times",,QFont::Bold))QObject::connect(quit,SIGNAL(clicked()),a,SLOT(quit()))asetMainWidget(box)boxshow()returnaexec()}译者:Cavendish整理:http:wwwmculibcom一行一行地解说#include<qvboxh>我们添加了一个头文件qvboxh用来获得我们要使用的布局类。QVBoxbox这里我们简单地创建了一个垂直的盒子容器。QVBox把它的子窗口部件排成一个垂直的行一个在其它的上面根据每一个子窗口部件的QWidget::sizePolicy()来安排空间。boxresize(,)我们它的高设置为像素宽为像素。QPushButtonquit("Quit",box)子窗口部件产生了。QPushButton通过一个文本(“text”)和一个父窗口部件(box)生成的。子窗口部件总是放在它的父窗口部件的最顶端。当它被显示的时候它被父窗口部件的边界挡住了一部分。父窗口部件QVBox自动地把这个子窗口部件添加到它的盒子中央。因为没有其它的东西被添加了这个按钮就获得了父窗口部件的所有空间。boxshow()当父窗口部件被显示的时候它会调用所有子窗口部件的显示函数(除非在这些子窗口部件中你已经明确地使用QWidget::hide())。行为这个按钮不再充满整个窗口部件。相反它获得了一个“自然的”大小。这是因为现在的这个新的顶层窗口使用了按钮的大小提示和大小变化策略来设置这个按钮的大小和位置。(请看QWidget::sizeHint()和QWidget::setSizePolicy()来获得关于这几个函数的更详细的信息。)(请看编译来学习如何创建一个makefile和连编应用程序。)练习译者:Cavendish整理:http:wwwmculibcom试着改变窗口的大小。按钮是如何变化的?按钮的大小变化策略是什么?如果你运行这个程序的时候使用了一个大一些的字体按钮的高度发生了什么变化?如果你试图让这个窗口真的变小发生了什么?现在你可以进行第四章了。Qt教程一第四章:使用窗口部件这个例子显示了如何创建一个你自己的窗口部件描述如何控制一个窗口部件的最小大小和最大大小并且介绍了窗口部件的名称。********************************************************************Qt教程一******************************************************************#include<qapplicationh>#include<qpushbuttonh>#include<qfonth>classMyWidget:publicQWidget{public:MyWidget(QWidget*parent=,constchar*name=)}MyWidget::MyWidget(QWidget*parent,constchar*name):QWidget(parent,name){setMinimumSize(,)setMaximumSize(,)QPushButton*quit=newQPushButton("Quit",this,"quit")quit>setGeometry(,,,)quit>setFont(QFont("Times",,QFont::Bold))connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()))译者:Cavendish整理:http:wwwmculibcom}intmain(intargc,char**argv){QApplicationa(argc,argv)MyWidgetwwsetGeometry(,,,)asetMainWidget(w)wshow()returnaexec()}一行一行地解说classMyWidget:publicQWidget{public:MyWidget(QWidget*parent=,constchar*name=)}这里我们创建了一个新类。因为这个类继承了QWidget所以新类是一个窗口部件并且可以最为一个顶层窗口或者子窗口部件(像第三章里面的按钮)。这个类只有一个成员函数构造函数(加上从QWidget继承来的成员函数)。这个构造函数是一个标准的Qt窗口部件构造函数当你创建窗口部件时你应该总是包含一个相似的构造函数。第一个参数是它的父窗口部件。为了生成一个顶层窗口你指定一个空指针作为父窗口部件。就像你看到的那样这个窗口部件默认地被认做是一个顶层窗口。第二个参数是这个窗口部件的名称。这个不是显示在窗口标题栏或者按钮上的文本。这只是分配给窗口部件的一个名称以后可以用来查找这个窗口部件并且这里还有一个方便的调试功能可以完整地列出窗口部件层次。MyWidget::MyWidget(QWidget*parent,constchar*name):QWidget(parent,name)构造函数的实现从这里开始。像大多数窗口部件一样它把parent和name传递给了QWidget的构造函数。{setMinimumSize(,)setMaximumSize(,)译者:Cavendish整理:http:wwwmculibcom因为这个窗口部件不知道如何处理重新定义大小我们把它的最小大小和最大大小设置为相等的值这样我们就确定了它的大小。在下一章我们将演示窗口部件如何响应用户的重新定义大小事件。QPushButton*quit=newQPushButton("Quit",this,"quit")quit>setGeometry(,,,)quit>setFont(QFont("Times",,QFont::Bold))这里我们创建并设置了这个窗口部件的一个名称为“quit”的子窗口部件(新窗口部件的父窗口部件是this)。这个窗口部件名称和按钮文本没有关系只是在这一情况下碰巧相似。注意quit是这个构造函数中的局部变量。MyWidget不能跟踪它但Qt可以当MyWidget被删除的时候默认地它也会被删除。这就是为什么MyWidget不需要一个析构函数的原因。(另外一方面如果你选择删除一个子窗口部件也没什么坏处这个子窗口部件会自动告诉Qt它即将死亡。)setGeometry()调用和上一章的move()和resize()是一样的。connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()))}因为MyWidget类不知道这个应用程序对象它不得不连接到Qt的指针qApp。一个窗口部件就是一个软件组件并且它应该尽量少地知道关于它的环境因为它应该尽可能的通用和可重用。知道了应用程序的名称将会打破上述原则所以在一个组件比如MyWidget需要和应用程序对象对话的这种情况下Qt提供了一个别名qApp。intmain(intargc,char**argv){QApplicationa(argc,argv)MyWidgetwwsetGeometry(,,,)asetMainWidget(w)wshow()returnaexec()}这里我们举例说明了我们的新子窗口部件把它设置为主窗口部件并且执行这个应用程序。行为译者:Cavendish整理:http:wwwmculibcom这个程序和上一章的在行为上非常相似。不同点是我们实现的方式。无论如何它的行为还是有一些小差别。试试改变它的大小你会看到什么?(请看编译来学习如何创建一个makefile和连编应用程序。)练习试着在main()中创建另一个MyWidget对象。发生了什么?试着添加更多的按钮或者把除了QPushButton之外的东西放到窗口部件中。现在你可以进行第五章了。译者:Cavendish整理:http:wwwmculibcomQt教程一第五章:组装积木这个例子显示了创建几个窗口部件并用信号和槽把它们连接起来和如何处理重新定义大小事件。********************************************************************Qt教程一******************************************************************#include<qapplicationh>#include<qpushbuttonh>#include<qsliderh>#include<qlcdnumberh>#include<qfonth>#include<qvboxh>classMyWidget:publicQVBox{public:MyWidget(QWidget*parent=,constchar*name=)}MyWidget::MyWidget(QWidget*parent,constchar*name):QVBox(parent,name){QPushButton*quit=newQPushButton("Quit",this,"quit")quit>setFont(QFont("Times",,QFont::Bold))connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()))QLCDNumber*lcd=newQLCDNumber(,this,"lcd")译者:Cavendish整理:http:wwwmculibcomQSlider*slider=newQSlider(Horizontal,this,"slider")slider>setRange(,)slider>setValue()connect(slider,SIGNAL(valueChanged(int)),lcd,SLOT(display(int)))}intmain(intargc,char**argv){QApplicationa(argc,argv)MyWidgetwasetMainWidget(w)wshow()returnaexec()}一行一行地解说#include<qapplicationh>#include<qpushbuttonh>#include<qsliderh>#include<qlcdnumberh>#include<qfonth>#include<qvboxh>这里显示的是三个新的被包含的头文件。qsliderh和qlcdnumberh在这里是因为我们使用了两个新的窗口部件QSlider和QLCDNumber。qvboxh在这里是因为我们使用了Qt的自动布局支持。classMyWidget:publicQVBox{public:MyWidget(QWidget*parent=,constchar*name=)}MyWidget::MyWidget(QWidget*parent,constchar*name):QVBox(parent,name){MyWidget现在继承了QVBox而不是QWidget。我们通过这种方式来使用QVBox的布局(它可以把它的子窗口部件垂直地放在自己里面)。重新定义大小自动地被QVBox处理因此现在也就被MyWidget处理了。QLCDNumber*lcd=newQLCDNumber(,this,"lcd")lcd是一个QLCDNumber一个可以按像LCD的方式显示数字的窗口部件。这个实例被设置为显示两个数字并且是this的子窗口部件。它被命名为“lcd”。译者:Cavendish整理:http:wwwmculibcomQSlider*slider=newQSlider(Horizontal,this,"slider")slider>setRange(,)slider>setValue()QSlider是一个经典的滑块用户可以通过在拖动一个东西在一定范围内调节一个整数数值的方式来使用这个窗口部件。这里我们创建了一个水平的滑块设置它的范围是~(包括和参见QSlider::setRange()文档)并且它的初始值是。connect(slider,SIGNAL(valueChanged(int)),lcd,SLOT(display(int)))这里我们是用了信号槽机制把滑块的valueChanged()信号和LCD数字的display()槽连接起来了。无论什么时候滑块的值发生了变化它都会通过发射valueChanged()信号来广播这个新的值。因为这个信号已经和LCD数字的display()槽连接起来了当信号被广播的时候这个槽就被调用了。这两个对象中的任何一个都不知道对方。这就是组件编程的本质。槽是和普通C成员函数的方式不同但有着普通C成员函数的方位规则。行为LCD数字反应了你对滑块做的一切并且这个窗口部件很好地处理了重新定义大小事件。注意当窗口被重新定义大小(因为它可以)的时候LDC数字窗口部件也改变了大小但是其它的还是和原来一样(因为如果它们变化了看起来好像很傻)。(请看编译来学习如何创建一个makefile和连编应用程序。)练习试着改变LCD数字添加更多的数字或者改变模式。你甚至可以添加四个按钮来设置基数。你也可以改变滑块的范围。也许使用QSpinBox比滑块更好?试着当LCD数字溢出的时候使这个应用程序退出。现在你可以进行第六章了。译者:Cavendish整理:http:wwwmculibcomQt教程一第六章:组装丰富的积木!这个例子显示了如何把两个窗口部件封装成一个新的组件和使用许多窗口部件是多么的容易。首先我们使用一个自定义的窗口部件作为一个子窗口部件。********************************************************************Qt教程一******************************************************************#include<qapplicationh>#include<qpushbuttonh>#include<qsliderh>#include<qlcdnumberh>#include<qfonth>#include<qvboxh>#include<qgridh>classLCDRange:publicQVBox{public:LCDRange(QWidget*parent=,constchar*name=)}译者:Cavendish整理:http:wwwmculibcomLCDRange::LCDRange(QWidget*parent,constchar*name):QVBox(parent,name){QLCDNumber*lcd=newQLCDNumber(,this,"lcd")QSlider*slider=newQSlider(Horizontal,this,"slider")slider>setRange(,)slider>setValue()connect(slider,SIGNAL(valueChanged(int)),lcd,SLOT(display(int)))}classMyWidget:publicQVBox{public:MyWidget(QWidget*parent=,constchar*name=)}MyWidget::MyWidget(QWidget*parent,constchar*name):QVBox(parent,name){QPushButton*quit=newQPushButton("Quit",this,"quit")quit>setFont(QFont("Times",,QFont::Bold))connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()))QGrid*grid=newQGrid(,this)for(intr=r<r)for(intc=c<c)(void)newLCDRange(grid)}intmain(intargc,char**argv){QApplicationa(argc,argv)MyWidgetwasetMainWidget(w)wshow()returnaexec()}一行一行地解说classLCDRange:publicQVBox{public:LCDRange(QWidget*parent=,constchar*name=)}译者:Cavendish整理:http:wwwmculibcomLCDRange窗口部件是一个没有任何API的窗口部件。它只有一个构造函数。这种窗口部件不是很有用所以我们一会儿会加入一些API。LCDRange::LCDRange(QWidget*parent,constchar*name):QVBox(parent,name){QLCDNumber*lcd=newQLCDNumber(,this,"lcd")QSlider*slider=newQSlider(Horizontal,this,"slider")slider>setRange(,)slider>setValue()connect(slider,SIGNAL(valueChanged(int)),lcd,SLOT(display(int)))}这里直接利用了第五章里面的MyWidget的构造函数。唯一的不同是按钮被省略了并且这个类被重新命名了。classMyWidget:publicQVBox{public:MyWidget(QWidget*parent=,constchar*name=)}MyWidget也是除了一个构造函数之外没有包含任何API。MyWidget::MyWidget(QWidget*parent,constchar*name):QVBox(parent,name){QPushButton*quit=newQPushButton("Quit",this,"quit")quit>setFont(QFont("Times",,QFont::Bold))connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()))这个按钮被放在LCDRange中这样我们就有了一个“Quit”按钮和许多LCDRange对象。QGrid*grid=newQGrid(,this)我们创建了一个四列的QGrid对象。这个QGrid窗口部件可以自动地把自己地子窗口部件排列到行列中你可以指定行和列的数量并且QGrid可以发现它的新子窗口部件并且把它们安放到网格中。for(intr=r<r)for(intc=c<c)(void)newLCDRange(grid)四行四列。译者:Cavendish整理:http:wwwmculibcom我们创建了一个*个LCDRanges所有这些都是这个grid对象的子窗口部件。这个QGrid窗口部件会安排它们。}这就是全部了。行为这个程序显示了在同一时间使用许多窗口部件是多么的容易。其中的滑块和LCD数字的行为在前一章已经提到过了。还有就是就是实现的不同。(请看编译来学习如何创建一个makefile和连编应用程序。)练习在开始的时候使用不同的或者随机的值初始化每个滑块。源代码中的“”出现了次。如果你改变QGrid构造函数中调用的那个会发生什么?改变另外两个又会发生什么呢?为什么呢?现在你可以进行第七章了。译者:Cavendish整理:http:wwwmculibcomQt教程一第七章:一个事物领导另一个这个例子显示了如何使用信号和槽来创建自定义窗口部件和如何使用更加复杂的方式把它们连接起来。首先源文件被我们分成几部分并放在放在t目录下。•tlcdrangeh包含LCDRange类定义。•tlcdrangecpp包含LCDRange类实现。•tmaincpp包含MyWidget和main。一行一行地解说译者:Cavendish整理:http:wwwmculibcomtlcdrangeh这个文件主要利用了第六章的maincpp在这里只是说明一下改变了哪些。#ifndefLCDRANGEH#defineLCDRANGEH这里是一个经典的C语句为了避免出现一个头文件被包含不止一次的情况。如果你没有使用过它这是开发中的一个很好的习惯。#ifndef需要把这个头文件的全部都包含进去。#include<qvboxh>qvboxh被包含了。LCDRange继承了QVBox所以父类的头文件必须被包含。我们在前几章里面偷了一点懒我们通过包含其它一些头文件比如qpushbuttonh这样就可以间接地包含qwidgeth。classQSlider这里是另外一个小伎俩但是没有前一个用的多。因为我们在类的界面中不需要QSlider仅仅是在实现中我们在头文件中使用一个前置的类声明并且在cpp文件中包含一个QSlider的头文件。这会使编译一个大的项目变得更快因为当一个头文件改变的时候很少的文件需要重新编译。它通常可以给大型编译加速两倍或两倍以上。classLCDRange:publicQVBox{QOBJECTpublic:LCDRange(QWidget*parent=,constchar*name=)metaobjectfile注意QOBJECT。这个宏必须被包含到所有使用信号和或槽的类。如果你很好奇它定义了在元对象文件中实现的一些函数。intvalue()constpublicslots:voidsetValue(int)signals:voidvalueChanged(int)这三个成员函数构成了这个窗口部件和程序中其它组件的接口。直到现在LCDRange根本没有一个真正的接口。译者:Cavendish整理:http:wwwmculibcomvalue()是一个可以访问LCDRange的值的公共函数。setValue()是我们第一个自定义槽并且valueChanged()是我们第一个自定义信号。槽必须按通常的方式实现(记住槽也是一个C成员函数)。信号可以在元对象文件中自动实现。信号也遵守C函数的保护法则(比如一个类只能发射它自己定义的或者继承来的信号)。当LCDRange的值发生变化时valueChanged()信号就会被使用你从这个名字中就可以猜到。这将不会是你将会看到的命名为somethingChanged()的最后一个信号。tlcdrangecpp这个文件主要利用了tmaincpp在这里只是说明一下改变了哪些。connect(slider,SIGNAL(valueChanged(int)),lcd,SLOT(display(int)))connect(slider,SIGNAL(valueChanged(int)),SIGNAL(valueChanged(int)))这个代码来自LCDRange的构造函数。第一个connect和你在上一章中看到的一样。第二个是新的它把滑块的valueChanged()信号和这个对象的valueChanged信号连接起来了。带有三个参数的connect()函数连接到this对象的信号或槽。是的这是正确的。信号可以被连接到其它的信号。当第一个信号被发射时第二个信号也被发射。让我们来看看当用户操作这个滑块的时候都发生了些什么。滑块看到自己的值发生了改变并发射了valueChanged()信号。这个信号被连接到QLCDNumber的display()槽和LCDRange的valueChanged()信号。所以当这个信号被发射的时候LCDRange发射它自己的valueChanged()信号。另外QLCDNumber::display()被调用并显示新的数字。注意你并没有保证执行的任何顺序LCDRange::valueChanged()也许在QLCDNumber::display()之前或者之后发射这是完全任意的。intLCDRange::value()const{returnslider>value()}译者:Cavendish整理:http:wwwmculibcomvalue()的实现是直接了当的它简单地返回滑块的值。voidLCDRange::setValue(intvalue){slider>setValue(value)}setValue()的实现是相当直接了当的。注意因为滑块和LCD数字是连接的设置滑块的值就会自动的改变LCD数字的值。另外如果滑块的值超过了合法范围它会自动调节。tmaincppLCDRange*previous=for(intr=r<r){for(intc=c<c){LCDRange*lr=newLCDRange(grid)if(previous)connect(lr,SIGNAL(valueChanged(int)),previous,SLOT(setValue(int)))previous=lr}}maincpp中所有的部分都是上一章复制的除了MyWidget的构造函数。当我们创建个RCDRange对象时我们现在使用信号槽机制连接它们。每一个的valueChanged()信号都和前一个的setValue()槽连接起来了。因为当LCDRange的值发生改变的时候发射一个valueChanged()信号(惊奇!)我们在这里创建了一个信号和槽的“链”。编译为一个多文件的应用程序创建一个makefile和为一个单文件的应用程序创建一个makefile是没有什么不同的。如果你已经把这个例子中的所有文件都保存到它们自己的目录中你所要做的就是这些:qmakeprojectqmake第一个命令调用qmake来生成一个pro(项目)文件。第二个命令根据这个项目文件来生成一个(系统相关的)makefile。你现在可以输入make(或者nmake如果你使用VisualStudio)。行为在开始的时候这个程序看起来和上一章里的一样。试着操作滑块到右下角……译者:Cavendish整理:http:wwwmculibcom练习sevenLCDsbackto使用右下角的滑块并设置所有的LCD到。然后设置通过点击这个滑块的左侧把它设置为。现在你可以通过把最后一个调到左边来把前七个LCD设置回。点

用户评价(1)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/12

QT教程

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利