Qt学习笔记01

来源:互联网 发布:exe软件汉化工具 编辑:程序博客网 时间:2024/06/05 17:14

 
 一、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);   //设置滑动范围
     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信号只有在滑块或微调框中的树枝确实发生变化的情况下才会触发,因此不必担心无限循环的发生;
     
     
     
     
     
    
0 0
原创粉丝点击