zoukankan      html  css  js  c++  java
  • Qt5:Qt入门

      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 }

    该程序的运行结果如下

      

  • 相关阅读:
    Android 侧滑(双向滑动菜单)效果
    Android中PopupWindow中有输入框时无法弹出输入法的解决办法
    Android 调用图库选择图片实现和参数详解
    5.抽象类篇
    4.事件篇
    3.委托篇
    2.结构篇
    1.枚举篇
    读取excel到数据库里面
    Windows系统安装docker
  • 原文地址:https://www.cnblogs.com/wowk/p/3112516.html
Copyright © 2011-2022 走看看