Qt是当今很流行的一种跨平台 GUI 框架,但是发展到如今,他的功能已经不局限于开发GUI应用程序 , 他也可以开发许多的非GUI程序和服务器程序等

  Qt的入门比较简单,下面以常见的Hello  World程序来开始Qt的学习

 1 #include <QApplication>
 2 #include<QLabel>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7 
 8     QLabel          msg("Hello World");
 9     msg.show();
10 
11     return a.exec();
12 }

<QApplication>是一个应用程序类所在的头文件  , 每个Qt程序都要包含该头文件,每次写程序的时候只要包含他就OK了

然后在main中实例化一个应用程序类的对象

    QApplication  a(argc,argv);

<QLabel>是 QLabel类所定义的都文件

    QLabel 是一个窗口部件 (widget)。窗口部件相当于windows中的控件 和 容器。就是说,窗口部件既可以包含其他的窗口部件,又可以被其他的窗口部件包含。\

  例如菜单,滚动条,状态栏 和  按钮等 都是窗口部件(widget),他们都继承自 QWidget  类。

    绝大多数的应用程序 用 QMainWindow 或 QDialog 最为应用程序的主窗口 , 但是 Qt 和灵活, 任何一个 窗口部件 都可以作为主窗口使用,例如上面的HelloWorld

  程序,就是用QLabel 最为程序的主窗口的。

    上面的QLabel 实例化一个 对象 msg , 并让其text 属性为 “Hello World”  : 

        QLabel  msg("Hello World");

  这样,一个窗口部件就创建出来了。但是,就像windows中的CreateWIndow一样,窗口只是在内存中创建好了,但是并没有被显示出来,要显示窗口的话,还需要调用

  一个函数:void  show();

        msg.show();

  如果学过windows下的GUI编程的话,就会知道这个函数就相当于 ShowWindow();

    窗口显示以后,窗口程序就开始要运行了,窗口也就要开始处理各种事件了。这时候派上用场的就是 exec();

        a.exec();

    该函数相当于一个循环,在这个循环里,每次循环都检查窗口上有没有什么事件发生,例如 鼠标在窗口上点击啊,鼠标在窗口上划过啊 ,键盘被敲下啊   等等。

    就类似于windows的消息循环,但此处是  事件循环。到此处,一个Hello World 程序就完成了

    另外QLabel  还支持一些简单的HTML样式格式,例如

 1 #include <QApplication>
 2 #include<QLabel>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7     QLabel          msg("<a href=\"http://www.baidu.com/\">Baidu</a>");//此处的就是让label上的文字以链接的形式现实出来
 8     msg.show();
 9 
10     return a.exec();
11 }

   就像上面的两个类那样,Qt中 , 所有的框架提供的类都以字母 Q 开头, 所有的类对应着一个 以其 类名 命名的 头文件。如果你想使用某一个类,只要包含

其相应的头文件即可。

  下面继续来看Qt中的信号和槽机制。 信号和槽 机制  简单的来说就是 一个对象身上发生了某个事件 , 其通过某种手段 将发生的时间 通知另一个对象 , 然另一个

 对象用某种手段来处理 发生的事件 。 用  信号 和 槽来命名很形象 ,  A 发生了某件事 , A 就发送一个 信息(就是信号) 给 B , B 有一个专门接受信息的 天线(就是槽)

 B受到A发来的信息后 , 就开始做一些特定的事情 ( 有点远程控制的味道)。

          信号和槽可以通过QObject::connect(A , signal<something happened > , B , slot<do something> )来关联

   下面来看 信号-槽 的一个实例

 1 #include <QApplication>
 2 #include<QPushButton>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7 
 8     QPushButton          msg("Hello World");
 9     msg.show();
10 
11     QObject::connect(&msg,SIGNAL(clicked()),&msg,SLOT(close()));
12 
13     return a.exec();
14 }

  上面就是一个简单的 信号-槽 的使用 , 当PushButton 身上发生一个鼠标点击的事件时 , 就发送一个信号  clicked()  给他自身 , 他自身收到 clicked()信号后 , 就

  执行一个动作 , 此处的动作就是close()关闭 , 可以发现 该程序 运行时,如果点击一下 PushButton , 程序就退出了

 

窗口部件的布局:

  窗口部件的布局就是 处理widget 如何格式化摆放的问题的 。 下面先接触3个类

  • QHBoxLayout 
    • 这个类用于将widget 按横向排列          
  • QVBoxLayout 
    • 这个类用于将widget按纵向排列                  
  • QGridLayout 
    •  这个类用于将widget按网格状排列,一般在 将部件分组分别进行横竖排列后,再进行网格排列

 下面是这三个类的使用实例

        

 1 #include <QApplication>
 2 #include<QPushButton>
 3 #include<QSpinBox>
 4 #include<QSlider>
 5 #include<QHBoxLayout>
 6 #include<QVBoxLayout>
 7 #include<QGridLayout>
 8 
 9 int main(int argc, char *argv[])
10 {
11     QApplication a(argc, argv);
12   //创建各个窗口部件并初始化
13     QWidget*    window = new    QWidget;
14     QPushButton*    btn1 = new QPushButton("b1"),
15             *btn2 = new QPushButton("b2");
16     QSlider*    slider = new QSlider;
17     QSpinBox*    spinbox = new QSpinBox;
18     slider->setRange(0,200);
19     spinbox->setRange(0,200);
20 
21   //创建窗口的布局
22     QHBoxLayout*    hLayout = new QHBoxLayout;
23     QVBoxLayout*    vLayout = new QVBoxLayout;
24     QGridLayout*    gridLayout = new QGridLayout;
25   //btn1 和 slider 排成一排
26     hLayout->addWidget(btn1);
27     hLayout->addWidget(slider);
28   //btn2 和 spinbox 排成一列
29     vLayout->addWidget(btn2);
30     vLayout->addWidget(spinbox);
31   //将两组widget排列到网格中
32     gridLayout->addLayout(hLayout,0,0,1,2);
33     gridLayout->addLayout(vLayout,3,3,2,1);
34   //把布局应用到主窗口中
35     window->setLayout(gridLayout);
36   //设置  信号-槽 的关联
37     QObject::connect(slider,SIGNAL(valueChanged(int)),
38              spinbox,SLOT(setValue(int)));
39     QObject::connect(spinbox,SIGNAL(valueChanged(int)),
40              slider,SLOT(setValue(int)));
41     //显示窗口
42     window->show();
43 
44     return a.exec();
45 }

 

该程序的运行结果如下

  

posted on 2013-06-01 15:30  wowk  阅读(3771)  评论(2编辑  收藏  举报