分享
 
 
 

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

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

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

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

参考资料:

Qt-2.x 中的例子: http://www.troll.no/

QGtkWidget: http://freshmeat.net

/projects/qgtkwidget/

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有