Linux下應用程式開發:QT中使用圖形庫(轉)

BSDLite發表於2007-08-12
Linux下應用程式開發:QT中使用圖形庫(轉)[@more@]  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();

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-949517/,如需轉載,請註明出處,否則將追究法律責任。

相關文章