Linux 版 (精华区)

发信人: tcpip (高级草包), 信区: Linux
标  题: Qt tutorial 4---------"Let there be widgets"
发信站: 紫 丁 香 (Fri May  5 19:50:21 2000) WWW-POST

Subject Qt tutorial 4---------"Let there be widgets"  
Posted by kensou 
Posted on 5/2/2000 8:00 PM 








第四章: Let There Be Widgets




这个例子演示如何创建你自己的控件,怎样控制控件的最大和最小尺寸.还将引入控间名称
(widget names). 


/****************************************************************
**
** Qt tutorial 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();
}


Line by Line Walk-Through

class MyWidget : public QWidget
{
public:
MyWidget( QWidget *parent=0, const char *name=0 );
};

在这里我们创建了一个新的类(class).因为这个类继承于QWidget类,所以这个类是一个控
件,并且它可能是一个顶层窗口(top level window)或者是一个控件.(就象第三章的按钮
). 

这个类只有一个成员:构造函数(另外还有从QWidget继承来的成员).次构造函数是一个标
准的Qt控件构造函数;当你创建一个控件时,你总要包含一个简单的构造函数. 

第一个参数是它的父控件.如果要创建一个顶层控件,你要指明为一个空指针作为父控件. 
如同你所见的,在缺省情况下,控件是一个顶层窗口. 

lookup this widget later. Widget names will become really useful when Qt's 
GUI designer is finished. 第二个参数是此控件的名字.它不是在标题栏(title bar) 
或在按钮中.它是一个于控件相连的名字,它存在的目的是使次控件在以后能易于被 识别
(lookup)控件名字在以后会变得十分有用. 


MyWidget::MyWidget( QWidget *parent, const char *name )
: QWidget( parent, name )

造函数是从这里开始执行的.象所有的控件一样,它仅仅是把parent和name 传递给了
QWidget的构造函数. 


{
setMinimumSize( 200, 120 );
setMaximumSize( 200, 120 );

因为这个控件不知道如何控制尺寸调整,我们就通过设置其最大尺寸和最小尺寸相等来弥
补这一点. 在下一章,我们将演示如何让控件响应resize事件. 


QPushButton *quit = new QPushButton( "Quit", this, "quit" );
quit->setGeometry( 62, 40, 75, 30 );
quit->setFont( QFont( "Times", 18, QFont::Bold ) );

这里,我们为这个控见定义并创建了一个名为"quit"的子控件.这个控件的名字与在按钮上
显示的文字并没有什么联系,在本实例中,它们仅仅是碰巧相似而已. 

注意:quit是构造函数的一个局部变量,MyWidget并不能一直保持它,但是Qt可以,而且会在
MyWidget被销毁时自动地把它销毁.这就是MyWidget不需要析构函数的原因.另一方面,如
果你选择使用析构函数来销毁它也没有什么负面影响,子控件在将被销毁时会告知Qt. 

setGeometry()函数的作用和前几章中的move()加上resize()的作用一样. 


connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
}

因为MyWidget类不知道应用对象的名称,所以它与一个指向应用对象的Qt指针qApp.相连. 


控件是一个(软件元件)software component,而且应该尽量少地依赖于其使用环境以提高
它的通用性. 

要知道应用对象的名字会打破这个原则,所以Qt就提供了一个宏,qApp,来告诉象MyWidget
一样需要知道应用对象名字的元件. 


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();
}

这里我们用刚才声明的新控件定义了一个控件对象,设置它为主控件并执行应用. 


程序行为
这个程序在行为上于前一个十分相似,不同的是在我们的实现方法上.仅仅是在习性上有轻
微的区别. 尝试改变它的尺寸来观察一下. 


练习
尝试在main()中建立另一个MyWidget对象,会有什么情况发生? 

尝试增加更多的按钮或者在控件中增加除了QPushButton外的控件. 

可以改变一下背景颜色(background color) 

你现在可以进入第五章了. 

[前一章] [后一章] [教程目录] 



------------------------------------------------------------------------------
--

Copyright ?1999 Troll Tech Trademarks Qt version 1.44 


孤帆慕云浮,
一剑平江湖。
垂手叹镜月,
悔当草结庐
 

--
"这一千多年没写诗了?"
"写了, 不过只写了两句."
"千年得两句, 一定是万古丽句了. 念来听听."
"好吧, 我现丑了" 太白星清了清嗓子, 浑厚的男中音在天庭响起:
大海啊, 都是水;
骏马啊, 四条腿;

※ 来源:·紫 丁 香 bbs.hit.edu.cn·[FROM: freesrc.hit.edu] 
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.564毫秒