跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

在 QT 程序中使用其它图形库

于明俭

XML error: Please enter a value for the author element's jobtitle attribute, or the company-name element, or both.


于明俭 has authored this article

简介: QT 是 X窗口系统下很完善的图形库,在此之前,OSF/Motif曾经是占主导地位的高层图形库,并且形成了商业的标准。一些商业 UNIX系统上的使用的通用桌面环境便是基于Motif的,软件JAVA、Netscape等等都使用了Motif。使一些早期的程序能够在 QT中重用是一个比较有兴趣的话题。

发布日期: 2001 年 4 月 01 日
级别: 初级
访问情况 : 1877 次浏览
评论: 


GTK,作为与 QT 并存的另外一套图形库,深受C程序员的喜爱。在同一程序中使用 QT 和 GTK,甚至是其它图形库,对于编写嵌入式(Embeded)程序是十分有意义的。这也正式本文章所阐述的主题。

嵌入式程序的概念

嵌入式程序一般没有自己的主循环体,它直接使用窗口的ID来嵌入到其它窗口中。在 Xlib 层次上,使用函数 XReparentWindow 重新设置一个窗口的父窗口:

        XReparentWindow(Display *display, Window w,
            Window parent, int x, int y)

即可以把窗口 w 嵌入到窗口 parent 中。

嵌入式程序一般使用动态库载入的方法,这样使用任何X窗口系统下的图形库,都可以通过输出(Export)其窗口ID的方法和其它程序库协同工作。嵌入程序需要父窗口来管理窗口的一些操作,如窗口的尺寸管理,键盘聚焦等等。一个完整的应用程序也可以嵌入到其它窗口中,一般地,建立主窗口时使窗口不受管理,然后使用XReparentWindow()设置父窗口。


在 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);
        }
    };


在 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();


参考资料

  1. Qt-2.x 中的例子: http://www.troll.no/
  2. QGtkWidget: http://freshmeat.net/projects/qgtkwidget/

关于作者

于明俭 has authored this article

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=20766
ArticleTitle=在 QT 程序中使用其它图形库
publish-date=04012001
author1-email=
author1-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。