Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1118908
  • 博文数量: 309
  • 博客积分: 6093
  • 博客等级: 准将
  • 技术积分: 3038
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-03 17:14
个人简介

linux学习记录

文章分类

全部博文(309)

文章存档

2014年(2)

2012年(37)

2011年(41)

2010年(87)

2009年(54)

2008年(88)

分类: LINUX

2008-07-24 15:48:44

写在前面:
这里只是告诉大家一种如何快速学习QT的方法.这里也只对QT Designer 和QT作一个简单的介绍.让没有写过QT的人能对QT有一个初步的认识.如果您真的对QT Programming很有兴趣.这里我建议您去看看O'REILY出版的Programming with QT和Bible出版的KDE 2 /QT Programming.这两本书将会给您带来一个好的开始.

这篇文章适合您吗?

这篇文章只是对QT的一个入门介绍.如果您有兴趣认识一下QT这种语言,那么这篇文章就很适合您了.
如果您对C++能有一些的了解,那么您将会很轻松的看完这篇文章.如果您什么程式语言也没有学过.但也想一窥QT的容貌.那么也没有关系.这里都是些非常间单的东西.也需会成为您学习写程式的一个起点.
如果您本身已经在开发、学习QT/KDE或者Xwindow有关的程式设计.那就只能当是打发时间看看玩了.这篇短短的文章没有写到很多的东西.对于这些高手们,我唯一能提共的一个经验就是多多去看 $QTDIR/include 下面的东西.

1.什么是QT.

用Linux的人,一定都知道QT是什么.而利用QT编译出来的KDE桌面系统, 更是让Linux有了一次能和Windows的GUI相媲美的机会.甚至有人说, KDE 的桌面在图形上,还胜过了Windows95了.那么QT到底是什么呢?其实QT 就是基于C++语言上的一种专门用来开发GUI介面的程式.这里面包括了: button; label; frame ...等等很多的可以直接调用的东西.

2.为什么选择QT

2.1 QT是基于C++的一种语言

相信C/C++目前还是一种很多人都在学习的语言. QT的好处就在于QT本身可以被称作是一种C++的延伸. QT中有数百个class都是用C++写出来的. 这也就是说, QT本身就具备了C++的快速、简易、Object-Oriented Programming (OOP)等等无数的优点.

2.2 QT具有非常好的可移植性(Portable)

QT不只是可以在Linux中运作.也同样可以运行在Microsoft Windows中.这也就
意味者,利用QT编写出来的程式,在几乎不用修改的情况下,就可以同时在Linux
中和Microsoft Windows中运行. QT的应用非常之广泛,从Linux到Windows从
x86到Embedded都有QT的影子.

3.什么是QT Designer

简单的来说QT Designer是一个GUI的工具.这个工具可以帮助我们来加快写QT
程式的速度.利用QT Designer可以用一种所见既所得的方式,来产生QT程式的
GUI介面的程式码.通过增加一些功能,就可以完成一个程式了.利用QT Designer
可以非常快速的学会QT,而我们这里说利用QT Designer来学习QT而不是利用
QT Designer来写QT,这里的区别就在于, QT Designer所产生的程式码有些繁琐.
跑起来也比较的慢些.我们这里只是利用QT Designer来帮助我们学习.而不是直接
去跑QT Designer生成的程式码.

3.基本要求

因为这篇文章主要是告诉大家如何利用QT Design来达到快速学习QT的.
所以您最也要做到:

您需要有一台可以跑Linux的电脑或者Microsoft Windows的电脑
足够的RAM和HardDisk用以安装、编译QT
您的Linux中需要安装有KDE、QT、QT Designer、g++等等程式.
您如果适用Microsoft Windows,则您需要VC++和QT For Windows
Linux的使用者最好还能安装一个Kdevelop(一个非常好的用来开发QT的Develop Enverment)

4. QT Designer

简单的介绍--从PushButton开始

假设您一切都安装好了.现在我们打开QT Designer吧.打开后,选择New -> Dialog
这时侯,您的QT Designer中就会出现一个From1来.现在我们click一下上面的tools中
的那个pushbutton, (标有OK的图标)并且用mouse选择到一定的大小.在这个pushbutton
上面用您的mouse double click一下.我们就可以改变pushbutton的label了.这里我们把
pushbutton1这几个字,换成Exit,然后直接按Enter或者用mouse选择OK也可以.现在我们
看到,那个button中的标签已将变成Exit了.我们这时侯还需要给这个Exit Button一个
signal(信号),这样当您在Exit这个Button上click的时侯. QT才知道如何去处理这个信
号.我们按一下F3(connect singnal slot)然后在那个Exit Button上面Click一下.这时
侯我们就看到了Edit Connection的Dialog了.在Signal中选择clicked,在slot中,先选
择setFocus()就好了.这时侯选择OK.我们就算是完成了.如果想看看这个小程式长什么样子.
可以用CTRL+T来看PreView. (see figure 1)

figure 1

首先在您的$HOME中建立一个qt_program的Directory出来.这个Directory将会
作为我们存放文件的地方.现在我们用File -> Save把这个文件存为form1.ui放在$HOME/qt_program
的目录下.现在如果大家打开form1.ui来看一看.会发现那是一堆有很多 的东西.所以我们需要用一个叫做uic的程式来把.ui文件转换成QT可以使用的.cpp和.h文件.
用下面的指令就可以生成我们需要的.h文件了

uic -o form1.h form1.ui
而生成.cpp文件则需要用以下的指令:
uic -i form1.h -o form1.cpp form1.ui
这时侯,form1.h中就会看到一个标准的QT需要的.h文件

1. #ifndef FORM1_H
2. #define FORM1_H

3. #include
4. #include

5. class QVBoxLayout;
6. class QHBoxLayout;
7. class QGridLayout;
8. class QPushButton;

9. class Form1 : public QDialog
10. {
11. Q_OBJECT
12. public:
13. Form1( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
14. ~Form1();
15. QPushButton* PushButton1;
16. };
17. #endif // FORM1_H


1-2:定义FORM1.H这个文件
3-4:这里是我们需要用到的两个.h文件
5-7:我们根本用不到, qt designer自己产生的
8: QPushButton需要用到这个class
9-11:我们的form1是based在QDialog上面的
12:公开的(可以在以后的程式中使用.用过C++的人一定明白)
13: Form1的架构
14:清除Form1
15:产生一个pushbutton (就是那个标有exit的按钮
17:结束对FORM1.H的定义

而form1.cpp文件如下:

1. #include "form1.h"

2. #include
3. #include
4. #include
5. #include
6. #include

7. /*
8. * Constructs a Form1 which is a child of 'parent', with the
9. * name 'name' and widget flags set to 'f'
10. *
11. * The dialog will by default be modeless, unless you set 'modal' to
12. * TRUE to construct a modal dialog.
13. */
14. Form1::Form1( QWidget* parent, const char* name, bool modal, WFlags fl )
15. : QDialog( parent, name, modal, fl )
16. {
17. if ( !name )
18. setName( "Form1" );
19. resize( 596, 480 );
20. setCaption( tr( "Form1" ) );

21. PushButton1 = new QPushButton( this, "PushButton1" );
22. PushButton1->setGeometry( QRect( 130, 160, 161, 71 ) );
23. PushButton1->setText( tr( "Exit" ) );
24. // signals and slots connections
25. connect( PushButton1, SIGNAL( clicked() ), PushButton1, SLOT( setFocus() ) );
26. }

27. /*
28. * Destroys the object and frees any allocated resources
29. */
30. Form1::~Form1()
31. {
32. // no need to delete child widgets, Qt does it all for us
33. }

1:我们上面的定义文件
2: pushbutton所需要的.h文件
3-6:我们根本用不到, qt designer自己产生的
7-13: QT Designer产生的注解
14-15: Form1的结构
17-18:如果Form1:Form1中没有pass一个名子过来.那么就命名为Form1
19: resize
20:把显示出来的那个Dialog的名子定为Form1,也就是window中左上角的字
21:做出一个新的button,名子为PushButton1
22:这里设定了pushbutton在这个dialog中的位置. Qrect(130, 160, 161, 71)这里是说在一
个Dialog中,以左边最上面来算,位置是(0,0),所以说,这里的130(横向)和160 (纵向)就是说我
们从(0,0)开始,往左边跑130,往下跑160.这样我们就算出了pushbutton这个按钮画在那里了.后面的161,
71则是定义这个pushbutton到底要画多大,设定了长和高
23:通过呼叫setText指令,我们可以在这个button上面给入我们需要的文字.这里是Exit
24: QT Designer产生的注解
25:上面就是处理当接收到clicked的信号(singal)以后,我们所作的事情(setFocus on PushButton1)
connect这里是告诉程式连接一个信号,PushButton1, SIGNAL(clicked()),是说信号是由PushButton1发出,
发出的信号为mouse clicked,PushButton1, SLOT(setFocus())表示信号发出以后,目标(Object)为PushButton,
event是setFocus()动作
26:主程式结束
27-29: QT Designer的注解
30-33:清除Form1

由于我们要常常用到QT Designer,也就是说,需要常常用到uic这只程式.为了省去每次都要
打一堆东西的麻烦.我们来写一各小script来处理.ui档案.
不难看出, uic在处理/生成.h .cpp档案的时侯,用到了两个指令:

uic -o form1.h form1.ui
uic -i form1.h -o form1.cpp form1.ui

所以我们的script就写成:

################################################## #############
#!/bin/sh #
# myuic program convert .ui to .cpp .h by calling uic #
                                                               #
INPUT_UI=$@ #
#这里读取外面传回来的文件名#
                                                               #
                                                               #
if [ ! -f "$INPUT_UI" ] #
then #
echo "UIC File $INPUT_UI Not Found" #
echo #
echo "Userage myuic input_file.ui" #
echo #
exit 1 #
fi #
#上面的语句检查我们所输入的.ui文件是否存在#
#如果找不到指定的.ui文件,则显示一个简短的#
#使用说明#
                                                               #
INPUT_H=`echo $@ | cut -d '.' -f1`.h #
#这里我们利用cut来处理输入的.ui文件. #
#得到一个.h的文件名#
                                                               #
INPUT_CPP=`echo $@ | cut -d '.' -f1`.cpp #
#同样的道理,利用cut产生一个.cpp的文件名#
                                                               #
uic -o $INPUT_H $INPUT_UI #
#这里就是利用.ui产生.h的文件#
                                                               #
uic -i $INPUT_H -o $INPUT_CPP $INPUT_UI #
#利用.h和.ui产生.cpp文件. #
                                                               #
################################################## #############

我门把这个文件存为myuic.并切chmod +x变成可执行档案.
然后cp到/usr/bin上面.如果您在电脑中没有root的权限.
可以在自己的$HOME目录中做一个bin的Directory出来.
然后去编辑您的.bash_profile (这里假设您用的是bash)
如果您的.bash_profile中本身已经有了PATH这段文字,那么
您只要在原本的PATH后面加上:$HOME/bin就可以了.如果没有
那么就在您的.bash_profile中写入:

PATH=$PATH:$HOME/bin
export PATH

这样您以后就可以直接执行myuic这个文件了.现在试试看用myuic来处理
刚刚的那个form1.ui这个文件吧.先把旧的.h .cpp都删除掉:
rm -f *.cpp *.h
然后用myuic来生成新的.cpp .h文件:
myuic form1.ui
这时候用ls就会看到form1.cpp form1.h form1.ui这三个文件了

这时侯我们只需要写一个小的main.cpp就可以编译form1.cpp了.
main.cpp非常的简单

#include "form1.h"
#include

int main(int argc, char **argv)
{
KApplication app(argc, argv, "Form1"); //KDE是建立在QT的基础上得所以KApplication
       //所以kapp.h实际上包含了qapplication.h
Form1 *form1=new Form1();
form1->show();
app.setMainWidget(form1);
return(app.exec());
}

基本上来说,很简单.然后当然就是编译啦.我建议写出来的东西都用Kdevelop来解决.首先Kdevelop
介面非常的友善.又能省下写Makefile的麻烦.打开Kdevelop以后,选择项目->新建, KDE2-Normal,
然后选择Next,在这一页中.注意不要在任何选项中打"x",因为我们用不到.反而会增加麻烦.最后
一直next,然后create , exit.这时侯我们就已经有一个新的项目可以用了.在menu中选择:
项目->添加现存文件.然后把qt_program中的form1.cpp form1.h和main.cpp加入.这时候只要按
一下F9 , Kdevelop就会自动帮您把程式compile出来.并且执行.程式执行后,我们不能用click那个
Exit Button退出程式.因为我们并没有给他退出的信号.现在让我们来把程式码作些改动:

################################################## #########

#form1.h
#ifndef FORM1_H
#define FORM1_H
#include
class QPushButton;
class Form1 : public QDialog
{
     Q_OBJECT
public:
     Form1(QWidget *parent=0, const char *name=0);
     QPushButton* PushButton1;
};
#endif // FORM1_H

################################################## ###############

#form1.cpp
#include "form1.h"
#include
#include
Form1::Form1(QWidget* parent, const char* name): QDialog(parent, name)
{
     setCaption(tr("Form21"));
     PushButton1=new QPushButton(this,"PushButton1");
     PushButton1->setGeometry(QRect(130160161,71));
     PushButton1-vsetText(tr("Exit"));
     connect(PushButton1, SIGNAL(clicked()), kapp, SLOT(quit()));
}
Form1::~Form1(){}

################################################## ##################

main.cpp保持不变.经过一番简化.程式码马上简单很多了.
这里我们除了把一些由QT Design做出的不必要的code挑除以外.对form1.cpp
做了两个小改动.
1.增加了#include 这个head file.
2.我们把:
connect(PushButton1, SIGNAL(clicked()), PushButton1, SLOT(setFocus()));
改变为
connect(PushButton1, SIGNAL(clicked()), kapp, SLOT(quit()));

同样的信号传送,但是目标对象有所改变.现在目标将作用在kapp上面也就是我们
的主程式(main application),而SLOT则是呼叫quit(),现在Kdevelop中更改
程式码.然后按下F9 .等待程式运行.这时侯我们的程式,只要在那个Exit的Button
上面用mouse click一下.这个程式就完全关闭了.

现在我们在这个PushButton中再增加一些功能.我们来看看QT Designer中的ToolTip
功能.如果您的QT Designer中Property Edit并没有自动出现.那么请在QT Designer
中选择Menu中的Windows然后选择Property Edit.只要在PushButton1那个Button
上面用mouse click一下.就可以对Pushbutton1的Property进行编辑.在Property
Edit中的ToolTip后面可以进行文字输入的地方,打入下面的文字:

Click On this Button Will Exit Main Window.

然后sava文件. (Form1.ui)在用我们的小script呼叫uic程式把, Form1.ui转成
Form1.h和Form1.cpp
myuic form1.ui
这时侯我们来观察生成的form1.cpp文件,我们会发现现在这里面比一前多了些东西.
现在这里多了一行:
QToolTip::add( PushButton1, tr( "Clicke On this Button Will Exit Main Window." ) );
这里,我们用QToolTip中的add,在Object (PushButton1)上面加入"Clicke On this Button
Will Exit Main window."这个字幕.现在我们在前面那个被我们简化的form1.cpp中,加入上面那
行程式码,因为我们需要调用到QToolTip所以我们也要把qtooltip.h给include进去.
################################################## ###############

#form1.cpp
#include "form1.h"
#include
#include
#include //因为我们需要用到QToolTip所以,这里要加入qtooltip.h
Form1::Form1(QWidget* parent, const char* name): QDialog(parent, name)
{
     setCaption(tr("Form21"));
     PushButton1=new QPushButton(this,"PushButton1");
     PushButton1->setGeometry(QRect(130160161,71));
     PushButton1->setText(tr("Exit"));
     QToolTip::add(PushButton1, tr("Click On this Button Will Exit Main Window."));
     connect(PushButton1, SIGNAL(clicked()), kapp, SLOT(quit()));
}
Form1::~Form1(){}

################################################## ##################
这时侯,重新编译这个form1的程式.您就会看到,当您把mouse移动到Exit那个按钮的时侯.
停留差不多一两秒钟. "Click On this Button Will Exit Main Window"的字样就会出现.

QPushButton中还有一个常用的功能就是setEnabled了.setEnabled通过TRUE和FALSE这两
个值.可以决定这个扭是否可以被使用者按下.
我们现在在QT Designer中的Property Edit中把Enable选择成FALSE,然后用myuic生成
新的程式码.
$myuic form1.ui
这时候再去观察form1.cpp会发现里面多了一行PushButton1->setEnabled( FALSE );这一行就
把PushButton1设置为不可使用了.如果需要PushButton1可以正常的被Click,那么只要用
PushButton1->setEnabled(TRUE)就可以了.

提示:最常用的作法通常是做出一个SLOT或者一个判断语句,来设定PushButton的状态.

QPushButton还有一各场常被用到的功能就是Font (字体的设定)在QT中,我们通过QFont可以
设定字体的大小,种类.
在QT Designer中的Property Edit中.有一个Font的选项.我们在Font后面的那个...上面
按一下,就会出现一个可以选择font的window.这里我们以Courier(adobe) 24号字为例子.选择
后, Save,然后观察重新用uic生成的.cpp程序码.我们会发现主程式中多出了下面这些程式码:

QFont PushButton1_font( PushButton1->font() );
PushButton1_font.setFamily( "adobe-courier" );
PushButton1_font.setPointSize( 24 );
PushButton1->setFont( PushButton1_font );

后面还多出一个bool Form1::event( QEvent* ev ).这里我们先不要去理会bool Form1::event( QEvent* ev )

只看下面这四行就好了:

1. QFont PushButton1_font( PushButton1->font() );
2. PushButton1_font.setFamily( "adobe-courier" );
3. PushButton1_font.setPointSize( 24 );
4. PushButton1->setFont( PushButton1_font );

第一行是用QFont生成PushButton1_font. PushButton1_font是为了给PushButton1做字体设定
第二行是告诉PushButton1_font使用那种字型.我们这里使用的是adobe-courier
第三行用了setPointSize设定了我们需要用到多大的字,这里我们用的是24号字.
第四行就真正的把这些值给到了PushButton1中.也就是说告诉PushButton1去改变字体的显示.
加入下面的代码以后,重新编译form1,就会看到那个按钮中的Exit这几个字明显的变大了.字体也改变
了.
提示:通常在设定字体的时侯.都是用#define的方式在文件的开头宣告出来.
例如#define FONT_SIZE 24
然后在设定时用PushButton1_font.setPointSize(FONT_SIZE)
这样当您要改字体的时侯,只要把#define FONT_SIZE后面的值改了
整个程式中所有的字体就都改变了.而省去了在需要改变字体的时侯,
一个个的去改变没一个setPointSize中的值

       PushButton是非常之常用的一个东西.可以说是任何程式都不可少的.通常最常见
的用途就是作为"退出"按钮,对话窗口的选择按钮等等.

QLabel的使用:

现在我们再来看看QLabel的用法.在QT Designer中,用Mouse选择Text Label,(就是那个
画了个『A』的图标.)然后用Mouse画出一个随便大小的Text Label.再用Mouse在这个Label上面Double
Click一下.将跳出的Window中的那个TextLabel1改成My Label.然后按Save保存文件.用uic转成
.cpp和.h文件.这使侯,我们发现,在.h文件中,多出了

class QLabel; //这里告诉程式,我们下面需要用到QLabel
QLabel* TextLabel1; //用QLabel生成*TextLabel1


在.cpp中,我们则看到了多出下面这些东西.

#include //这就不用我多说了吧, include进qlabel.h因为我们的QLabel需要
TextLabel1 = new QLabel( this, "TextLabel1" ); //定义TextLabel1
TextLabel1->setGeometry( QRect( 130, 120, 171, 91 ) ); //设定TextLabel的位置
TextLabel1->setText( tr( "My Label" ) ); //还既得我们输入的My Label吧.也就是给TextLabel1定的
//显示出来的东西.就是用setText在这里设定的.

现在我们把这些加入到我们前面写的那个程式中.将上面的东西加入到form1.h和form1.cpp中.
不过我们这里需要做一点小小的改变.就是把TextLabel1的位置远一下.放造屏幕的最左上角.

我门把:
TextLabel1->setGeometry( QRect( 130, 120, 171, 91 ) );
改换成:
TextLabel1->setGeometry( QRect( 0, 0, 171, 91 ) );

重新编译我们的程式.就会看到在程式窗口的最左上角,有一排文字的出现.文字就是我们的TextLabel中
定义的"My Label".
现在回到我们的程式部份.在前面的PushButton中,我们给我们的PushButton定义了字型及字体.实际
上,字型及字体的定义.在QT中是通用的.我们可以用一样的方法来定义QLabel的字体.我们现在在程式
中加入:
QFont TextLabel1_font( TextLabel1->font() );
TextLabel1_font.setFamily( "adobe-courier" );
TextLabel1_font.setPointSize( 24 );
TextLabel1->setFont( TextLabel1_font );
这样我们就把这个TextLabel改成了跟前面PushButton一样的字体courier (adobe) 24号字.

大家常常能看到QT中的TextLabel是用图片来显示的.实际上,这也很简单.我们在QT Designer中,
首先在我们刚刚生成的那个TextLabel上面用Mouse Click一下.把Property Edit的Focus Set到
我们得TextLabel上面. (如果您刚刚没有用Mouse在您的QT Designer上面乱按的话.那么您的Property
Edit中的Focus应该本身就已经在TextLabel上了)这时侯,我们在Property Edit中找一个叫做
pixmap的东西.在pixmap后面的『...』中按一下,就出现了一个新的让您还则图片的视窗. QT Designer中
目前可以接受的图片格式为(这篇文章用的是QT Designer 1.1)bpm, jpeg, pbm, pgm, png和ppm.所以
大家随便找一个上面格式的图片.然后选择OK.这时侯您就会发现那个TextLabel变成您选择的图片了.也许
您会发现,图片并没有完全显示出来,而是只显示了一部分.(如果您选择的图片大过您的TextLabel的话)这
是很常见的.在pixmap底下,有一个scaledContents的选项.只要把选项后面的值改成True就好了.这时侯
您看到的就是一个经过平衡收放过大小的图片了.保存(Save)起来.让我们来看看程式码这边是如何处理这
些图片的吧.
首先我们看到的是在.cpp的文件中,多出了:
#include
#include
这两个文件.这些都是处理图片时需要的.
后面也许大家就头大了.
static const char* const image0_data[] = {
xxxxx
xxxxx
xxxxx
xxxxx
......
...};
好长的一段.这些是什么呢?看上去满复杂的.不用怀疑,这就是您放进去的那个图片.只不过这里是用
xpm的格式来处存的.

什么事XPM呢?
其实XPM是XPixMap的简称. XPM是Linux中X11的一种图像处存的方法.
在XPM中,图像被允许用ASCII文字模式来保存起来.而XPM的另一个特性就是可以
直接被C Compiler所接受.也就是说您可以直接把XPM的图片编译到您的程式中.

把XPM直接编译到程式中有两个最大的好处:

第一点是程式本身如果有很多图片,用XPM全部编译进程式中.就避免了在发行程式得时侯,需要附带很
多图片的麻烦.
第二点就是「相对」来说,被编译进程式的图片,对于一般的普通使用者来说,要改起来会比较麻烦些.
当然,如果说您不准发行Open Source Code的程式.在没有Source Code的情况下.想要改您放放入的
图片,就更家困难了.

但是相对的,也有一些不便性:
程式码本身会加大很多
图片的更改性不灵活

接下来,我们看到了下面的程式码:

QPixmap image0( ( const char** ) image0_data ); \\image0_data就是前面那个XPM的图片啦
TextLabel1->setPixmap( image0 ); \\这里是告诉TextLabel1去使用并且显示image0 (image0_date)
TextLabel1->setScaledContents( TRUE ); \\打开自动平衡收放图片大小的功能.

QPixmap本身其实就接受xpm档案.所以我们可以不用把XPM的Source编译进程式中.而改用
QPixmap pixmap("image.xpm")的形式.当然,我们需要把图片文件转换成XPM的格式.这里我们用
到了Linux中本身为我们准备好的工具convert. convert本身支持非常多的图片各式的转换.
如果您有兴趣,可以用man convert来看看convert的详细内容.这里我只介绍如果把一个图片文
件转换成xpm的格式.我选择的是Linux中的代表图片.一只可爱的小企鹅--logo.gif,相信每一个
安装了linux的人,应该都可以找到这个图片吧.您可以试这用locate logo.gif来寻找.找到以后,
把logo.gif复制到程式放有form1程式码的目录下.然后用下面的指令来作图片的格式转换:
convert logo.gif logo.xpm
这时侯,我们就可以看到目录中多了一个logo.xpm的文件了.


现在我们回到我们的form1程式码中.在前面加入
#include

然后在TextLabel的后面任何地方,加入下面三行程式码:

QPixmap pixmap("logo.xpm"); //这里就是告诉pixmap我们刚刚convert出来的那个图片
TextLabel->setPixmap(pixmap); //让TextLabel调用/显示pixmap (logo.xpm)
TextLabel->setScaledContents( TRUE ) ; //打开自动平衡收放图片大小的功能

记住喔,一定不能在TextLabel = new QLabel( this, "TextLabel1" );以前加入喔!
这时侯重新编译我们的程式码,在新的程式中,您就可以看到那只可爱的小企鹅了.您也许
会发现企鹅胖的有点变形.那是因为自动平衡是根据您的TextLabel的大小来收放图片的.
所以我们只要把:
TextLabel1->setGeometry( QRect( 0, 0, 171, 91 ) );
改换成:
TextLabel->setGeometry( QRect( 0, 0, 171, 191 ) );
也就是说把高度增加100,重新编译以后.可以看到,企鹅的大小变得正常多了.

ˇ Label也是最常用的组件.通常被用为在视窗中的文字显示.

RadioButton的简介:

接下来让我慢看看RadioButton.在QT Designer中,有一个圆圈圈的图案,在圆圈中
有个黑色的实心圆圈.那个就是RadioButton了.现在我们在我们的form1中,增加一个RadioButton.
然后来观察程式码.

在.h文件中,多出了两行

class QRadioButton; //告诉程式我们需要用到QRadioButton

QRadioButton* RadioButton1; //QRadioButton *RadioButton1

在.cpp的文件中出现了下面三行程式码,以及一个include文件

#include //QRadioButton所需要的include文件
RadioButton1 = new QRadioButton( this, "RadioButton1" ); //生成一个新的QRadioButton在介面this上
// this就是只当前的主介面.也就是我们的
// Form1 : public QDialog
//白话文的方法来说呢,就是我们这个程式的
//主显示视窗.相信大家已定很熟习了吧.

RadioButton1->setGeometry( QRect( 260, 60, 151, 61 ) ); //通过setGeometry(QRect())来设定我们这个
// RadioButton的大小
RadioButton1->setText( tr( "RadioButton1" ) ); //用setText()来给我们的这个RadioButton
//命名.这里这里名为"RadioButton1"

将上面这些程式码加入到我们的form1.h和form1.cpp中,重新编译程式,我们就看到了一个名为RadioButton1
的RadioButton了.

RadioButton除了可以用到PushButton中的setEnabled( FALSE )的选项来Disable这个RadioButton
以及在QT中通用的setFont以外,还提共一个非常常用的setChecked (TRUE/FLASE)功能.

在QT Designer中,用mouse click一下我们刚刚生成的那个RadioButton,然后在QT Designer的
Property Edit中.选择checked,在checked后面选择True.经过uic程式以后,重新观察.cpp程式
码,您会发现,在.cpp文件中,多出了一行:

RadioButton1->setChecked( TRUE ); //这行就设定了, RadioButton1在程序一看使的时侯
   //就已经被设定为内定选项了.
重新编译程式码以后,就可以看出.这时侯RadioButton1前面已经被选中了.

选择按钮,重要就在于选择.现在我们来增加另外一组RadioButton就可以很简洁的看出setChecked的作用了.
在您的form1.h文件中,加入:
QRadioButton* RadioButton2;
在form1.cpp文件中加入:
RadioButton2=new QRadioButton2(this,"RadioButton2");
RadioButton2->setGeometry(QRect(260, 140, 151, 61)); //这里的位置比RadioButton1的位置低出80来.
这时侯我们重新编译后,执行程式,就会发现. RadioButton1前面是被自动选择上了.而RadioButton2则
没有.

因为RadioButton常常被用作二选一,三选一或者多选一.所以这里向大家简单的介绍一下ButtonGroup.

在QT Designer中,上面那一堆小按钮中有一个是ButtonGroup的按钮.现在在这个上面用mouse click
一下.然后在QT Designer中画出一个方的范围来.这个范围要把刚刚我们画的那个RadioButton包进去
喔.一定要. (see figure 2)

figure 2

回来检查uic生成的source code.我们会发现
form1.h中多出了
class QButtonGroup; //用到QButtonGroup
QButtonGroup* ButtonGroup1; // QButtonGroup *ButtonGroup1
而在form1.cpp中,有了

#include // QButtonGroup需要的.h文件

ButtonGroup1 = new QButtonGroup( this, "ButtonGroup1" ); //在主视窗中生成ButtonGroup1
ButtonGroup1->setGeometry( QRect( 230, 40, 251, 181 ) ); //设定ButtonGroup的位置与大小
ButtonGroup1->setTitle( tr( "ButtonGroup1" ) ); //设定显示为"ButtonGroup1"
    
RadioButton1 = new QRadioButton( ButtonGroup1, "RadioButton1" );
//在这里,我们看到,这次不再是
//RadioButton1 = new QRadioButton( this, "RadioButton1" );
//而是把this换成了ButtonGroup1了.这也就是说,这次我们
//生成的RadioButton1是在ButtonGroup1这个介面上,而不是
//以前的主视窗了.

RadioButton1->setGeometry( QRect( 30, 30, 151, 61 ) );
// RadioButton1的位置也有了改变.这里的30, 30是以ButtonGroup1来
//作为标准的.而不事主视窗.

//下面这两行就不用多说了,大家一定知道
RadioButton1->setText( tr( "RadioButton1" ) );
RadioButton1->setChecked( TRUE );

现在我们自己把上面的程式码加入到我们的form1.h和form1.cpp
中.同时把我们的RadioButton1从this改到ButtonGroup1
位置也改变为RadioButton1->setGeometry( QRect(30,30151,61));
同时更该RadioButton2的设定. this改成ButtonGroup1
位置改成RadioButton2->setGeometry( QRect(30, 100, 151, 61));
使RadioButton2跟RadioButton1的位置一样,但是低70
重新编译程式.您就会发现这时侯的RadioButton变成二选一了.两个
中您只能选择一个.当您在RadioButton2前面用mouse按一下, RadioButton1
前面就会自动清除掉.

RadioButton通常是用在唯一选择中.也就是说从多个选择中,选出一个来.所以通常配合ButtonGroup来使用.但也可以单个独立使用.

CheckBox:

CheckBox是一种跟RadioButton差不多的东西.通常的区别在于CheckBox被用于多重选择. CheckBox在
QT Designer中是一个方方的中间有个X的标志的东西.好像一个小箱子一样.我们现在好像RadioButton
一样,做出两个Checkbox,然后在做出一个ButtonGroup.把checkbox 2设定为checked
form1.h文件中,多出了
class QCheckBox;

QButtonGroup* ButtonGroup2;
QCheckBox* CheckBox1;
QCheckBox* CheckBox2;

而form1.cpp呢.也就有了
#include
ButtonGroup2 = new QButtonGroup( this, "ButtonGroup2" );
ButtonGroup2->setGeometry( QRect( 20, 180, 161, 141 ) );
ButtonGroup2->setTitle( tr( "ButtonGroup2" ) );
    
CheckBox1 = new QCheckBox( ButtonGroup2, "CheckBox1" );
CheckBox1->setGeometry( QRect( 20, 30, 121, 41 ) );
CheckBox1->setText( tr( "CheckBox1" ) );
    
CheckBox2 = new QCheckBox( ButtonGroup2, "CheckBox2" );
CheckBox2->setGeometry( QRect( 20, 90, 121, 41 ) );
CheckBox2->setText( tr( "CheckBox2" ) );
CheckBox2->setChecked( TRUE );

相信上面就不用我多解释,大家也一定明白了吧.实际上CheckBox跟RadioButton
是一种非常类似的东西.


LineEdit--进入文字的处理

QT Designer中有一个标有『ab』标志的小Icon,那就是LineEdit了.
现在我们在这里按一下,然后画出一个LineEdit来.然后在这个LineEdit
上面,用mouse double click.在出现的window中输入"Display Some Text"

现在我们来看看程式码的变化:

form1.h中,定义了LineEdit1
class QLineEdit;
QLineEdit* LineEdit1;

form1.cpp中:
#include
LineEdit1 = new QLineEdit( this, "LineEdit1" ); \\生成LineEdit1
LineEdit1->setGeometry( QRect( 130, 70, 251, 71 ) ); \\设定LineEdit1的位置

LineEdit1->setText( tr( "Display Some Text" ) ); \\ LineEdit1显示的字为"Display Some Text"

我们可以看到,在QT Designer的Property Edit中,有一个echoMode的选项.现在我们把他选择为
Password.这时侯我们就看到刚刚打入的"Display Some Text"这几个字,已经变成了"*******"了.
在QT Designer中,您可以选择echoMode为Password或者是NoEcho.这些通常都是用作密码输入
用的.当客户输入一组密码的时侯,屏幕上的密码输入window并不显示用户的密码明文.而是采用Password
---"*******"或者NoEcho ----(什么都不显示)来代议. form1.cpp的程式码中会有下面的程式码出现:
LineEdit1->setEchoMode( QLineEdit::Password );

ˇ LineEdit通常是用来显示或者读取单行的数据.

MultiLineEdit--进一步学习文字处理

MultiLineEdit也是作为文字处理用的.但是他的功能就比LineEdit要强出很多了. MultiLineEdit
的Icon是一个上面画有『cde』下面画有『ab』的图案的按钮.
我们先做出一个MultiLineEdit,然后double click,在文字部份写入:
This is a Multi Line Edit.
we are trying to put some text here.
:-)
然后观察程式码:
form1.h多了
class QMultiLineEdit;

QMultiLineEdit* MutiLineEdit1;

form1.cpp中有了
#include
MultiLineEdit1 = new QMultiLineEdit( this, "MultiLineEdit1" );
MultiLineEdit1->setGeometry( QRect( 70, 40, 441, 281 ) );
MultiLineEdit1->setText( tr( "This is a Multi Line Edit.\n"
"We are trying to put some text here.\n"
":-)" ) );

这里不难看出.除了MultiLineEdit中的setText可以显示多行文字以外.
其他的东西跟LineEdit并没有什么差别.

在MultiLineEdit中,我们还能选择些其他的选项.
常用的有, WordWrap, UndoDepth, ReadOnly, overWriteMode.现在我们把
这些全都在Property Edit中选择出来.

WordWarp选择为NoWarp
UndoDepth设定到255
ReadOnly为FALSE
overWriteMode为TRUE

这时侯form1.cpp中就有了下面这些新的程式码:

MultiLineEdit1->setWordWrap( QMultiLineEdit::NoWrap );
//设定我们的MultiLineEdit1不支援自动断行

MultiLineEdit1->setUndoDepth( 255 );
//设定在这个MultiLineEdit1中所输入的数据可以通过mouse的undo或者键盘的ctrl + z
//来进行复原(undo)可以复原(undo)的次数为255次

MultiLineEdit1->setReadOnly( FALSE );
//设定MultiLineEdit1可以接受客户端的文字输入.如果这里为TRUE ,那么使用者
//就没有办法在这个MultiLineEdit输入任何的东西了.通常只有在MutilLineEdit
//被当作纯粹的文字显示部件才会用到.

MultiLineEdit1->setProperty( "overWriteMode", QVariant( TRUE, 0 ) );
//打开overWrite的开关.也就是说用户输入的时侯,会把MultiLineEdit1中
//本身的东西overWrite掉. (覆盖写掉)


ˇ MultiLineEdit的应用非常的广泛.小到文字的显示,输入.大到文字的处理.好比Kdevelop中
的主window,我们大家写程式的时侯,就是在一个MultiLineEdit中. Kdevelop 2.x中,那种在error
code (make时产生的)上面double click,然后上面就会自动focus到错误程式那行的程式.也是用
MultiLineEdit来运作的.又例如double click在一段文字上面,然后popup新的window出来等等.
所以说, MultiLineEdit真的是很重要很多用的一个物件.

 

LCD Number--数字的显示

在QT Designer中有一个画了个数字『42』的
Icon.在那理点一下.就可以做出一个LCD Number了.
同样的道理, form1.h中有了QLCDNumber的class,也多出了QLCDNumber* LCDNumber1,
而form1.cpp中就多出了

LCDNumber1 = new QLCDNumber( this, "LCDNumber1" );
LCDNumber1->setGeometry( QRect( 350, 280, 111, 81 ) );
这样的一个LCDNumber实际上还是没有什么作用.现在让我们回到QT Designer中.
在Property Edit里面给我们的LCD一些value再来看看.我们选择numDigits为
2, intValue为10.这时侯,我们来看看. form1.cpp中有了:

LCDNumber1->setNumDigits( 2 ); //最多显示两个数字.也就是说可以选择从0到99
LCDNumber1->setProperty( "intValue", 3 ); //最初的起始值为3

在QT Designer中LCDNumber的Property Edit还有个mode可以用来选择.
我们可以选择Hex, Dec, OCT, Bin这四种模式.我们现在选择HEX,然后就会发
现,在form1.cpp中有下面的程式码:
LCDNumber1->setMode( QLCDNumber::HEX );
setMode是用来控制显示方式的.
所以说,QT这里给我们提共的显示方式有:
DEC->10进位方式
HEX->16进位方式
OCT->8进位方式
BIN->2进位方式

在这里,10进位方式和16进位方式是我们常常会用到的.


5.最后的程式

现在我们来把上面的东西结合起来,写一个小小的程式.程式本身什么也不做.
只是给大家介绍一下程式的入门罢了: (see figure 3)


figure 3

main.cpp很简单,这里我就不多讲了

//main.cpp

#include "final.h" //我们后面定义的.h文件
#include

int main(int argc, char **argv)
{
         KApplication app(argc, argv, "Form1");
         Final *final=new Final(); //后面的final.h会有定义
         final->show();
         app.setMainWidget(final);
         return(app.exec());
}

//final.h

#ifndef FINAL_H
#define FINAL_H

#include
class QButtonGroup; //我们要用的ButtonGroup
class QCheckBox; //我们要用的CheckBox
class QGroupBox; //我们要用的GroupBox
class QLCDNumber; //我们要用的LCDNumber
class QLabel; //我们要用的Label
class QLineEdit; //我们要用的LineEdit
class QMultiLineEdit;//我们要用的MultiLineEdit
class QPushButton; //我们要用的PushButton
class QRadioButton; //我们要用的RadioButton
class QString; //MultiLineEdit要用到的String

class Final:public QDialog //Final基于QDialog
{
Q_OBJECT public:
   Final (QWidget * parent = 0, const char *name = 0); //我们的主程式
    ~Final ();

   QButtonGroup *group_one;
   QRadioButton *radio_two;
   QRadioButton *radio_one;

//第一个ButtonGroup,带两个RadioButton (radio_two, radio_one)

   QGroupBox *group_two;
   QCheckBox *check_one;
   QCheckBox *check_two;
   QCheckBox *check_three;

// GroupBox,饱含三个CheckBox (check_one, check_two, check_three)

   QPushButton *ok_one;
   QPushButton *ok_two;

//两个Pushbutton (ok_one, ok_two)这是给radiobutton和checkbutton用的

   QLabel *click_label; //显示在LCD上面的文字
   QLabel *picture; //企鹅的图形
   QLineEdit *LineEdit; //用来显示radio button的状态
   QMultiLineEdit *MultiLineEdit; //用来显示check box的状态

   QLCDNumber *LCD; //数字显示.用来显示radio button和check box后面的ok被按下去的次数.

   QPushButton *exit_button; //退出程式
   QPushButton *clear_button; //清除全去选项

   QButtonGroup *group_three;
   QRadioButton *dec;
   QRadioButton *oct;
   QRadioButton *bin;
   QRadioButton *hex;
   QPushButton *lcd_ok_button;

//另外的一个ButtonGroup,包括了RadioButton dec, oct, bin, hex和push button lcd_ok_button
//这个是用来选择LCD的选择方式的


   QString CHECK; // MultlLineEdit在显示check box状态时,需要的一个string

   int i; //我们的LCD用来统计数字用的

   private slots:
   void check_radio (); //检查radio button状态的slot
   void check_box (); //检查check box状态的slot
   void check_lcd (); //检查LCD显示状态的slot
   void CLEAR (); //清除所有选择,回覆到程式开始原状的slot
};

#endif //结束了


//final.cpp
#include "final.h"

#include // exit_button需要用到quit来退出kapplication
#include // buttongroup用到
#include // checkbox用到
#include &l;qgroupbox.h> // groupbox用到
#include // label用到
#include // LCD用到
#include // lineedit用到
#include // multilineedit用到
#include // pushbutton用到
#include // radiobutton用到
#include // LCD用到
#include //图像(企鹅)用到
#include // multilineedit用来显示check_box状态的string用到
  
Final::Final (QWidget * parent, const char *name): //主程式开始了
QDialog (parent, name)
{
   if (!name)
     setName ("Final");
   resize (596, 480);
   setCaption (tr ("Final")); //命名为Final

   i = 0; //计数器最开始的值是0

   group_one = new QButtonGroup (this, "group_one");
   group_one->setGeometry (QRect (0, 0, 110, 121));
   group_one->setTitle (tr ("Group"));

   radio_one = new QRadioButton (group_one, "radio_one");
   radio_one->setGeometry (QRect (10, 20, 90, 40));
   radio_one->setText (tr ("One"));
   radio_one->setChecked (TRUE);
  
   radio_two = new QRadioButton (group_one, "radio_two");
   radio_two->setGeometry (QRect (10, 70, 90, 40));
   radio_two->setText (tr ("Two"));

//设定第一个buttongroup,并且在buttongroup上面设定radio button 1和radio button 2
// radio_one的default是checked (已经被选择的)

   group_two = new QGroupBox (this, "group_two");
   group_two->setGeometry (QRect (0, 120, 111, 201));
   group_two->setTitle (tr ("Group 2"));

   check_one = new QCheckBox (group_two, "check_one");
   check_one->setGeometry (QRect (10, 20, 90, 40));
   check_one->setText (tr ("One"));
   check_one->setChecked (TRUE);

   check_two = new QCheckBox (group_two, "check_two");
   check_two->setGeometry (QRect (10, 80, 90, 40));
   check_two->setText (tr ("Two"));

   check_three = new QCheckBox (group_two, "check_three");
   check_three->setGeometry (QRect (10, 140, 90, 40));
   check_three->setText (tr ("Three"));

//第二个group我们改用groupbox来作范例.并且在group box上面
//生成三个check box , check box 1, check box 2和check box 3
// check_one的default是checked (已经被选择的)

   ok_one = new QPushButton (this, "ok_one");
   ok_one->setGeometry (QRect (120, 30, 71, 61));
   ok_one->setText (tr ("OK"));

//第一个ok button,我们用来检查radio button的状态

   ok_two = new QPushButton (this, "ok_two");
   ok_two->setGeometry (QRect (120, 190, 71, 61));
   ok_two->setText (tr ("OK"));

//第二个ok button,用来检查check box的状态

   click_label = new QLabel (this, "click_label");
   click_label->setGeometry (QRect (250, 270, 190, 41));
   QFont click_label_font (click_label->font ());
   click_label_font.setPointSize (18);
   click_label->setFont (click_label_font);
   click_label->setText (tr ("Click On OK"));
   click_label->setAlignment (int (QLabel::AlignCenter));

//在LCD的数字上方显示一些字.这里我们显示的是Click On Ok
//也就是说, LCD是显示的ok button被mouse clicked过的次数.
//这里我们只显示ok_one和ok_two,简单的来说,就是显示radio button
//和check box的状态一共被检查过几次

   picture = new QLabel (this, "picture");
   picture->setGeometry (QRect (480, 10, 110, 140));
   picture->setText (tr ("Picture"));

   QPixmap pixmap ("logo.xpm");
   picture->setPixmap (pixmap);
   picture->setScaledContents (TRUE);

//我用convert这只程式,把那个企鹅的logo (logo.gif)转换成了logo.xpm
//这里我们把这个loggo读进来.并且让picture这个QLabel作为我们的显示
//对象.这样我们的程式里面就有了一只象征Linix的小企鹅了.

   LineEdit = new QLineEdit (this, "LineEdit");
   LineEdit->setGeometry (QRect (210, 30, 251, 51));
   LineEdit->setReadOnly (TRUE);

//我们这里用lineedit用来显示radio button
//所以我们把LineEdit设定为setReadOnly (TRUE)只读

   MultiLineEdit = new QMultiLineEdit (this, "MultiLineEdit");
   MultiLineEdit->setGeometry (QRect (210, 150, 250, 90));
   MultiLineEdit->setReadOnly (TRUE);

//我们用MultiLineEdit来显示check box的状态
//同样的道理,这里我们也不需要输入,所以设定MultiLineEdit为只读

   LCD = new QLCDNumber (this, "LCD");
   LCD->setGeometry (QRect (220, 320, 231, 91));
   LCD->setNumDigits (10);
   LCD->setProperty ("intValue", 0);

//因为考虑到我们会使用bin (二进位)的方法来显示
//所以把显示的最大位设置为10位LCD->setNumDigits (10)
//并且设定初始值为0
// LCDNumber的内定显示是DEC的. (十进位)

   group_three = new QButtonGroup (this, "group_three");
   group_three->setGeometry (QRect (470, 170, 111, 221));
   group_three->setTitle (tr ("LCD"));

   dec = new QRadioButton (group_three, "dec");
   dec->setGeometry (QRect (10, 60, 81, 21));
   dec->setText (tr ("Dec"));
   dec->setChecked (TRUE);

   oct = new QRadioButton (group_three, "oct");
   oct->setGeometry (QRect (10, 90, 81, 31));
   oct->setText (tr ("OTC"));

   bin = new QRadioButton (group_three, "bin");
   bin->setGeometry (QRect (10, 120, 91, 31));
   bin->setText (tr ("Bin"));

   hex = new QRadioButton (group_three, "hex");
   hex->setGeometry (QRect (10, 30, 81, 21));
   hex->setText (tr ("Hex"));

   lcd_ok_button = new QPushButton (group_three, "lcd_ok_button");
   lcd_ok_button->setGeometry (QRect (10, 160, 91, 51));
   lcd_ok_button->setText (tr ("OK"));

//在LCD旁边再建立一个group ( Button Group )里面包含了radio button和bush button
// radio button有dec, oct, bin, hex这四项.用来选择LCD的显示模式(8进位,10进位,16进位,2进位)
// lcd_ok_button是一个push button.最为选择LCD显示模式的『确定』键


   clear_button = new QPushButton (this, "cler_button");
   clear_button->setGeometry (QRect (10, 420, 131, 41));
   clear_button->setText (tr ("Clear All"));

//这个显示为clear all的push button,用来把
//所有的值都设定到原始状态

   exit_button = new QPushButton (this, "exit_button");
   exit_button->setGeometry (QRect (430, 420, 131, 41));
   exit_button->setText (tr ("Exit"));

//退出程式用的push button

   connect (ok_one, SIGNAL (clicked ()), this, SLOT (check_radio ()));
//连接一个信号,如果ok_one被click了,就去执行check_radio()

   connect (ok_two, SIGNAL (clicked ()), this, SLOT (check_box ()));
//连接一个信号,如果ok_two被click了,就去执行check_box()

   connect (lcd_ok_button, SIGNAL (clicked ()), this, SLOT (check_lcd ()));
//连接一个信号,如果lcd_ok_button被click了,就去执行check_lcd()

   connect (clear_button, SIGNAL (clicked ()), this, SLOT (CLEAR ()));
//连接一个信号,如果clear_button被click了,就去执行CLEAR ()

   connect (exit_button, SIGNAL (clicked ()), kapp, SLOT (quit ()));
//连接一个信号,如果exit_button被click了,就把我们的整个程式关闭掉
}

Final::~Final () //
{

}

void Final::check_radio ()
{
   i++;
   if (radio_one->isChecked ())
     LineEdit->setText (tr ("Radio Button 1 is Checked"));
   if (radio_two->isChecked ())
     LineEdit->setText (tr ("Radio Button 2 is Checked"));
   LCD->display (i);
}
//在check_radio ()中.我们用isCheck()来检查radio button的状态
//如果radio button是被选择的,那么isCheck()将会返回TRUE
//如果radio button没有被选择,则返回FALSE的值
//如果说radio_one有被选择,我们就用setText()在LineEdit中显示Radio Button 1 is Clicked
//这几个字
//如果radio_two有被选择,我们就用setText()在LineEdit中显示Radio Button 2 is Clicked
//
//在一开始,有个i++,这是我们用来统计ok_one和ok_two被clicked的次数用的
//如果进入check_radio()就证明, ok_one已经被click过一次.所以我们把i+1,
//然后用display()在LCD上面显示i的值

void Final::check_box ()
{
   i++;
   if (check_one->isChecked ())
     CHECK = CHECK + "Check Box 1 is Checked\n";
   if (check_two->isChecked ())
     CHECK = CHECK + "Check Box 2 is Checked\n";
   if (check_three->isChecked ())
     CHECK = CHECK + "Check Box 3 is Checked\n";
   MultiLineEdit->setText (CHECK);
   CHECK = "";
   LCD->display (i);
}
// check box这里看上去稍稍比radio button复杂一些.因为radio button我们只能选择
//一个.要么就是radio_one,要么就是radio_two.所以用个LineEdit就可以搞定.
//但是check box是可以多项选择的.也就是说既可以是check box1单一的被选择.也可以
//是check box 1 + check box 2,还可以check box 1 + check box 2 + check box 3.又或者
// check box 2 + check box 3等等.所以这里我们需要用到MultiLineEdit来显示多行的信息.
//而信息就放在我们的QString中(CHECK)
//我们用isChecked()来检查check_one,如果check_one被选择
// CHECK (我们的QString)就等于CHECK+"Check Box 1 is Checked\n",那么CHECK (QString)
//本身是空的.所以这里CHECK就等于Check Box 1 is Checked这几个字.后面的\n是10,也
//就是换行符号的意思
//同样的,如果check_two有被选择,那么CHECK就等于CHECK+"Check Box 2 is Checked\n",
//这时侯就是两种情况. 1. check_one没有被选择,所以这时侯,我们的String Check就是空
//的+"Check Box 2 is Checked\n"这几个字.而如果check_one是有被选窄的.那么String
// CHECK本身已经包含了"Check Box 1 is Checked\n"的字.这时侯在加上"Check Box 2 is
// Checked\n"这几个字.那么String CHECK就有两行得内容了.
// check_three的道理跟check_two是一样的.只不过这时侯由两种可能变成了四种而已
// 1. check_one clicked + check_two clicked
// 2. check_one clicked
// 3. check_two clicked
// 4. check_one和check_two都没有被click
//然后我们用setText把String CHECK显示到我们的MultiLineEdit上面去.
//并且把CHECK中的String清除. (下次检查状态的时侯还要用到)
//因为ok_two被click过了,所以我们的i又加了1,并且在LCD中显示出来

void Final::check_lcd ()
{
   if (dec->isChecked ())
     {
       LCD->setMode (QLCDNumber::DEC);
     }
   if (hex->isChecked ())
     {
       LCD->setMode (QLCDNumber::HEX);
     }
   if (oct->isChecked ())
     {
       LCD->setMode (QLCDNumber::OCT);
     }
   if (bin->isChecked ())
     {
       LCD->setMode (QLCDNumber::BIN);
     }
}

//这是最间单的一个了
//检查:
// dec有被选择,将LCD显示模式改变为DEC
// hex有被选择,将LCD显示模式改变为HEX
// oct有被选择,将LCD显示模式改变为OCT
// bin有被选择,将LCD显示模式改变为BIN

 

void Final::CLEAR ()
{
   LineEdit->clear ();
   MultiLineEdit->clear ();
   radio_one->setChecked (TRUE);
   dec->setChecked (TRUE);
   check_one->setChecked (TRUE);
   check_two->setChecked (FALSE);
   check_three->setChecked (FALSE);
   LCD->setMode (QLCDNumber::DEC);
   i = 0;
   LCD->setProperty ("intValue", 0);
}

//这里我们把所有选项变回程式开始的原始状态.
//并且把显示的状态情况清空, LCD设定回0
// LineEdit->clear ()通过呼叫clear()把LineEdit清空
// MultiLineEdit->clear ()一样的道理.用clear()清空
//用setChecked()来把radio_one设定为『已选择』
//用setChecked()把dec设定为『已选择』
//对于radio button来说.比较方便.因为我们从众多选择中
//只能选择一个.但是对于check box就不一样了. check box
//可以被任意的多项选择.所以我们只好把每一个check box的
//状态都设定一遍
// check_one->setChecked ( TRUE ) check_one设定为『已选择』
// check_two->setChecked ( FALSE ) check_two设定为没有被选择.
// check_three->setChecked ( FALSE ) check_three设定为没有被选择
// LCD->setMode (QLCDNumber::DEC)把LCD的显示模式设定为10进位
// i=0;把LCD的计数器设定为0
// LCD->setProperty ("intVale", 0);将LCD初始化,初始值为0


大家编译程式后,可以自己跑跑看.也可以将我们前面有说到的一些功能
自行增加进去.例如tooltip; PushButton中的setEnabled; QFont
等等.


6.后记

其实QT所提共得功能远远不只我上面所介绍的那么一点点.这篇文章只是
让没有用过QT的人,能对QT有一个简单的概念.迈出走向QT的第一步.
QT Designer只是一个辅助工具.能帮助大家快速的建立一个QT的概念.但是
真正要学QT的话.还是建议各位读者能好好的打好基础.(C++)自己慢慢的
一点点学起.在您的电脑中,安装QT的时侯,有安装一个Online Reference
的文件.通常在您的$QTDIR/doc/html中.您可以用自己喜爱的web browser
来查看那些文件.真正有用的东西,都全都在那里面!

阅读(3222) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~