首页 QT编程入门(全)

QT编程入门(全)

举报
开通vip

QT编程入门(全)第1章 HELLO WORD 原文:QT3.1的帮助文档 翻译:www.qiliang.net 修改:zieckey (zieckey@yahoo.com.cn) 第一个程序是一个简单的Hello World例子。它只包含我们建立和运行Qt应用程序所需要的最少的代码。 下面是它的源代码: /**************************************************************** ** ** Qt教程一 - 1 ** main.cpp ** **************...

QT编程入门(全)
第1章 HELLO WORD 原文:QT3.1的帮助文档 翻译:www.qiliang.net 修改:zieckey (zieckey@yahoo.com.cn) 第一个程序是一个简单的Hello World例子。它只包含我们建立和运行Qt应用程序所需要的最少的代码。 下面是它的源代码: /**************************************************************** ** ** Qt教程一 - 1 ** main.cpp ** ****************************************************************/ #include #include int main( int argc, char **argv ) {     QApplication a( argc, argv );     QPushButton hello( "Hello world!", 0 );     hello.resize( 100, 30 );     a.setMainWidget( &hello );     hello.show();     return a.exec(); } 用 vi 和 gedit 等编辑工具编辑这个 main.cpp 文件, 保存到一个单独的目录,比如说 /root/helloworld 那么 /root/helloworld 目录下就有了刚刚编辑的 main.cpp 文件 好拉,现在我们尝试着编译它,下面吧详细的 步骤 新产品开发流程的步骤课题研究的五个步骤成本核算步骤微型课题研究步骤数控铣床操作步骤 记录如下: [root@localhost root]# mkdir /root/helloworld [root@localhost root]# cd /root/helloworld/ [root@localhost helloworld]# vi main.cpp [root@localhost helloworld]# qmake -project [root@localhost helloworld]# qmake [root@localhost helloworld]# make g++ -c -pipe -Wall -W -O2 -march=i386 -mcpu=i686 -g -DGLX_GLXEXT_LEGACY -fno-use-cxa-atexit -fno-exceptions  -DQT_NO_DEBUG -I/usr/lib/qt-3.1/mkspecs/default -I. -I. -I/usr/lib/qt-3.1/include -o main.o main.cpp g++  -o helloworld main.o   -L/usr/lib/qt-3.1/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm [root@localhost helloworld]# ls helloworld  helloworld.pro  main.cpp  main.o  Makefile [root@localhost helloworld]# ./helloworld & 上面我们看到了程序运行效果,下面我们来一行一行地解说源程序:     #include 这一行包含了QApplication类的定义。在每一个使用Qt的应用程序中都必须使用一个QApplication对象。QApplication管理了各种各样的应用程序的广泛资源,比如默认的字体和光标。     #include 这一行包含了QPushButton类的定义。参考文档的文件的最上部分提到了使用哪个类就必须包含哪个头文件的说明。 QPushButton是一个经典的图形用户界面按钮,用户可以按下去,也可以放开。它管理自己的观感,就像其它每一个QWidget。一个窗口部件就是一个可以处理用户输入和绘制图形的用户界面对象。程序员可以改变它的全部观感和它的许多主要的属性(比如颜色),还有这个窗口部件的内容。一个QPushButton可以显示一段文本或者一个QPixmap。     int main( int argc, char **argv )     { main() 函数 excel方差函数excelsd函数已知函数     2 f x m x mx m      2 1 4 2拉格朗日函数pdf函数公式下载 是程序的入口。几乎在使用Qt的所有情况下,main()只需要在把控制转交给Qt库之前执行一些初始化,然后Qt库通过事件来向程序告知用户的行为。 argc是命令行变量的数量,argv是命令行变量的数组。这是一个C/C++特征。它不是Qt专有的,无论如何Qt需要处理这些变量(请看下面)。         QApplication a( argc, argv ); a是这个程序的QApplication。它在这里被创建并且处理这些命令行变量(比如在X窗口下的-display)。请注意,所有被Qt识别的命令行参数都会从argv中被移除(并且argc也因此而减少)。关于细节请看QApplication::argv()文档。 注意:在任何Qt的窗口系统部件被使用之前创建QApplication对象是必须的。         QPushButton hello( "Hello world!", 0 ); 这里,在QApplication之后,接着的是第一个窗口系统代码:一个按钮被创建了。 这个按钮被设置成显示“Hello world!”并且它自己构成了一个窗口(因为在构造函数指定0为它的父窗口,在这个父窗口中按钮被定位)。         hello.resize( 100, 30 ); 这个按扭被设置成100像素宽,30像素高(加上窗口系统边框)。在这种情况下,我们不用考虑按钮的位置,并且我们接受默认值。         a.setMainWidget( &hello ); 这个按钮被选为这个应用程序的主窗口部件。如果用户关闭了主窗口部件,应用程序就退出了。 我们不用必须设置一个主窗口部件,但绝大多数程序都有一个。         hello.show(); 当我们创建一个窗口部件的时候,它是不可见的。我们必须调用show()来使它变为可见的。         return a.exec(); 这里就是main()把控制转交给Qt,并且当应用程序退出的时候exec()就会返回。 在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。     } 我们现在可以试着编译和运行这个程序了。 编译 编译一个C++应用程序,我们需要创建一个makefile。创建一个Qt的makefile的最容易的方法是使用Qt提供的连编工具qmake。如果我们已经把main.cpp保存到它自己的目录了,我们所要做的就是这些: qmake -project qmake 第一个命令调用qmake来生成一个.pro(项目)文件。第二个命令根据这个项目文件来生成一个(系统相关的)makefile。我们现在可以输入make(或者nmake,如果我们使用Visual Studio),然后运行我们的第一个Qt应用程序! make 行为 当我们运行它的时候,我们就会看到一个被单一按钮充满的小窗口,在它上面我们可以读到著名的词: Hello w World! 练习 试着改变窗口的大小。按下按钮。如果我们在X窗口下运行,使用-geometry选项 (比如,-geometry 100x200+10+20   [root@localhost helloworld]# ./helloworld -geometry 100x200+100+200 ) 来运行这个程序。 第二章:调用退出 原文:QT3.1的帮助文档 翻译:www.qiliang.net 修改:zieckey (zieckey@yahoo.com.cn) 我们已经在第一章中创建了一个窗口,这让我们体会到Linux下GUI(图形用户界面/接口)编程的乐趣。 我们现在使这个应用程序响应用户的输入信号(不包括窗口的最大化、关闭等固有的属性),在用户让它退出的时候退出。 我们也会使用一个比默认字体更好的一个字体。 /**************************************************************** ** ** Qt教程一 - 2 ** ****************************************************************/ #include #include #include int main( int argc, char **argv ) {     QApplication a( argc, argv );     QPushButton quit( "Quit", 0 );     quit.resize( 75, 30 );     quit.setFont( QFont( "Times", 18, QFont::Bold ) );     QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) );     a.setMainWidget( &quit );     quit.show();     return a.exec(); } 一行一行地解说     #include 因为这个程序使用了QFont,所以它需要包含qfont.h。Qt的字体提取和X中提供的可怕的字体提取大为不同,字体的载入和使用都已经被高度优化了。         QPushButton quit( "Quit", 0 ); 这时,按钮显示“Quit”,确切的说这就是当用户点击这个按钮时程序所要做的。这不是一个巧合。因为这个按钮是一个顶层窗口,我们还是把0作为它的父对象,也就是说他没有父对象,正如前面说说,这个按钮是一个顶层窗口,所以没有父对象。         quit.resize( 75, 30 ); 我们给这个按钮选择了另外一个大小,因为这个文本比“Hello world!”小一些。我们也可以使用QFontMetrics来设置正确的大小。         quit.setFont( QFont( "Times", 18, QFont::Bold ) ); 这里我们给这个按钮选择了一个新字体,Times字体中的18点加粗字体。注意在这里我们调用了这个字体。 我们也可以改变整个应用程序的默认字体(使用QApplication::setFont())。         QObject::connect( &quit,  ), &a, SLOT(quit()) ); connect也许是Qt中最重要的特征了。注意connect()是QObject中的一个静态函数。不要把这个函数和socket库中的connect()搞混了。 这一行在两个Qt对象(直接或间接继承QObject对象的对象)中建立了一种单向的连接。每一个Qt对象都有signals(信号--发送消息)和slots(槽--接收消息)。所有窗口部件都是Qt对象。它们继承QWidget,而QWidget继承QObject。第一个对象 “&quit”发送一个信号,以 SIGNAL(clicked() 方式发送一个 click() 信号;第二个对象“&a”得到这个信号并作出响应,响应通过SLOT(quit())方式到达 a.quit() 函数并执行该函数定义的功能。 这里" QPushButton quit "的clicked()信号和" QApplication a "的quit()槽连接起来了,所以当这个按钮被按下的时候, 这个按钮就发送一个信号,而与该信号连接的槽就捕捉到该信号,然后执行槽的函数体,这里就是 quit() 函数,然后这个程序就退出了。 信号和槽文档详细描述了这一主 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 。 行为 当我们运行这个程序的时候,我们会看到这个窗口比第一章中的那个小一些,并且被一个更小的按钮充满。 (请看上一章来学习如何创建一个makefile文件和连编应用程序。) 练习 1. 试着改变窗口的大小。按下按钮。注意!connect()看起来会有一些不同。 2. 是不是在QPushButton中还有其它的我们可以连接到quit的信号?提示:QPushButton继承了QButton的绝大多数行为。 3. 试着改变这个按钮上显示的信息?例如改变为“Close”; 4. 将quit.show();这个语句注释掉看看效果! 5. 试着将 QPushButton quit( "Quit", 0 ); 改为一个指针类型的对象看看, 例如 QPushButton ×pQuit = .....应该如何去实现呢? 后面的代码又有那些变化呢? 第三章:家庭价值 原文:QT3.1的帮助文档 翻译:www.qiliang.net 修改:zieckey (zieckey@yahoo.com.cn) 这个例子演示了如何创建一个父窗口部件,然后在这个父窗口部件上再创建一个子窗口部件。 我们将会保持这个程序的简单性,并且只使用一个单一的父窗口部件和一个独立的子窗口部件。 /**************************************************************** ** ** Qt教程一 - 3 ** ****************************************************************/ #include #include #include #include int main( int argc, char **argv ) {     QApplication a( argc, argv );     QVBox box;     box.resize( 200, 120 );     QPushButton quit( "Quit", &box );     quit.setFont( QFont( "Times", 18, QFont::Bold ) );     QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) );     a.setMainWidget( &box );     box.show();     return a.exec(); } 一行一行地解说     #include 我们添加了一个头文件qvbox.h用来获得我们要使用的布局类。         QVBox box; 这里我们简单地创建了一个垂直的盒子容器。QVBox把它的子窗口部件排成一个垂直的行,一个在其它的上面,根据每一个子窗口部件的QWidget::sizePolicy()来安排空间。         box.resize( 200, 120 ); 我们它的高设置为120像素,宽为200像素。         QPushButton quit( "Quit", &box ); 子窗口部件产生了。这里看看第二个参数" &box ",意思就是" QPushButton quit "这个小窗口(按钮)的父窗口是" box "。 QPushButton通过一个文本(“Quit”)和一个父窗口部件(box)生成的。子窗口部件总是放在它的父窗口部件的最顶端。当它被显示的时候,它被父窗口部件的边界挡住了一部分。 父窗口部件,QVBox,自动地把这个子窗口部件添加到它的盒子中央。因为没有其它的东西被添加了,这个按钮就获得了父窗口部件的所有空间。         box.show(); 当父窗口部件被显示的时候,它会调用所有子窗口部件的显示函数(除非在这些子窗口部件中我们已经明确地使用QWidget::hide())。 行为 这个按钮不再充满整个窗口部件。相反,它获得了一个相当“自然的”大小。这是因为现在的这个新的顶层窗口,使用了按钮的大小提示和大小变化策略来设置这个按钮的大小和位置。(请看QWidget::sizeHint()和QWidget::setSizePolicy()来获得关于这几个函数的更详细的信息。) (请看第一章来学习如何创建一个makefile文件和连编应用程序。) 练习 试着改变窗口的大小。按钮是如何变化的?按钮的大小变化策略是什么? 如果我们运行这个程序的时候使用了一个大一些的字体,按钮的高度发生了什么变化? 如果我们试图让这个窗口真的变小,发生了什么? 第四章:使用窗口部件 原文:QT3.1的帮助文档 翻螂:www.qiliang.net 修改:zieckey (zieckey@yahoo.com.cn) 这个例子显示了如何创建一个我们自己的窗口部件,描述如何控制一个窗口部件的最小大小和最大大小,并且介绍了窗口部件的名称。 我们将会保持这个程序的简单性,并且也是只使用一个单一的父窗口部件和一个独立的子窗口部件。 /**************************************************************** ** ** Qt教程一 - 4 ** ****************************************************************/ #include #include #include class MyWidget : public QWidget { public:     MyWidget( QWidget *parent=0, const char *name=0 ); }; MyWidget::MyWidget( QWidget *parent, const char *name )         : QWidget( parent, name ) {     setMinimumSize( 200, 120 );     setMaximumSize( 200, 120 );     QPushButton *quit = new QPushButton( "Quit", this, "quit" );     quit->setGeometry( 62, 40, 75, 30 );     quit->setFont( QFont( "Times", 18, QFont::Bold ) );     connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) ); } int main( int argc, char **argv ) {     QApplication a( argc, argv );     MyWidget w;     w.setGeometry( 100, 100, 200, 120 );     a.setMainWidget( &w );     w.show();     return a.exec(); } 一行一行地解说     class MyWidget : public QWidget     {     public:         MyWidget( QWidget *parent=0, const char *name=0 );     }; 这里我们创建了一个新类。因为这个类继承了QWidget,所以新类也是一个窗口部件,并且可以成为一个顶层窗口或者子窗口部件(像第三章里面的按钮)。 这个类只有一个成员函数--构造函数(当然另外还要加上从QWidget继承来的成员函数)。这个构造函数是一个 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的Qt窗口部件构造函数,当我们创建窗口部件时,我们应该总是包含一个这个类似的构造函数。 第一个参数是指向它的父窗口部件的指针。为了生成一个顶层窗口,我们指定一个空指针作为父窗口部件。就像我们看到的那样,这个窗口部件默认地被认做是一个顶层窗口,因为他带有一个缺损的参数:QWidget *parent=0 第二个参数是这个窗口部件的名称。这个不是显示在窗口标题栏或者按钮上的文本。这只是分配给窗口部件的一个名称,以后可以用来查找这个窗口部件。     MyWidget::MyWidget( QWidget *parent, const char *name )             : QWidget( parent, name ) 构造函数的实现从这里开始。像大多数窗口部件一样,它把parent和name传递给了QWidget的构造函数。     {         setMinimumSize( 200, 120 );         setMaximumSize( 200, 120 ); 因为这个窗口部件不知道如何处理重新定义大小,我们把它的最小大小和最大大小设置为相等的值,这样我们就确定了它的大小。在下一章,我们将演示窗口部件如何响应用户的重新定义大小事件。         QPushButton *quit = new QPushButton( "Quit", this, "quit" );         quit->setGeometry( 62, 40, 75, 30 );         quit->setFont( QFont( "Times", 18, 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。     int main( int argc, char **argv )     {         QApplication a( argc, argv );         MyWidget w;         w.setGeometry( 100, 100, 200, 120 );         a.setMainWidget( &w );         w.show();         return a.exec();     } 这里我们举例说明了我们的新子窗口部件,把它设置为主窗口部件,并且执行这个应用程序。 行为 这个程序和上一章的在行为上非常相似。不同点是我们实现的方式。无论如何它的行为还是有一些小差别。试试改变它的大小,我们会看到什么? (请看第一章来学习如何创建一个makefile文件和连编应用程序。) 练习 试着在main()中创建另一个MyWidget对象。发生了什么? 试着添加更多的按钮或者把除了QPushButton之外的东西放到窗口部件中。 第五章:组装积木 原文:QT3.1的帮助文档 翻译:www.qiliang.net 修改:zieckey (zieckey@yahoo.com.cn) 这个例子显示了创建几个窗口部件并用信号和槽把它们连接起来,和如何处理重新定义大小事件。 /**************************************************************** ** ** Qt教程一 - 5 ** ****************************************************************/ #include #include #include #include #include #include class MyWidget : public QVBox { public:     MyWidget( QWidget *parent=0, const char *name=0 ); }; MyWidget::MyWidget( QWidget *parent, const char *name )         : QVBox( parent, name ) {     QPushButton *quit = new QPushButton( "Quit", this, "quit" );     quit->setFont( QFont( "Times", 18, QFont::Bold ) );     connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );     QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd" );     QSlider * slider = new QSlider( Horizontal, this, "slider" );     slider->setRange( 0, 99 );     slider->setValue( 0 );     connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) ); } int main( int argc, char **argv ) {     QApplication a( argc, argv );     MyWidget w;     a.setMainWidget( &w );     w.show();     return a.exec(); } 一行一行地解说     #include     #include     #include     #include     #include     #include 这里显示的是三个新的被包含的头文件。qslider.h和qlcdnumber.h在这里是因为我们使用了两个新的窗口部件,QSlider和QLCDNumber。qvbox.h在这里是因为我们使用了Qt的自动布局支持。     class MyWidget : public QVBox     {     public:         MyWidget( QWidget *parent=0, const char *name=0 );     };     MyWidget::MyWidget( QWidget *parent, const char *name )             : QVBox( parent, name )     { MyWidget现在继承了QVBox,而不是QWidget。我们通过这种方式来使用QVBox的布局(它可以把它的子窗口部件垂直地放在自己里面)。重新定义大小自动地被QVBox处理,因此现在也就被MyWidget处理了。         QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd" ); lcd是一个QLCDNumber,一个可以按像LCD的方式显示数字的窗口部件。这个实例被设置为显示两个数字,并且是this的子窗口部件。它被命名为“lcd”。         QSlider * slider = new QSlider( Horizontal, this, "slider" );         slider->setRange( 0, 99 );         slider->setValue( 0 ); QSlider是一个经典的滑块,用户可以通过在拖动一个东西在一定范围内调节一个整数数值的方式来使用这个窗口部件。这里我们创建了一个水平的滑块,设置它的范围是0~99(包括0和99,参见QSlider::setRange()文档)并且它的初始值是0。         connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) ); 这里我们是用了信号/槽 机制 综治信访维稳工作机制反恐怖工作机制企业员工晋升机制公司员工晋升机制员工晋升机制图 把滑块的valueChanged()信号和LCD数字的display()槽连接起来了。 这一行在两个Qt对象(直接或间接继承QObject对象的对象)中建立了一种单向的连接。每一个Qt对象都有signals(信号--发送消息)和slots(槽--接收消息)。所有窗口部件都是Qt对象。它们继承QWidget,而QWidget继承QObject。第一个对象 “slider”发送一个信号,以 SIGNAL(valueChanged(int) 方式发送一个 valueChanged(int) 信号,并且带有参数,该参数随之一起发送出去;第二个对象“lcd”得到这个信号并作出响应,响应通过 SLOT(display(int)) 方式到达 lcd->display(int),并传入一个参数,该参数由信号中发出的参数决定,然汉执行该函数定义的功能。 无论什么时候滑块的值发生了变化,它都会通过发射valueChanged()信号来广播这个新的值。因为这个信号已经和LCD数字的display()槽连接起来了,当信号被广播的时候,这个槽就被调用了。这两个对象中的任何一个都不知道对方。这就是组件编程的本质。 槽和普通C++成员函数的方式不同,但有着普通C++成员函数的应用和书写规则。 行为 LCD数字反应了你对滑块做的一切,并且这个窗口部件很好地处理了重新定义大小事件。注意当窗口被重新定义大小(因为它可以)的时候,LDC数字窗口部件也改变了大小,但是其它的还是和原来一样(因为如果它们变化了,看起来好像很傻)。 (请看第一章来学习如何创建一个makefile文件和连编应用程序。) 练习 试着改变LCD数字,添加更多的数字或者改变模式。你甚至可以添加四个按钮来设置基数。 你也可以改变滑块的范围。 也许使用QSpinBox比滑块更好? 试着当LCD数字溢出的时候使这个应用程序退出。 现在你可以进行第六章了。 第六章:组装丰富的积木! 原文:QT3.1的帮助文档 翻螂:www.qiliang.net 修改:zieckey (zieckey@yahoo.com.cn) 这个例子显示了如何把两个窗口部件封装成一个新的组件和使用许多窗口部件是多么的容易。首先,我们使用一个自定义的窗口部件作为一个子窗口部件。 /**************************************************************** ** ** Qt教程一 - 6 ** ****************************************************************/ #include #include #include #include #include #include #include class LCDRange : public QVBox { public:     LCDRange( QWidget *parent=0, const char *name=0 ); }; LCDRange::LCDRange( QWidget *parent, const char *name )         : QVBox( parent, name ) {     QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd"  );     QSlider * slider = new QSlider( Horizontal, this, "slider" );     slider->setRange( 0, 99 );     slider->setValue( 0 );     connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) ); } class MyWidget : public QVBox { public:     MyWidget( QWidget *parent=0, const char *name=0 ); }; MyWidget::MyWidget( QWidget *parent, const char *name )         : QVBox( parent, name ) {     QPushButton *quit = new QPushButton( "Quit", this, "quit" );     quit->setFont( QFont( "Times", 18, QFont::Bold ) );     connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );     QGrid *grid = new QGrid( 4, this );     for( int r = 0 ; r < 4 ; r++ )         for( int c = 0 ; c < 4 ; c++ )             (void)new LCDRange( grid ); } int main( int argc, char **argv ) {     QApplication a( argc, argv );     MyWidget w;     a.setMainWidget( &w );     w.show();     return a.exec(); } 一行一行地解说     class LCDRange : public QVBox     {     public:         LCDRange( QWidget *parent=0, const char *name=0 );     }; LCDRange窗口部件是一个没有任何API的窗口部件。它只有一个构造函数。这种窗口部件不是很有用,所以我们过一会儿会加入一些API。     LCDRange::LCDRange( QWidget *parent, const char *name )             : QVBox( parent, name )     {         QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd"  );         QSlider * slider = new QSlider( Horizontal, this, "slider" );         slider->setRange( 0, 99 );         slider->setValue( 0 );         connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) );     } 这里直接利用了第五章里面的MyWidget的构造函数。唯一的不同是按钮被省略了并且这个类被重新命名了。如果我们还是不很清楚这个构造函数里面的语句含义的话,我们在重复说明如下。   QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd" ); lcd是一个QLCDNumber,一个可以按像LCD的方式显示数字的窗口部件。这个实例被设置为显示两个数字,并且是this的子窗口部件。它被命名为“lcd”。         QSlider * slider = new QSlider( Horizontal, this, "slider" );         slider->setRange( 0, 99 );         slider->setValue( 0 ); QSlider是一个经典的滑块,用户可以通过在拖动一个东西在一定范围内调节一个整数数值的方式来使用这个窗口部件。这里我们创建了一个水平的滑块,设置它的范围是0~99(包括0和99,参见QSlider::setRange()文档)并且它的初始值是0。         connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) ); 这里我们是用了信号/槽机制把滑块的valueChanged()信号和LCD数字的display()槽连接起来了。 这一行在两个Qt对象(直接或间接继承QObject对象的对象)中建立了一种单向的连接。每一个Qt对象都有signals(信号--发送消息)和slots(槽--接收消息)。所有窗口部件都是Qt对象。它们继承QWidget,而QWidget继承QObject。第一个对象 “slider”发送一个信号,以 SIGNAL(valueChanged(int) 方式发送一个 valueChanged(int) 信号,并且带有参数,该参数随之一起发送出去;第二个对象“lcd”得到这个信号并作出响应,响应通过 SLOT(display(int)) 方式到达 lcd->display(int),并传入一个参数,该参数由信号中发出的参数决定,然汉执行该函数定义的功能。     class MyWidget : public QVBox     {     public:         MyWidget( QWidget *parent=0, const char *name=0 );     }; MyWidget也是除了一个构造函数之外没有包含任何API。好的我们来添加一些API。     MyWidget::MyWidget( QWidget *parent, const char *name )             : QVBox( parent, name )     {         QPushButton *quit = new QPushButton( "Quit", this, "quit" );         首先实例化了一个 QPushButton 按钮,                        quit->setFont( QFont( "Times", 18, QFont::Bold ) );         然后设置按钮的字体,                connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) ); 之后我们设置了这个按钮的响应信号,当我们点击按钮的时候,应用程序退出. 这个按钮被放在 MyWidget 中。         QGrid *grid = new QGrid( 4, this ); 我们创建了一个四列的QGrid对象。这个QGrid窗口部件可以自动地把自己地子窗口部件排列到行列中,你可以指定行和列的数量,并且QGrid可以发现它的新子窗口部件并且把它们安放到网格中。         for( int r = 0 ; r < 4 ; r++ )             for( int c = 0 ; c < 4 ; c++ )                 (void)new LCDRange( grid ); 四行,四列。 我们创建了一个4*4个LCDRanges,所有这些都是这个grid对象的子窗口部件。这个QGrid窗口部件会安排它们。这样我们就有了一个“Quit”按钮和许多LCDRange对象。     } 这就是全部了。 行为 这个程序显示了在同一时间使用许多窗口部件是多么的容易。其中的滑块和LCD数字的行为在前一章已经提到过了。这里就是实现的不同。 (请看第一章来学习如何创建一个makefile文件和连编应用程序。) 练习 在开始的时候使用不同的或者随机的值初始化每个滑块。 源代码中的“4”出现了3次。如果你改变QGrid构造函数中调用的那个,会发生什么?改变另外两个又会发生什么呢?为什么呢? 现在你可以进行第七章了。 第七章:一个事物领导另一个 原文:QT3.1的帮助文档 翻螂:www.qiliang.net 修改:zieckey (zieckey@yahoo.com.cn) 这个例子显示了如何使用信号和槽来创建自定义窗口部件,和如何使用更加复杂的方式把它们连接起来。首先,源文件被我们分成几部分并放在放在t7目录下。     * t7/lcdrange.h包含LCDRange类定义。     * t7/lcdrange.cpp包含LCDRange类实现。     * t7/main.cpp包含MyWidget和main。 /**************************************************************** ** ** Definition of LCDRange class, Qt tutorial 7 ** ** lcdrange.h ****************************************************************/ #ifndef LCDRANGE_H #define LCDRANGE_H #include class QSlider; class LCDRange : public QVBox {     Q_OBJECT public:     LCDRange( QWidget *parent=0, const char *name=0 );     int value() const; public slots:     void setValue( int ); signals:     void valueChanged( int ); private:     QSlider *slider; }; #endif // LCDRANGE_H     /**************************************************************** ** ** Implementation of LCDRange class, Qt tutorial 7 ** ** lcdrange.cpp ** ****************************************************************/ #include "lcdrange.h" #include #include LCDRange::LCDRange( QWidget *parent, const char *name )         : QVBox( parent, name ) {     QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd"  );     slider = new QSlider( Horizontal, this, "slider" );     slider->setRange( 0, 99 );     slider->setValue( 0 );     connect( slider, SIGNAL(valueChanged(int)),       lcd, SLOT(display(int)) );     connect( slider, SIGNAL(valueChanged(int)),       SIGNAL(valueChanged(int)) ); } int LCDRange::value() const {     return slider->value(); } void LCDRange::setValue( int value ) {     slider->setValue( value ); }   /**************************************************************** ** ** Qt tutorial 7 ** ** main.cpp ** ****************************************************************/ #include #include #include #include #include #include #include "lcdrange.h" class MyWidget : public QVBox { public:     MyWidget( QWidget *parent=0, const char *name=0 ); }; MyWidget::MyWidget( QWidget *parent, const char *name )         : QVBox( parent, name ) {     QPushButton *quit = new QPushButton( "Quit", this, "quit" );     quit->setFont( QFont( "Times", 18, QFont::Bold ) );     connect( quit, SIGNAL(clicked()), qApp, SLO
本文档为【QT编程入门(全)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_423250
暂无简介~
格式:doc
大小:227KB
软件:Word
页数:65
分类:互联网
上传时间:2012-10-17
浏览量:94