您的位置:首页 > 编程语言 > Qt开发

Qt学习笔记01

2016-06-03 19:31 246 查看
 

 一、QT程序的创建:

  1、在程序创建中QAplication对象,这个对象是负责管理整个应用程序的资源,同时接收Qt自己能够处理的命令行参数;

  2、在程序搭建好之后,产生的部件都是默认隐藏的,这是需要QLabel创建的对象调用函数lab.show ()使部件可见

  3、一般都是在main函数的return语句中返回 app.exec()主要作用是使程序进入事件循环,在没有关闭信号传送来之前使部件一直处理开启状态

  4、在整个程序编译完成之后使用如下命令编译源代码:

     qmake -projec -> qmake -> make -> 执行make产生的可执行文件即可;

     注意:如是运行make时进入死循环,只需要将系统的当前时间修改为正确时间即可;

     

 二、函数机制:

  1、使用QT助手查找Aplication查找Qaplication;

  2、Properties:对象的属性,其语义类似与C++语法中的成员变量,属性大多数被定义为私有,访问它们需要专门的set/get方法

     int wheelScrollLines (void)//获取wheelScrollLines

     void setWheelScrollLines(int)//设置wheelScrollLines

  3、Public Functions公有函数:

     表示对象的外观对象行为,既有主动行为也有被动行为,甚至包括构造函数、析构函数,当然也包括从基类继承的函数,和对基类覆盖的函数;

  4、Public Slots:公有槽函数:

     公有槽函数通常并不需要在程序中直接调用,而是被系统默认的处理或者认为的与某些特定的信号链接起来,以表示对该触发器的动作响应,

     槽函数可以从基类继承,也可以被子类覆盖,但是被子类覆盖的前提是必须在基类中被声明为虚函数;

  5、Signals:信号捕捉:

     如果对象内部状态发生变化,那么这个对象就可以抛出一个信号,与之对应连接的槽就会被立即执行,这种信号和槽的联动机制是独立于任何

     图形界面时间循环;

  6、Protecred Functions:保护类成员

     当Q同类派生了自己的子类,为了扩充某些功能,在不破坏对象封装性的前体现,保护类成员会提供更多的基类复用;

     virtual void chidEvent (QChildEvent* event);

     注意:在使用QT编写多文件程序时,之需要包含程序员自己编写的头文件以及 #include<QGui> 即可,无需包含其它系统头文件,以空间换取时间

     

 三、UTF-8码中文字符在QT中的使用:

  1、国际标准字符集:

     UCS-2:双子节统一字符集,65000个字符

     UCS-4:四字节统一字符集,99089个字符

  2、UCS只是负责对字符的编码但没有规定如何传输和保存这些编码,随之就有UTF,它解决了字符编码后在程序中的保存以及传输,根据UTF算法不同可分为:

     UTF-8  :用1到4个字节表示一个Unicode字符

     UTF-16 :用2到4个字节表示一个Unicode字符

     UTF-32 :用四个字节表示一个Unicode字符

  3、QT中使用的字符编码格式是UTF-16,称之为内部编码;

  4、外部编码:源代码中使用的字面值形式的字符、字符串,通过程序界面输入的字符信息以及从网络上、进程间通信或其它媒介都去的字符和字符串,一般

  都会被称之为外部编码;当外部编码和内部编码不一致时,对于输入操作,QT会及可能的将外部编码转换为内部编码,而对于输出操作,则执行相反的转换

  程序员的工作就是要确保转换正确;

  5、解码器和翻译器:为了使Qt能够正确理解UTF-8格式的汉字字符,并将其正确的转换为内部编码,需要在程序中完成如下三步操作:

     #include<QTextCodec>

    A、创建可以理解UTF-8格式的外部编码的解码器

       QTextCodec* codec = QTextCode::codecForName("UTF-8");

    B、将上一步创建的解码器交给专司译码的翻译器

       QTextCodec::setCodecForTr(codec);

    C、将外部编码字符串翻译成内部编码的字符串

       QString str = QObject::tr("你好,Qt!");

    例:QTextCodec::setCodecForTr(QTextCodec::codeForNmae("UTF-8"));

        QLabel lab(QObject::tr("你好,Qt!"));

        

 四、信号和槽:

  1、信号的概念:当蝇虎或系统触发了一个动作,导致某个窗口部件的状态发生了改变,该部件就会发射一个信号,即调用该类中一个特定的成员函数;

     例如:子类QPushButton继承了基类QAbstractButton,然后创建了部件窗口内显示close,当用户点击close的时候,这个被创建的部件就会发射一

     个处理信号:void QAbstractButton::clicked(void) {...}大括号内与之对应的是相应的处理函数

  2、槽:槽几乎就是一个普通的类成员函数,它可以是公有的、保护、私有的,可以被重载,也可以被覆盖,其参数可以是任意类型,并可以在其它函

     数中被调用。槽函数与普通成员函数的差别并不在于其语法特性,而是在于其功能,槽函数更多体现为对某种特定信号的处理,或者说是对特定

     激励所做出的特定响应;

  3、连接信号和槽:既然信号表达了由用户或系统所出发的某种动作,而槽体现了窗口部件对该动作做出的响应,那么剩下的工作就是把表示动作的信号

     和表示响应的槽连接起来,这一步操作是通过 QObject 类的 connect() 成员函数完成的;

     bool QObject::connect (const Qobject* sender,const char* signal,const QObject* receiver,const char* mothod);

  |   |||

  信号发送对象        信号函数签名  信号接收对象         槽函数的签名

     其中,信号函数和槽函数的签名需要借助两个预定义宏:

     SIGNAL () -> 将信号函数签名表示成字符串

     SLOT ()   -> 将槽函数的签名表示成字符串

     举例:QObject::connect(&btn,SIGNAL (clicked (void)),&lab,SLOT (void));

     将btn对象的clicked信号与lab对象的close槽连接起来,当btn对象因用户点击而发射的clicked信号时,lab对象的close槽函数将被调用,最终

     完成关闭lab窗口部件的操作

  4、什么是函数签名:C++中可以通过差别化参数表实现重载,必须将函数名和参数表放在一起才能唯一标示一个函数,此即为函数签名;

 五、父窗口和子窗口

  1、如果把一个窗口作为某个容器窗口的子窗口,那么该窗口江北束缚在其父窗口的内部,并伴随父窗口一起移动、隐藏、显示和关闭,否则该窗口将

     作为独立窗口显示在屏幕上,且游离于其它窗口之外;

  2、QWidget函数:只有这个函数及其子类的对象可以作为其它窗口的容器,父窗口的析构函数负责销毁其所有的子窗口对象,因为,即使子窗口对象

     是通过new创建的而且也没有显式的delete,在关闭窗口的时候,父窗口也会为子窗口调用一次析构函数;

  3、设置窗口的位置和大小:

     设置窗口的位置: void move (int x,int y);

     设置窗口的大小: void resize (int w,int h);

  4、常见的容器窗口类:Qt中常见的容器窗口通常都可被用作应用程序的主框架

     QMainWindow :主窗口,通常由标题栏、菜单栏、工具条、状态栏以及中央客户区组成

     QMdiArea    :多文档,管理多个多文档子窗口的中央部件

     QDialog     :对话框,管理多个不同种类的交互式部件、

 六、事件同步

  1、滑块类:

     void setRange (int min,int max);   //设置
b066
滑动范围

     void setPageStep (int); //设置页步距

     void setValue (int); //设置当前值

     void valueChanged (int value) [signal];//值改变信号

  2、微调框类:

     void setRange (int min,int max);   //设置微调范围

     void setValue (int); //设置当前值

     void valueChanged (int value) [signal];//值改变信号

  3、值改变和改变值:滑块和微调狂虽然是两个独立的窗口部件,但它们现实的内容确是一个:学生的年龄,因此无论用户托拽滑块还是翻转微调框,

     另一个部件都必须做出相同的反应,这个称之为事件同步;

     QObject::connect(slider,SIGNAL (valueChanged (int)),spin,SLOT (setValue (int)));

     QObject::connect(spin,SIGNAL (valueChanged (int)),slider,SLOT (setValue (int)));

     无论滑块还是微调框,只要其中一个的数值发生变化,就会触发valueChanged信号,而该信号被连接到另一个部件的setValue槽上,信号和槽

     函数的参数就是变化后的值;valueChanged信号只有在滑块或微调框中的树枝确实发生变化的情况下才会触发,因此不必担心无限循环的发生;

     

     

     

     

     

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Qt学习随笔 qt