【问题标题】:What winapi functions does QT use to display text? [closed]QT用什么winapi函数来显示文本? [关闭]
【发布时间】:2011-04-23 18:59:44
【问题描述】:

我对 QT 用于显示文本(在按钮等上)的 WinApi 函数感兴趣

任何输入都将得到重视。

编辑: 我对使用的特定功能感兴趣,即它们的名称。假设我们有一个带有文本集的 QLabel,现在,最终将调用什么 gdi/user32 函数来获取文本。

【问题讨论】:

  • Windows 按钮上的文本由 Windows API 绘制,而不是由调用函数来绘制文本的应用程序绘制。这里没有真正的问题。
  • @David:我稍微改进了这个问题。
  • QT 是开源的……看源码就行了。
  • 标签可能会调用 DrawText 或 DrawTextEx,因为它们提供了下划线快捷键的功能。正如布赖恩所说,您可以阅读源代码。
  • @David:我会下载源代码,但我的磁盘空间非常低,所以不适合。星期一我会有一个新的硬盘驱动器,但我需要尽快完成这个特别的事情。问题是,我想截获一个 QT4 应用程序的输出并需要挂钩一个函数。 DrawTextEx 和 ExtTextOut 都不会截取数据。我对这样一个窗口的内容很感兴趣:link

标签: winapi qt text


【解决方案1】:

Spy++ 看不到任何子窗口的原因是因为您看到的窗口实际上是一个大窗口,而 Qt 绘制了按钮。所以你看到的这些按钮没有自己的HWNDs。 Qt 碰巧也实现了某种事件系统,因此当您“单击”“按钮”时,它会执行某些操作。它们就是我们所说的“轻量级”控件或"windowless" controls

这与 Internet Explorer 和 Firefox 的工作方式相同。您在网页上看到的按钮由渲染引擎绘制,浏览器模拟按钮点击。

因此,查看 Qt 的工作原理实际上是了解 Windows API 工作原理的一种非常糟糕的方法。与 Windows API 接口的代码深埋在源代码中。 Qt是一个跨平台的框架,所以它不能在公共接口中暴露Windows API。

如果您想从 Windows API 开始,you can start with this tutorial。它将逐步展示如何使用 C++ 和 Windows API 创建窗口、按钮等。

请注意,Windows API 不是 GUI 工具包(尽管每个人似乎都认为它是)。它是操作系统本身的低级应用程序接口,提供实现应用程序所需的原语(例如文件、窗口、线程、网络等)。这就是为什么您会看到很多人使用框架或库(如 Qt、FLTK、WxWidgets 等)或编写自己的框架或库的原因。

【讨论】:

  • 一直都是这样吗?我认为 Qt 使用了本机小部件。
  • @David Heffernan:我相信情况一直如此。 Qt 可以使用操作系统的主题 API 来绘制按钮,因此它们看起来与它们的原生等价物完全一样,但除此之外它们完全由 Qt 本身绘制。
  • 我使用 WinApi 已经 10 多年了,所以没有必要告诉我这是什么。我实际上已经设法弄到一台笔记本电脑并下载了源代码,所以我也发现了这一点。我还发现了如何截取我想要的数据,所以我相信这个问题有待解决:)。不过,感谢您的宝贵时间。
  • @RSuthke:啊,抱歉。您不像我在您的问题中想象的那样熟悉 Windows API。不过,教程链接有很多关于如何在 Windows API 中进行基本 GUI 操作的信息,like this one for drawing text
  • 我熟悉该教程中的技术 :)。 Qt 实际上是自己绘制字母的,所以它对我手头的问题毫无用处。
【解决方案2】:

Qt 仅在创建顶级窗口或任何真实窗口时才使用CreateWindowEx(例如Qt::WindowQt::Tool 标志集)。

其余的都是模拟的。 Qt 从 Windows 上的 UxTheme 获取位图,并使用它自己的例程处理所有事情——事件、消息、事件循环、渲染。

你看到的这些魔法——带有 3d 效果的原生窗口......它们实际上是非原生的,它们只是看起来原生的。它们是 UxTheme 的位图,转换为 OpenGL 纹理(或 Direct3D 纹理)并使用 GPU 进行渲染。

Qt 似乎有时会调用TextOut,但并非总是如此。例如,自己的字体渲染发生在 QGLWidgets 或者如果设置了 GraphicsEffect。

所以你的答案是:去检查源。 QT 呈现一切的方式很有趣,但不依赖于 GDI TextOut 等 API 函数。

以 Windows 的方式连接到 Qt 应用程序将非常困难。

【讨论】:

  • 解决了这个问题,我的东西现在开始工作了 :)。
猜你喜欢
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多