Linux下QT图形界面开发 - 概述(1)

来源:互联网 发布:mcgs软件抢答器编程 编辑:程序博客网 时间:2024/04/28 09:46

  一、QT简介

  Qt是一个跨平台的C++图形用户界面库,.由挪威TrollTech公司出品,目前包括Qt/X11,基于Frambuffer的Qt Embedded,快 速开发工具Qt Designer几国际化工具Qt Linguist等.Qt支持Unix及Linux系统,还支持 Windows NT/Windows 2k及Qindows 95/98平台.Qt的良好封装机制使其模块化程度非常高,可重用性较好.

  Qt/Embeded是面向嵌入式系统的Qt版本,是Qt的嵌入式Linux窗口,是完整的自包含C++ GUI和基于Linux的嵌入式品台开发工具。Qt/Embeded API可用于多种开发项目。许多基于Qt的X Window程序可以非常方便地移植到嵌入式版本。

  下面我们就从实际应用中认识Qt.

  二、在终端下编写Qt程序

  我们先要介绍在终端窗口编写Qt程序.

  打开一个终端,建立一个文件夹,如:mkdir hello

  然后进入这个文件夹:cd hello

  创建c++文件,vi hello.cpp

  在文件中键入下面的代码:

  #include <qapplication.h>

  #include <qlabel.h>

  int main(int argc,char *argv[])

  {

  QApplication app(argc,argv);

  QLabel *label=new QLabel("Hello Qt!",0);

  app.setMainWidget(label);

  label->show();

  return app.exec();

  }

  然后我们用qt的工具qmake来生成工程文件:

  qmake -project

  大家可以用ls查看一下,是不是多了一个名为hello.pro的工程文件.

  接下来是生成Makefile文件:

  qmake hello.pro

  呵呵,ls一下,Makefile终于看到你的.

  接下来就是make了,等上一段时间.

  运行程序./hello

  下面是界面:

  下面我们来讲解上面的程序:

  #include <qapplication.h>

  这一行包含了QApplication类的定义。在每一个使用Qt的应用程序中都必须使用一个QApplication对象。QApplication管理了各种各样的应用程序的广泛资源,比如默认的字体和光标。

  #include <qpushbutton.h>

  这一行包含了QPushButton类的定义。参考文档的文件的最上部分提到了使用哪个类就必须包含哪个头文件的说明。

  QPushButton是一个经典的图形用户界面按钮,用户可以按下去,也可以放开。它管理自己的观感,就像其它每一个QWidget。一个窗口部件就是一个可以处理用户输入和绘制图形的用户界面对象。程序员可以改变它的全部观感和它的许多主要的属性(比如颜色),还有这个窗口部件的内容。一个QPushButton可以显示一段文本或者一个QPixmap。

  int main( int argc, char **argv )

  main()函数是程序的入口。几乎在使用Qt的所有情况下,main()只需要在把控制转交给Qt库之前执行一些初始化,然后Qt库通过事件来向程序告知用户的行为。

  argc是命令行变量的数量,argv是命令行变量的数组。这是一个C/C++特征。它不是Qt专有的,无论如何Qt需要处理这些变量(请看下面)。

  QApplication a( argc, argv );

  a是这个程序的QApplication。它在这里被创建并且处理这些命令行变量.在任何Qt的窗口系统部件被使用之前创建QApplication对象是必须的。

  QPushButton hello( "Hello world!", 0 );

  这里,在QApplication之后,接着的是第一个窗口系统代码:一个按钮被创建了。

  这个按钮被设置成显示“Hello world!”并且它自己构成了一个窗口(因为在构造函数指定0为它的父窗口,在这个父窗口中按钮被定位)。

  hello.resize( 100, 30 );

  这个按酒被设置成100像素宽,30像素高(加上窗口系统边框)。在这种情况下,我们不用考虑按钮的位置,并且我们接受默认值。

  a.setMainWidget( &hello );

  这个按钮被选为这个应用程序的主窗口部件。如果用户关闭了主窗口部件,应用程序就退出了。

  你不用必须设置一个主窗口部件,但绝大多数程序都有一个。

  hello.show();

  当你创建一个窗口部件的时候,它是不可见的。你必须调用show()来使它变为可见的。

  return a.exec();

  这里就是main()把控制转交给Qt,并且当应用程序退出的时候exec()就会返回。

  在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。

三、用快速开发工具Qt Designer编写Qt程序

  我们用的开发系统是Linux,开发工具是Qt Designer.如果大家安装完整版的Linux,系统就带这个工具了.大家可以点击应用程序->编程->Qt Designer来找到它.

  

  Qt Designer首先呈现给用户的是一个New/Open对话框。因为这里要创建一个C++程序,所以在此选择C++ Project,点击“OK”继续。

  

  选择一个想要保存文件的位置,并且给出一个文件名,注意这里文件名的扩展名一定要是.pro。点击“OK”后,到下面的界面.

  

  现在我们看到的就是Qt Designer主窗口,确保Property Editor可见。如果它是不可见的,用户可以通过Windows→Views→Property Editor/Signal Handlers选单选项来使其可见.

  下面我们建立一个如下图所示的对话框.

  

  通过选择File→New选单,然后选择Dialog来创建一个新的对话框。这时Qt Designer会创建一个新的空白对话框,用户可以在其上放置输入框和按钮。

  打开Property Editor,把name的值改为“MainForm”,把caption的值改为“Hello world”。 '

  然后我们在对话框上拖拽上一个lable,方法是在左面Toolbox的common widgets里的TextLabel,然后在空白对话框上画一下.改一下caption的值改为“Hello world”就得到如下的界面了.

  

  现在就已经基本完成这个应用程序了。不过在编译和运行此应用程序之前,还要创建一个main.cpp文件。方法是选择File→New→C++Main- File(main.cpp),只需接受缺省的配置即可。main.cpp会自动在Code Editor中打开。因为这里无需改变main.cpp中的 任何东西,所以直接将Code Editor窗口关闭,并且保存main.cpp。

  到此为止,在Qt Designer中的工作已经完成了。保存整个项目,下面来编译和运行这个程序。在编译程序之前,要首先生成它的Makefile文件。打开一个终端,然后切换至保存有项目的位置,使用以下命令来生成Makefile文件:

  #qmake -o Makefile hellopro

  现在,就可以运行make来编译程序了,根据系统的性能,这个步骤需要花费一点时间。当编译工作完成后,输入./hello来运行程序。如果一切正常,用户应该已经看到程序了。

  下面是我电脑上程序的界面:

  

  到这里我们完成了第一个Qt的程序,怎么样呢,是不是有点小成就感.

  这里我还有个建议:

  最好把每一个项目单独放在一个文件夹里.这样就可以让我们更方便的使用QT为我们提供的工具,例如qmake等。

  一、信号和槽

  Qt的一项重要的机制就是它的信号和槽,在图形用户界面编程中,经常需要将一个窗口部件的变化通知给另一个窗口部件,或者说系统对象进行通信.一般的图形用户编程中采用回调函数进行对象间通信(如:gtk+),这样回调函数和处理函数捆绑在一起,但这样做没有信号和槽机制简便和灵活.

  如Qt的窗口部件有多个预定义的信号,槽是一个可以被调用处理特定信号的函数.Qt的窗口部件有多个预定义的槽,当一个特定的时候发生的时候,一个信号被发射,对信号感兴趣的槽就会调用对应响应函数.

  信号/槽机制在QObject类中实现,从QObject类或其一个子类继承的所有类可以包含信号和槽.当对象改变其状态的时候,信号被发送,对象不关心有没有其他对象接收到这信号.槽是类的正常成员函数,可以将信号和槽通过connect函数任意相连.当一个信号被发射,它所连接的槽会被立即执行,如同一个普通函数调用一样.

  槽是普通成员函数,它和普通成员函数一样分为public、protected和private共3类。Public slots表示声明是任何信号都可以相连的槽;protected slots表示这个类的槽及其子类的信号才能连接;private slots表示这个类本声的信号可以连接这个类的槽。

  二、 在Qt Designer中信号应用实例

  下面我们用一个实例来了解信号的用法.

  首先我们新建一个文件夹:

  #mkdir /root/Desktop/qt/signal

  我们打开Qt创建项目,项目路径为 /root/Desktop/qt/signal/signal.pro

  从菜单栏的 File->New 打开新建对话框,选择第二个:Dialog,然后也同样保存到刚刚创建的文件夹下。

  这时侯,你的 QT Designer 中就会出现一个 From1 来. 更改右下角那个窗口里的name 改为MainFrom.把caption的值改为signal".

  然后我们从左面的Toolbox拖拽一个PushButton.并把name改为ExitButton,把text改为Exit.

  下面是效果图:

  

  到这里我们已经把页面设置完了,下面我们为ExitButton设置信号函数.

      我们按一下 F3(或者有菜单栏选择 Edit->Connections ),然後在那个 “Exit” 按钮上点击一下。

  这时侯我们就看到了View and Edit Connection 页面了. 在Signal中选择clicked,在slot中,先选择close()就好了,在 Reciever中选择MainFrom.这时侯选择OK.

   

  我们就算是基本完成了。保存下。 如果想看看这个小程序长什麽样子.可以用 CTRL+T来看 PreView. 

  我们现在还不能编译这个程序,为什么呢?对了因为我们还缺少一个main.cpp。想一想上一章怎样创建的了。从菜单栏的File->New打开新建对话框,选择最后一个:C++ Main—File(main.cpp).

  好了,现在来编译我们的程序。

  先打开一个终端,然后切换到我们建立工程的目录。然后利用Qt的工具生成Makefile文件。# qmake

  编译:# make

  运行:# ./signal

  点击Exit按扭,程序退出。

  三、在Qt Designer中槽应用实例

  下面我们要做一个加法器。打开Qt,新建名为slot的工程文件,然后再新建如下图所示的界面:

  

  修改要显示结果的label的name为textLableresult.并把其text清空.把确定按扭的name改为AddButton.

  好了,我们已经把页面设置好了.我们现在要做的就只有使用户按AddButton按扭时textLableresult能够显示lineEdit1和lineEdit2的和.所以我们必须对AddButton的clock信号设置一个槽.

  首先按一下 F3(或者有菜单栏选择 Edit->Connections ),然后在AddButton按钮上点击一下这时侯我们就看到了"View and Edit Connection"的页面了。在Signal中选择clicked, 在Receiver中选择MainForm.在Slot中,都是QT为我们准备好的槽,我们需要建立自己的槽.

  点击右边的“Edit Slots...”按钮,然后就可以看见" Edit Functions "窗口,该窗口也可以通过“主菜单 Edit->Slots” 打开。点击 "New Function" 按钮,将"newSlot()"改为 "add()" ,然后选择 OK。

  这时我们已经建立了一个槽,我们再回到 "View and Edit Connection"对话框中,在 Slot 中我们现在看到了刚刚自己创建的槽"add()",我们选择它.这样就可以使AddButton的信号与add()槽关联起来了。

  

  我们还需要向add()槽里写一些代码,使它能够完成加法功能.在主窗体"form_main"的空白处双击鼠标左键,弹出对话框"Creating ui.h file",我们选择"Yes",然后可以看到一个编辑窗口。如下图所示:

  

  我们需要在 void MainForm::add()中添加如下的代码:

  void MainForm::add()

  {

      QString str1,str2,strResult;

      double add1=0.0,add2=0.0,result0.0;

      str1=lineEdit1->text();

      str2=lineEdit2->text();

      Bool ok1=FALSE,ok=FALSE;

      add1=str1.toDouble(&ok1);

      add2=str2.toDouble(&ok2);

      if(ok1&&ok2)

      {

          result=add1+add2;

          strResult.sprintf("%f",result);

          textLabelResult->setText(strResult);

      }

  }

  到这里我们编辑的工作就都结束了,我们先保存。然后打开一个终端,改变当前目录为我们保存项目的目录,然后

  生成Makefile文件:#qmake

  编译:# make

  运行:# ./ slot

  下面是我运行的界面:

  

  四、在终端窗口中Qt编程信号的应用实例
打开一个终端,用vi建立一个文件t2.c,键入如下程序:
#include <qapplication.h>
#include <qpushbutton.h>
int main( int argc, char **argv )
{
QApplication a( argc, argv ); //创建QApplication对象
QPushButton quit( "Quit", 0 ); //添加一个按扭,因为这个按钮是一个顶层窗口,我们把0作为它的父对象
quit.resize( 75, 30 ); //设置按扭尺寸
QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) );// quit按扭的clicked信号与QApplication对象的quit()槽连接
a.setMainWidget( &quit ); //设置a为这个应用程序的主窗口部件
quit.show(); //显示quti按扭
return a.exec();
}

  生成工程文件:

  qmake -project
生成makefile
qmake

  编译mnake

  
下面是界面截图:

  

  
用户点击按扭,程序退出.

  6.1.2  Qt介绍

  Qt是一个跨平台的C++图形用户界面库,由挪威TrollTech公司出品,目前包括Qt、基于FrameBuffer的Qtopia Core、快速开发工具Qt Designer和国际化工具Qt Linguist等部分。Qt支持所有的UNIX系统,当然也包括Linux系统,还支持WinNT/Win2k、Windows 95/98平台。

  基本上Qt同X-Window上的Motif、Openwin、GTK等图形界面库和Windows平台上的MFC、OWL、VCL、ATL是同类型的。不过Qt还具有下列一些优点。

  (1)优良的跨平台特性。

  Qt支持下列操作系统:Microsoft Windows 95/98、Microsoft Windows NT、Linux、Solaris、SunOS、HP-UX、Digital UNIX (OSF/1、Tru64)、Irix、FreeBSD、BSD/OS、SCO、AIX、OS390和QNX等。

  (2)面向对象。

  Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt提供了一种称为signals/slots 的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。

  (3)丰富的API。

  Qt包括多达250个以上的C++类,还提供基于模板的collections、serialization、file、I/O device、directory management和date/time类。甚至还包括正则表达式的处理功能。

  (4)支持2D/3D图形渲染,支持OpenGL。

  (5)大量的开发文档。

  (6)XML支持。

  但是真正使得Qt在自由软件界的众多Widgets(如Lesstif、Gtk、EZWGL、Xforms及fltk等)中脱颖而出的还是基于Qt的重量级软件KDE。Qt虽然是商业公司的产品,但是走的却是开源路线,提供免费下载,全部都是开放源代码,非商业用途亦采用GPL的版权宣告,著名的Open Source"KDE"项目便是采用Qt开发的。

  Trolltech也针对嵌入式环境推出了Qt/Embedded产品。与桌面版本不同,Qt/Embedded已经直接取代了X Server及X Library等角色,将所有的功能全部整合在一起。

  Qt/Embedded同样具有跨平台的特点,省掉了不少移植软件的功夫,这样的概念和Java十分接近。同时它还采用模块化设计,其最大的好处是有弹性,Qt/Embedded号称最小,可以缩到800 KB左右,最多可以长到3 MB(for Intel x86),这样的弹性也让Qt/Embedded更适合在嵌入式环境下生存。

  Qt/Embedded延续了Qt在X上的强大功能,在底层摒弃了X lib,仅采用FrameBuffer作为底层图形接口。同时,将外部输入设备抽象为keyboard和mouse输入事件,底层接口支持键盘、GPM鼠标、触摸屏及用户自定义的设备等。

  Qt/Embedded类库完全采用C++封装。丰富的控件资源和较好的可移植性是Qt/Embedded最为优秀的一方面。它的类库接口完全兼容于同版本的Qt-X11,使用X下的开发工具可以直接开发基于Qt/Embedded的应用程序QUI界面。

  与前两种GUI不同的是,Qt/Embedded的底层图形引擎只能采用FrameBuffer,这就注定了它是针对高端嵌入式图形领域的应用而设计的。由于该库的代码追求面面俱到,以增加它对多种硬件设备的支持,造成了其底层代码比较凌乱,各种补丁较多的问题。Qt/Embedded的结构也过于复杂和臃肿,很难进行底层的扩充、定制和移植,尤其是用来实现signal/slot机制的moc文件。

  Qt/Embedded当前已经升级为Qtopia Core和Qtopia Core,继承了Qt4的新技术,包括:高性能渲染引擎、模板容器类及基于行为的主窗口架构,改进的功能特点包括文本渲染与多线程技术。当编译Qtopia Core时,可以去除不用的功能,以最小化软件的占用空间.
0 0