Window环境下Qt的消息获取

对于一个Widget程序,我们通常会看到下面的代码:

QApplication a(argc, argv);
...
return a.exec();

有过Win32程序开发经验的人都知道,在WinMain函数的最后有一个while循环来不断的接收消息和处理消息。我们大胆猜测Qt也使用了这种形式。那么这个循环可能出现的位置在a.exec() 中。通过调试Qt的源码,可以找到如下的调用过程:

int QApplication::exec()
{
    return QGuiApplication::exec();
}

int QGuiApplication::exec()
{
    ...
    return QCoreApplication::exec();
}

int QCoreApplication::exec()
{
    ...
    QEventLoop eventLoop;
    ...
    int returnCode = eventLoop.exec();
    ...
}

int QEventLoop::exec(ProcessEventsFlags flags)
{
    ...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第1章走近Qt 1.1Qt简介 1.2Qt纪事概览 1.3Qt套件的组成 1.4Qt的授权 1.5Qt的产品 1.6Qt的服务与支持 1.7Qt的最新进展 1.7.1增加协议 1.7.2开放源代码库 1.7.3确定Qt的发展方向 1.7.4Qt4.5——Qt发展的重要里程碑 1.8为什么选择Qt 1.9问题与解答 1.10总结与提高 第2章Qt的安装与配置 2.1获取Qt 2.2协议说明 2.3安装Qt 2.3.1Qt/X11的安装 2.3.2QtWindows的安装 2.3.3Qt/Mac的安装 2.3.4QtWindowsCE 2.3.5Qt/S60 2.3.6基于Linux发行版的安装 2.4配置Qt4环境 2.4.1Windows平台 2.4.2X11平台 2.5问题与解答 2.6总结与提高 第3章Qt编程基础 3.1标准C++精讲 3.1.1程序设计语言介绍 3.1.2C++语法基础知识 3.1.3C++高级应用——虚函数 3.2Windows编程基础 3.2.1需要掌握的技能 3.2.2Windows运行机理 3.2.3Windows编程基础 3.3Linux编程基础 3.3.1你必须掌握的技能 3.3.2文件系统管理 3.3.3XWindow系统 3.3.4常用命令 3.3.5Shell应用 3.3.6使用库程序 3.3.7使用vi 3.3.8使用GCC 3.3.9使用GDB 3.4Mac编程基础 3.4.1你必须掌握的技能 3.4.2MacOSX的系统架构 3.4.3MacOsX文件系统 3.4.4Cocoa应用开发简介 3.4.5Xcode简介 3.5问题与解答 3.6总结与提高 第4章Qt4集成开发环境 4.1常见的QtIDE 4.2QtCreator 4.2.1简介 4.2.2主要特点 4.2.3安装与配置 4.3Eclipse! 4.3.1简介 4.3.2主要特点 4.3.3安装与配置 4.3.4使用要领 4.4VisualStudio2008与Qt4.5 4.5问题与解答 4.6总结与提高 第5章使用Qt基本GUI工具 5.1使用QtDesigner。进行GUI设计 5.1.1简介 5.1.2启动并设置QtDesigner 5.1.3功能说明 5.1.4QtGUI设计基本流程 5.2使用QtAssistant获取在线文档与帮助 5.2.1简介 5.2.2Qt的参考文档 5.2.3使用QtAssistant 5.3使用QtDemo学习Qt应用程序开发 5.4问题与解答 5.5总结与提高 第6章Qt4程序开发方法和流程 6.1开发方法 6.2HelloQt 6.2.1基本流程 6.2.2源码分析 6.2.3.编译运行 6.2.4第2种方法 6.2.5第3种方法 6.3几个重要的知识点 6.4问题与解答 6.5总结与提高 第7章对话框 7.1QDialog类 7.2子类化QDialog 7.3快速设计对话框 7.4常见内建对话框的使用 7.4.1标准输入框 7.4.2标准颜色对话框 7.4.3标准字体对话框 7.4.4标准消息对话框 7.4.5标准对话框的使用实例 7.5模态对话框与非模态对话框 7.6问题与解答 7.7总结与提高 第8章主窗口 8.1主窗口框架 8.2创建主窗口的方法和流程 8.2.1方法 8.2.2流程 8.3代码创建主窗口 8.3.1头文件 8.3.2实现文件 8.4使用QtDesigner创建主窗口 8.4.1创建菜单 8.4.2创建动作 8.4.3创建工具栏 8.4.4创建锚接窗口部件 8.4.5创建心窗口部件 8.5心窗口部件专题 8.5.1几种常见情形 8.5.2创建和使用 8.6Qt4资源系统 8.6.1Qt资源系统的改进 8.6.2Qt4资源集文件 8.6.3资源文件的使用方法 8.6.4资源浏览器的使用 8.7锚接窗口 8.7.1创建锚接窗口的方法和流程 8.7.2设置锚接窗体状态的方法 8.8多文档 8.9问题与解答 8.10总结与提高 第9章Qt样式表与应用程序外观 9.1应用程序的外观 9.1.1应用程序的风格 9.1.2如何设置样式 9.2QStyle类的使用 9.3样式表概述 9.4使用样式表 9.4.1与QtDesigner集成使用 …… 第10章在程序使用.ui文件 第11章布局管理 第12章使用QtCreator 第13章Qt核心机制与原理 参考文献 后记
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
在 Linux 环境下,使用 Qt 显示 emf 文件需要使用一些平台相关的 API。以下是一种实现方式: ```c++ #include <QtGui> #include <X11/Xlib.h> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 读取 emf 文件 QFile file("test.emf"); if (!file.open(QIODevice::ReadOnly)) { qWarning("Failed to open file"); return -1; } QByteArray data = file.readAll(); // 获取 X11 显示连接 Display *display = QX11Info::display(); // 创建临时文件 char filename[] = "/tmp/qt-emf-XXXXXX"; int fd = mkstemp(filename); if (fd == -1) { qWarning("Failed to create temporary file"); return -1; } // 将 emf 数据写入临时文件 if (write(fd, data.constData(), data.size()) == -1) { qWarning("Failed to write to temporary file"); close(fd); unlink(filename); return -1; } // 加载 emf 文件 HMETAFILE hMetaFile = GetEnhMetaFile(filename); if (!hMetaFile) { qWarning("Failed to load metafile"); close(fd); unlink(filename); return -1; } // 获取 emf 文件的大小 RECT rcBounds; if (!GetEnhMetaFileHeader(hMetaFile, sizeof(ENHMETAHEADER), (LPENHMETAHEADER)&rcBounds)) { qWarning("Failed to get metafile header"); DeleteEnhMetaFile(hMetaFile); close(fd); unlink(filename); return -1; } // 创建 pixmap QPixmap pixmap(rcBounds.right, rcBounds.bottom); pixmap.fill(Qt::transparent); // 获取 pixmap 对应的 X11 drawable Window window = pixmap.x11Info().drawable(); // 创建 X11 图形上下文 GC gc = XCreateGC(display, window, 0, NULL); // 绘制 emf 文件到 pixmap PlayEnhMetaFile(gc, hMetaFile, &rcBounds); // 显示 pixmap QLabel label; label.setPixmap(pixmap); label.show(); // 清理资源 XFreeGC(display, gc); DeleteEnhMetaFile(hMetaFile); close(fd); unlink(filename); return app.exec(); } ``` 这个示例,我们首先读取 emf 文件的数据,然后将数据写入一个临时文件,并使用 `GetEnhMetaFile` 函数加载 emf 文件。接下来,我们获取 emf 文件的大小,并创建一个与其大小相同的 pixmap。然后,我们获取 pixmap 对应的 X11 drawable 和创建 X11 图形上下文,并使用 `PlayEnhMetaFile` 函数将 emf 文件绘制到 pixmap 上。最后,我们将 pixmap 显示在一个 QLabel 控件。 需要注意的是,这个示例使用了一些平台相关的 API,只适用于 Linux 平台上使用 X11 作为窗口系统的情况。在其他平台上可能需要使用不同的 API 来绘制 emf 文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值