• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

Linux下应用程序开发:QT中使用图形库

发布: 2007-7-04 12:06 | 作者: admin | 来源:  网友评论 | 查看: 21次 | 进入软件测试论坛讨论

领测软件测试网
  GTK,作为与 QT 并存的另外一套图形库,深受C程序员的喜爱。在同一程序中使用 QT 和 GTK,甚至是其它图形库,对于编写嵌入式(Embeded)程序是十分有意义的。这也正式本文章所阐述的主题。
  
  1. 嵌入式程序的概念
  嵌入式程序一般没有自己的主循环体,它直接使用窗口的ID来嵌入到其它窗口中。在 Xlib 层次上,使用函数 XReparentWindow 重新设置一个窗口的父窗口:
  
      XReparentWindow(Display *display, Window w,
        Window parent, int x, int y)
  
  即可以把窗口 w 嵌入到窗口 parent 中。
  
  嵌入式程序一般使用动态库载入的方法,这样使用任何X窗口系统下的图形库,都可以通过输出(Export)其窗口ID的方法和其它程序库协同工作。嵌入程序需要父窗口来管理窗口的一些操作,如窗口的尺寸管理,键盘聚焦等等。一个完整的应用程序也可以嵌入到其它窗口中,一般地,建立主窗口时使窗口不受管理,然后使用XReparentWindow()设置父窗口。
  
  2. 在 QT 中使用 Motif
  在 QT 2.x 版本中有一个 QT 的 Xt/Motif 的扩展,它可以使用户编写同时支持 Xt/Motif 和 Qt 的程序。QT 对于Xt/Motif 的扩展是建立了类 QXtWidget 和类 QXtApplication,它主要处理了嵌入窗口的底层事件。
  
  建立一个以 QT 为主的包含Motif组件(Widget)的程序,只要使用QXtApplication 建立主程序,设置一个可以包含QT和Motif窗口的主窗口即可,例如:
  
      QXtApplication app(argc, argv, "TwoEditors");
      TwoEditors m;
      app.setMainWidget(&m);
      m.show();
      return app.exec();
  
  在 m 中设置两个窗口,一个是QT类建立的,一个是QXtWidget类建立的,
    class TwoEditors : public QMainWindow {
      QMultiLineEdit* qtchild;
      EncapsulatedXtWidget* xtchild;
  
      public:
      TwoEditors() : QMainWindow( 0, "mainWindow") {
        QPopupMenu* file = new QPopupMenu( this );
        file->insertItem("E&xit", qApp, SLOT( quit() ) );
        menuBar()->insertItem( "&File", file );
        statusBar();
        QSplitter* splitter = new QSplitter( this );
        splitter->setOpaqueResize( TRUE );
        setCentralWidget( splitter );
        xtchild = new EncapsulatedXtWidget( splitter );
        qtchild = new QMultiLineEdit( splitter );
        qtchild->setText(QTEDMSG);
      }
    };
  
  3. 在 QT 中使用 GTK
  在 QT 中使用 GTK 稍复杂一些,主要是因为必须把 QT 的主循环和 GTK 的主循环融合到一起比较复杂。在软件包 QGtkWidget 中,作者使用了 GTK 的一部分代码,QT的一部分代码和KDE的一部分代码,构造了 QGtkWidget 类和 QGtkApplication类。
  
  编写程序的结构和上面的例子类似,
  
    QGtkApplication a( argc, argv );
    QMainWindow *wnd=new MainWnd();
    QPushButton *Qt=new QPushButton("This is Qt!", wnd);
    QGtkWidget *Gtk=new QGtkWidget(wnd);
    wnd->resize(200,100);
    Qt->setGeometry(0,0,100,50);
    Gtk->setGeometry(100,0,100,100);
    GtkWidget *box=gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(Gtk->getGtkWidget()), box);
    GtkWidget *b=gtk_button_new_with_label("This is GTK!");
    gtk_box_pack_start(GTK_BOX(box), b, TRUE, TRUE, 0);
    gtk_widget_show(b);
    gtk_widget_show(box);
  
    wnd->show();
    a.setMainWidget( wnd );
    gtk_widget_show(b);
    gtk_widget_show(box);
  
    return a.exec();

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网