在QT程序中使用其它图形库
2005-04-19 18:03
549 查看
于明俭
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/
摘自:IBM developerWorks中国网站
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/
摘自:IBM developerWorks中国网站
相关文章推荐
- 【Qt】使用QProcess调用其它程序或脚本
- 为什么将Qt开发的使用数据库的程序发布到其它机器就连接不上数据库?
- 【Qt】使用QProcess调用其它程序或脚本
- Qt程序打包发布方法(使用官方提供的windeployqt工具)
- Qt程序打包发布方法(使用官方提供的windeployqt工具)
- 使用Qt和Enginio开发云端程序
- 使用Qt打开外部文件,调用外部程序(QDesktopServices,QUrl ,QProcess,QProcess)
- python v3.3.2中使用subprocess模块与其它程序进行管道通信
- 使用fatjar来实现将包括第三方jar包的项目到处成一个jar包供其它程序使用
- 使用VS2010开发Qt程序的4点经验(QT4到QT5的升级,更改sln文件,切换工程使用的Qt库,在VS的Solution Explorer视图中建立文件夹)
- Qt之程序打包(使用windeployqt.exe查找依赖库)
- Qt之启动外部程序(使用参数很全面,还使用了setProcessChannelMode)
- Ubuntu12.04下使用valgrind内存测试工具测试Qt程序
- Qt系统对话框中文化及应用程序实现重启及使用QSS样式表文件及使用程序启动界面
- 无法删除 xxx:它正在被其它用户/程序使用Unlocker
- Qt 使用 Google Breakpad 捕获程序崩溃报告(dump文件)
- 在VS2010中开发Qt程序使用QTest遇到error LNK2038
- windows下如何使用QT编写dll程序 .
- CoInitialize ( NULL )或其它启动代码。MFC程序使用AfxOleInit() 收回COM库。MFC 程序不用这一步,它自动完成。 CoUninitialize();