Linux下應用程式開發:QT中使用圖形庫(轉)
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();
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Qt開發】更改應用程式圖示和工作列圖示QT
- Qt 嵌入式圖形開發大全和QT開發手冊QT
- Qt-跨平臺的C++圖形使用者介面應用程式框架(一)QTC++框架
- 如何在windows下發布QT應用程式(qt專案打包)WindowsQT
- 使用 MPAndroidChat 開發圖表應用Android
- 6 款面向 Linux 使用者的開源繪圖應用程式Linux繪圖
- 基於SkyEye執行Qt:著名應用程式開發框架QT框架
- PHP開發者超級適用的圖形處理庫PHP
- Qt開發技術:圖形檢視框架(一)基本介紹QT框架
- 使用XMing+putty執行linux圖形介面程式Linux
- Qt場景中圖形項的刪除QT
- 小程式開發-mpvue中使用圖表庫Vue
- 用linuxdeployqt吧Qt應用部署到LinuxLinuxQT
- linux下qt用c++呼叫pythonLinuxQTC++Python
- NVIDIA開始開源其Linux核心圖形驅動程式Linux
- SourceGenerator的應用: .Net多程式開發庫 - JuxtaposeUX
- 使用shell指令碼在Linux中管理Java應用程式指令碼LinuxJava
- C++ Qt開發:SqlTableModel對映元件應用C++QTSQL元件
- 使用 Tye 輔助開發 dotnet 應用程式
- 在Docker容器中執行GUI圖形應用的開源專案DockerGUI
- Qt開發工具使用QT
- C/C++ Qt TreeWidget 單層樹形元件應用C++QT元件
- window下使用nw.js開發桌面應用程式環境的搭建JS
- Linux無圖形介面環境使用Python+Selenium實踐 (轉載)LinuxPython
- 【配置上線】Oracle資料庫Linux系統下安裝(圖形介面)Oracle資料庫Linux
- 手把手教你玩轉HarmonyOS版地圖應用開發地圖
- 如何使用 VS Code 開發.NET Core應用程式
- flutter開發使用blutter開源庫逆向flutter應用步驟Flutter
- C++ Qt開發:TreeWidget 樹形選擇元件C++QT元件
- PyQt應用程式中的多執行緒:使用Qt還是Python執行緒?QT執行緒Python
- 小程式開發中雲函式的應用!函式
- Linux應用開發自學之路Linux
- 帶你從0開發圖表庫系列-初具雛形
- PHP如何使用比特幣Coinbase錢包庫開發應用PHP比特幣
- 服務計算--使用 golang 開發 開發 Linux 命令列實用程式 中的 selpg作業3GolangLinux命令列
- C++(Qt)-GIS開發-簡易瓦片地圖下載器C++QT地圖
- QT 自定義QGraphicsItem 縮放後旋轉 圖形出現漂移問題QT
- zqt_helper 輕鬆開發Qt5 Widgets應用QT
- 線性代數在前端中的應用(二):實現滑鼠拖拽旋轉元素、Canvas圖形前端Canvas