qt教程(编辑修改稿)内容摘要:
ublic: 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 )。 slidersetRange( 0, 99 )。 slidersetValue( 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 )。 quitsetFont( 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。 ( amp。 w )。 ()。 return ()。 } 一行一行地解说 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 )。 slidersetRange( 0, 99 )。 slidersetValue( 0 )。 connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) )。 } 这里直接利用了第五章里面的 MyWidget的构造函数。 唯一的不同是按钮被省略了并且这个类被重新命名了。 class MyWidget : public QVBox { public: MyWidget( QWidget *parent=0, const char *name=0 )。 }。 MyWidget 也是除了一个构造函数之外没有包含任何 API。 MyWidget::MyWidget( QWidget *parent, const char *name ) : QVBox( parent, name ) { QPushButton *quit = new QPushButton( Quit, this, quit )。 quitsetFont( QFont( Times, 18, QFont::Bold ) )。 connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) )。 这个按钮被放在 LCDRange 中,这样我们就有了一个 “Quit”按钮和许多LCDRange 对象。 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 窗口部件会安排它们。 } 这就是全部了。 行为 这个程序显示了在同一时间使用许多窗口部件是多么的容易。 其中的滑块和LCD 数字的行为在前一章已经提到过了。 还有就是,就是实现的不同。 (请看 编译 来学习如何创建一个 makefile 和连编应用程序。 ) 练习 在开始的时候使用不同的或者随机的值初始化每个滑块。 源代码中的 “4”出现了 3 次。 如果你改变 QGrid构造函数中调用的那个,会发生什么。 改变另外两个又会发生什么呢。 为什么呢。 现在你可以进行 第七章 了。 Qt 教程一 —— 第七章:一个事物领导另一个 这个例子显示了如何使用信号和槽来创建自定义窗口部件,和如何使用更加复杂的方式把它们连接起来。 首先,源文件被我们分成几部分并放在放在 t7 目录下。 t7/ LCDRange 类定义。 t7/ LCDRange 类实现。 t7/ MyWidget 和 main。 一行一行地解说 t7/ 这个文件主要利用了第六章的 ,在这里只是说明一下改变了哪些。 ifndef LCDRANGE_H define LCDRANGE_H 这里是一个经典的 C语句, 为了避免出现一个头文件被包含不止一次的情况。 如果你没有使用过它,这是开发中的一个很好的习惯。 ifndef 需要把这个头文件的 全部 都包含进去。 include。 LCDRange 继承了 QVBox,所以父类的头文件必须被包含。 我们在前几章里面偷了一点懒,我们通过包含其它一些头文件,比如 ,这样就可以间接地包含。 class QSlider。 这里是另外一个小伎俩,但是 没有前一个用的多。 因为我们在类的 界面 中不需要 QSlider,仅仅是在实现中,我们在头文件中使用一个前置的类声明,并且在 .cpp文件中包含一个 QSlider 的头文件。 这会使编译一个大的项目变得更快,因为当一个头文件改变的时候,很少的文件需要重新编译。 它通常可以给大型编译加速两倍或两倍以上。 class LCDRange : public QVBox { Q_OBJECT public: LCDRange( QWidget *parent=0, const char *name=0 )。 meta object file. 注意 Q_OBJECT。 这个宏必须被包含到 所有 使用信号和 /或槽的类。 如果你很好奇,它定义了在 元对象文件 中实现的一些函数。 int value() const。 public slots: void setValue( int )。 signals: void valueChanged( int )。 这三个成员函数构成了这个 窗口部件和程序中其它组件的接口。 直到现在,LCDRange 根本没有一个真正的接口。 value()是一个可以访问 LCDRange 的值的公共函数。 setValue()是我们第一个自定义槽,并且 valueChanged()是我们第一个自定义信号。 槽必须按通常的方式实现(记住槽也是一个 C++成员函数)。 信号可以在 元对象 文件中自动实现。 信号也遵守 C++函数的保护法则(比如,一个类只能发射 它自己定义的或者继承来的信号)。 当 LCDRange 的值发生变化时, valueChanged()信号就会被使用 ——你从这个名字中就可以猜到。 这将不会是你将会看到的命名为 somethingChanged()的最后一个信号。 t7/ 这个文件主要利用了 t6/,在这里只是说明一下改变了哪些。 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()之前或者之后发射,这是完全任意的。 int LCDRange::value() const { return slidervalue()。 } value()的实现是直接了当的,它简单地返回滑块的值。 void LCDRange::setValue( int value ) { slidersetValue( value )。 } setValue()的实现是相当直接了当的。 注意因为滑块和 LCD 数字是连接的,设置滑块的值就会自动的改变 LCD 数字的值。 另外,如果滑块的值超过了合法范围,它会自动调节。 t7/ LCDRange *previous = 0。 for( int r = 0。 r 4。 r++ ) { for( int c = 0。 c 4。 c++ ) { LCDRange* lr = new LCDRange( grid )。 if ( previous ) connect( lr, SIGNAL(valueChanged(int)), previous, SLOT(setValue(int)) )。 previous = lr。 } } ,除了 MyWidget 的构造函数。 当我们创建 16 个RCDRange 对象时,我们现在使用 信号 /槽 机制连接它们。 每一个的 valueChanged()信号都和前一个的 setValue()槽。qt教程(编辑修改稿)
相关推荐
◎ 安装到光盘 REBOOT 就是以光盘 ISO 形式提供的,只要直接把 刻录到光盘既可。 特 别注 意,不能使用 UltraISO 编辑。 如果要在关盘中加入其它文件,请把 解压缩到 REBOOT 目录中,然后添加或删除该目录中的文件或目录,最后双击 SETUP\,会自动重新生成。 ◎ 安装到硬盘 这里仅说明如何把 RWIN 和 RDOS 安装到具有 NT Loader 的硬盘(即安装到 中)
(1) a painting, an old photo, an article of handcraft art, a tablet, a tombstone, etc. (2) an exhibit in a museum or an exhibition, such as an unearthed artifact, a new product or household gadget。
chance to do what anybody wants to do, which is ,follow their passion, follow their heart and do the things they they39。 re excited about. And the great thing about this university unlike almost all
,0,0,90)。 javascript:(1,13608,0,80,0,0,90)。 javascript:(1,13611,0,80,0,0,90)。 javascript:(1,13289,0,80,0,0,90)。 javascript:(1,13290,0,80,0,0,90)。 javascript:(1,12920,0,80,0,0,90)。 javascript:(1,12789
文献中心的主题词称主要主题词( major topic headings),论述主题某一方面的内容的词称为副主题词。 那么为什么要使用医学主题词呢。 我们先来看个比喻,如果有人问你感冒了吗。 你会不会回答 没有啦,我只是有点 着凉发烧而已 呢。 当然不会,因为你知道感冒就是着凉发烧。 但一个检索系统,如果你 不告诉它的话,它就有可能不知道这一点。 在期刊中,对于同一个概念往往可能有不同的描述形式
换 透视,出现 8 个小矩形,向中间拖动上边靠右的小矩形,到中间即可。 而在 Photoshop 中,工具栏中,添加也多边形的绘画工具,可以直接画出标准多边形,非常的方便。 在 PS6 中无法找到这个编辑对话框。 在 PS6 中,没有明确的标明编辑位置,不过可以在渐变示例上双击鼠标就可以进行编辑了。 如何让一张图片铺满整个画面。 将一张图片定义成图案,然后,进行再进行填充。 首先,用距形选择工具