Linux 版 (精华区)
发信人: tcpip (高级草包), 信区: Linux
标 题: Qt tutorial 5-------"Building blocks"
发信站: 紫 丁 香 (Fri May 5 19:50:58 2000) WWW-POST
Subject Qt tutorial 5-------"Building blocks"
Posted by kensou
Posted on 5/2/2000 8:05 PM
第五章: Building Blocks
这个例程演示了如何创建并使用信号连接结合控件,以及如何处理尺寸调节事件.
/****************************************************************
**
** Qt tutorial 5
**
****************************************************************/
#include
#include
#include
#include
#include
class MyWidget : public QWidget
{
public:
MyWidget( QWidget *parent=0, const char *name=0 );
protected:
void resizeEvent( QResizeEvent * );
private:
QPushButton *quit;
QScrollBar *sBar;
QLCDNumber *lcd;
};
MyWidget::MyWidget( QWidget *parent, const char *name )
: QWidget( parent, name )
{
setMinimumSize( 200, 200 );
quit = new QPushButton( "Quit", this, "quit" );
quit->setGeometry( 10, 10, 75, 30 );
quit->setFont( QFont( "Times", 18, QFont::Bold ) );
connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
lcd = new QLCDNumber( 2, this, "lcd" );
lcd->move( 10, quit->y() + quit->height() + 10 );
sBar = new QScrollBar( 0, 99, // range
1, 10, // line/page steps
0, // inital value
QScrollBar::Horizontal, // orientation
this, "scrollbar" );
connect( sBar, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) );
}
void MyWidget::resizeEvent( QResizeEvent * )
{
sBar->setGeometry( 10, height() - 10 - 16, width() - 20, 16 );
lcd->resize( sBar->width(), sBar->y() - lcd->y() - 5 );
}
int main( int argc, char **argv )
{
QApplication a( argc, argv );
MyWidget w;
w.setGeometry( 100, 100, 200, 200 );
a.setMainWidget( &w );
w.show();
return a.exec();
}
逐行解释
#include
#include
#include
#include
#include
本例程新加入了两个新文件:qscrollbar.h 和 qlcdnumber.h, 因为我们使用了两个新的
类:QScrollBar 和 QLCDNumber.
class MyWidget : public QWidget
{
public:
MyWidget( QWidget *parent=0, const char *name=0 );
与前一章相比没有什么不同.
protected:
void resizeEvent( QResizeEvent * );
MyWidget 现在获得了处理尺寸调节事件的能力.
resizeEvent() 是QWidget 中的一个常用的为各种控件传送事件的虚函数. 这些事件函数
构成了Qt的中央控制流机制(mechanism)部分,另外一部分构成了 signal/slot 机制.
毫无疑问,只要用户或程序中的一部分调整了控件的尺寸,该函数就会调用.
private:
QPushButton *quit;
QScrollBar *sBar;
QLCDNumber *lcd;
};
在第三章中,MyWidget 并不能识别其子控件. 但现在它具备该功能(于是就能调整它们).
MyWidget::MyWidget( QWidget *parent, const char *name )
: QWidget( parent, name )
{
setMinimumSize( 200, 200 );
既然我们想MyWidget 处理所有尺寸大于200 x 200的像素, 我们只设定一个最小尺寸.
lcd = new QLCDNumber( 2, this, "lcd" );
lcd->move( 10, quit->y() + quit->height() + 10 );
lcd 是一个 QLCDNumber, 是一个以类似于液晶显示方式显示数字的控件. 本实例用于显
示两位数字,是this的子控件并被命名为"lcd".
它位于客户区x轴的第10像素点,并且在y轴方向距离"退出"按钮10个像素点. 建议大家阅
读一下 坐标系统(Coordinate System). 注意它的尺寸并没有在此处设定, 当MyWidget本
身的尺寸设定以后,resizeEvent() 会自动进行处理.
当一个窗口中有多个控件时,如此般采用硬编码确定其坐标会非常的烦琐,但是Qt还没有一
个方便的设计工具. 在这方面还有待大家的努力.
sBar = new QScrollBar( 0, 99, // 范围
1, 10, // line/page steps
0, // 初始值
QScrollBar::Horizontal, // 方向(水平)
this, "scrollbar" );
QScrollBar 是一个典型的窗口系统滚动条. 以上是一种常用的构造函数, 当然还有其它
一些参数更少的构造函数, 但是我们在调用多个函数时我们必须设定一个统一的状态.
我们不用设定滚动条的几何尺寸,尺寸调整事件会自动进行处理.
connect( sBar, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) );
在此处我们使用了signal/slot 机制 将valueChanged() signal连接到液晶显示器的
display() slot.
无论什么时候滚动条的值发生了变化, 它就会通过产生一个valueChanged() signal而传
送一个新值. 由于该signal连接于液晶显示器的display() slot,但signal被传送后该
slot就会被自动调用. 这两个对象相互都不能识别对方. 这是组件编程的基础.
Slots 是用另外的方法实现的普通C++成员函数并遵守通用的C++ 访问规则.
void MyWidget::resizeEvent( QResizeEvent * )
{
sBar->setGeometry( 10, height() - 10 - 16, width() - 20, 16 );
lcd->resize( sBar->width(), sBar->y() - lcd->y() - 5 );
}
在本例中,我们想在窗口重绘时将子控件完好的骧入到窗口中. 我们希望液晶显示器在滚
动条的上方. 首先将滚动条放置到MyWidget的底部.
滚动条的几何位置被设定在距离左(右)以及下方的边框10个像素处, 高度设定为16个像素
点(大多数窗口风格向导都推荐使用这种设置).
请注意setGeometry()的参数顺序是:左,上,宽度,高度.
坐标点X很简单;距离左边框10个像素点.Y点坐标则由整个控件的高度计算得来.我们扣掉
了16像素宽的边框和滚动条的高度.滚动条的宽度应该在MyWidget控件的两边至少留下10
个像素的宽度.正如上面提到的,我们给滚动条的高度是10个像素.
最后,液晶显示器的尺寸被调整.它的宽度十分简单.我们给它的宽度是和滚动条相等的.高
度是从滚动条到液晶显示器的顶端的距离,当然,我们还预留了5像素的边框. s别忘了,在
构造函数中我们把液晶显示器放在quit按钮的下面.
象我们这样自动放置控件是十分烦琐的.Qt还包含了一些几何尺寸管理类(geometry
management),它会让这样的工作变得轻松.这些类就是QBoxLayout和QGridLayout. 在以后
版本的教程中会包括关于它们的章节.Stay tuned!
程序行为
液晶显示器可以反映出你在滚动条上的动作,并且控件可以更好地处理尺寸调整事件了.
练习
尝试给液晶显示器增加更多的显示位数或者改变显示模式.你可以增加四个按钮来设置显
示其显示模式.
你还可以改变滚动条的范围.
尝试在液晶显示器溢出时让程序退出.
你现在可以进入第六章了.
[前一章] [后一章] [教程目录]
------------------------------------------------------------------------------
--
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)
页面执行时间:2.623毫秒