Linux下应用程序开发:QT中使用图形库
作者:小白菜 | 来源:互联网 | 2017-06-25 16:41
文章标题:Linux下应用程序开发:QT中使用图形库。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类
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();
推荐阅读
-
三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ...
[详细]
蜡笔小新 2024-12-28 01:27:47
-
本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ...
[详细]
蜡笔小新 2024-12-27 11:26:39
-
-
SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ...
[详细]
蜡笔小新 2024-12-26 15:11:34
-
SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ...
[详细]
蜡笔小新 2024-12-25 19:26:39
-
本文详细介绍了MicroATX(也称Mini ATX)和MATX主板规格,探讨了它们的结构特点、应用场景及对电脑系统成本和性能的影响。同时,文章还涵盖了相关操作系统的实用技巧,如蓝牙设备图标删除、磁盘管理等。 ...
[详细]
蜡笔小新 2024-12-25 18:53:29
-
在过去两周中,我们利用 ReportViewer 开发了与生产良率相关的报表,其中每个制程的直通率是所有测试项良率的乘积。由于 ReportViewer 没有内置的累乘函数,因此需要借助自定义代码来实现这一功能。本文将详细介绍实现步骤和相关代码。 ...
[详细]
蜡笔小新 2024-12-25 17:12:03
-
本文详细介绍了在 Windows 2000 系统中启用 TELNET 服务时需要注意的 NTLM 配置问题,帮助用户解决常见的身份验证失败错误。 ...
[详细]
蜡笔小新 2024-12-24 11:20:52
-
在计算机系统运行过程中,硬件或电源故障可能会导致文件系统出现异常。为确保数据完整性和系统稳定性,定期进行磁盘健康检查至关重要。本文将详细介绍如何使用fsck和badblocks工具来检测和修复文件系统及硬盘扇区的潜在问题。 ...
[详细]
蜡笔小新 2024-12-23 13:17:57
-
雨林木风 GHOST XP SP3 经典珍藏版 V2017.11 ...
[详细]
蜡笔小新 2024-12-22 21:59:11
-
本文深入分析了 USDC 的稳定性和可能的救援措施,探讨了在硅谷银行破产后 USDC 面临的风险以及行业内的反应。 ...
[详细]
蜡笔小新 2024-12-22 16:05:49
-
小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ...
[详细]
蜡笔小新 2024-12-22 13:59:04
-
主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ...
[详细]
蜡笔小新 2024-12-22 13:48:42
-
本文探讨了如何在VBA中动态执行保存为变量的代码行,特别是针对不同表单的字段引用。通过示例和详细的解答,帮助读者掌握这一技术。 ...
[详细]
蜡笔小新 2024-12-22 11:24:17
-
本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ...
[详细]
蜡笔小新 2024-12-21 19:49:35
-
1,bat由来:BATCH,一批,成批作业,批处理文件后缀BAT就取的前三个字母。2,Pingsz.tencent.com>a.txt>的作用为, ...
[详细]
蜡笔小新 2024-12-21 10:55:47
-