【问题标题】:QT Unable to draw box on screen (QRect and QRubberBand)QT 无法在屏幕上绘制框(QRect 和 QRubberBand)
【发布时间】:2020-05-25 19:54:48
【问题描述】:

我正在尝试用 C++ 编写一个工具来帮助我学习语言。它将捕获屏幕上的一个区域(一个单词或句子),处理文本,然后在 GUI 应用程序中显示有关捕获文本的信息。

这是我正在尝试做的基本图表:

这应该与 gnome-screenshot 等屏幕捕获工具和 Microsoft 在 Windows 上的截图工具非常相似。

第三方应用程序类似于包含可扫描文本的 pdf 查看器或图像查看器。我的应用程序显示有关捕获的文本的信息。我的应用程序还在屏幕上绘制了一个可调整大小的“捕获窗口”,如图中围绕单词的红色框所示。

我的问题是关于在屏幕上绘制这个红色框。如何在屏幕上画一个红框?我一直在尝试用 xLib 和 QT 来做这件事,虽然我更喜欢用 QT 做这件事,因为它有更好的文档记录和跨平台。

编辑:我修改了问题,使其更简洁明了我的目标,以及接受的答案如何解决我的问题。

【问题讨论】:

  • 您的问题可能是您所说的屏幕上的框。你的意思是一个(大部分)透明的、无边界的窗口吗?当单词在屏幕上移动时,这个框会发生什么?您的程序如何知道要更新该框?
  • I failed to get GTK working for me, I couldn't get an example compiled你放弃得太快了,apt-get install gtkmm怎么样?至少你会处理 C++ 库。
  • 我找到了一些很好的截屏示例,qt 似乎可以做到这一点。我可以让他们根据屏幕上矩形的大小裁剪图像。但是,我似乎无法在屏幕上绘制一个矩形,这是让我感到沮丧的部分。是的,一个带有小边框的大部分透明盒子。当在单词上创建框时,我将文本捕获到图像,我的程序将在稍后定义的按键上获取图像。
  • 是的,我很早就放弃了 GTK。但是,如果事实证明这是浪费时间,我不想在这方面投入时间,因为我认为我的问题是错误的。
  • 当我读到你的问题的标题时,我想象有人试图用 ASCII 绘制框,或者有人尝试使用一些图形/游戏库来绘制框。在这两种情况下,它只会出现在您的 C++ 应用程序创建的窗口中。恕我直言,您可能有更多机会获得标题为“使用 C++ 捕获屏幕文本”或类似内容的答案。也就是说,明确表示您想要拦截其他应用程序编写的内容。

标签: c++ qt user-interface screenshot xlib


【解决方案1】:

您需要创建一个包含小部件的无框、alwaysOnTop 窗口。窗口应定义为具有半透明背景,而小部件将用于显示边框(或半透明背景)。然后,您可以通过检测鼠标在打开 pdf 的窗口上的点击来通过代码操作窗口的位置和大小。

这是一个例子:

代码:

QMainWindow window;
window.setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
window.setAttribute(Qt::WA_TranslucentBackground, true);
window.setFixedSize(80, 20);
window.move(500,500);

QWidget widget(&window);
widget.setStyleSheet("border: 3px solid rgb(255,0,0)");

window.setCentralWidget(&widget);
window.show();

【讨论】:

  • :D:D 完美!这正是我需要的指导,谢谢!
  • 在使用它作为我工作的基础稍微开发了我的代码之后,我注意到我的窗口在没有运行合成器的情况下是不透明的。我使用 i3-gaps 和 compton 作为合成器运行 Linux。这让我担心以后转向跨平台。此解决方案是否适用于 MacOS 和 Windows?大多数 Linux 发行版都带有合成器吗?我也稍微改变了我的方法。现在我有一个屏幕大小的透明窗口,我正在使用 QRubberBand 在屏幕上绘制捕获框。
【解决方案2】:

已接受的答案是此问题的首选解决方案,但在回答此问题后,我发现了一个示例项目,它完成了我使用 xlib 的目标。

https://github.com/gvalkov/xrectsel

为了完整起见,我将其包含在内,但 QT 解决方案具有更好的 API 并且是跨平台的。所以,这更适合我对这个程序的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-31
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多