首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Qt应用程序的同时添加其他系统级后台例程?

如何在Qt应用程序的同时添加其他系统级后台例程?
EN

Stack Overflow用户
提问于 2017-12-06 08:54:37
回答 1查看 63关注 0票数 1

我已经创建了两组头文件和源文件,它们通过使用Qt5读取全局鼠标指针坐标( libxdo无法读取),它通过数学计算速度,当鼠标指针的速度超过阈值时,它应该显示唯一的Qt窗口。

另一组头和源抓取(钩子)并侦听全局键盘事件,当按下键组合时,项目在后台运行,Qt窗口(在我与它集成后)被隐藏。我输入的任何内容都存储在一个文件中,直到我按下[ESC]

现在,Qt窗口应该只出现在我移动鼠标指针超过一定速度时,文本应该显示在那里。

如果我在输入鼠标时移动了鼠标,窗口就会出现,并且我可以看到正在QWindow中写入的文本。但当我再次移动鼠标时,它应该被隐藏起来。

我不会将libqxt用于qt5,上面的程序应该在系统的i logout之前运行。使用Ubuntu 16.04

我试着在main.cxx里这样做:

代码语言:javascript
复制
#include <QApplication>
#include "mainwindow.hpp"
#include <QDesktopWidget>
#include <QMetaObject>
int main(int argc, char *argv[]) {

    QApplication app(argc, argv);

    MainWindow window;

    int width = QApplication::desktop()->width(), height = QApplication::desktop()->height();

    window.setGeometry ((width - 0.75 * width),height - 20, (width/2) , 10);
    window.setWindowFlags (Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    window.hide();
    QMetaObject::invokeMethod( this, "keygrab", Qt::QueuedConnection, Q_ARG() );
    QMetaObject::invokeMethod( this, "mousevelocity", Qt::QueuedConnection, Q_ARG() );
    return app.exec();
}

但是我完全搞砸了这个Qt应用程序的libx11 and libxdo成员和mainwindow.cxx中的函数,我不知道什么是最好的方法而不是这个,或者如果它是最好的,那么作为I have multiple main functions with multiple infinite loop for the keygrab and the mousepointer. I can't call them from the main of Qt application and even the above code runs the application first and then invoke them but I need the reverse way,我有一个问题。抱歉,第一次。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-10 22:00:10

我不能百分之百肯定我能理解你的问题,但是根据问题的标题和一些评论,以下是一些建议:

  1. Qt 可以知道当前全局鼠标的位置。你谷歌过吗?我发现了以下内容:QCursor::pos()
  2. 要捕获全局键盘事件,您必须将键盘焦点分配给一个小部件。否则,纯Qt就无法捕获全局键盘事件。我假设您可以通过一个小的透明QWidget在循环中为自己提供键盘焦点,然后从不捕获任何事件(因此它们被传递给其他程序),但我从未测试过这样的YMMV。
  3. 要创建“系统级后台例程”,您必须启动一个守护进程。要做到这一点,我可以推荐查看文档QProcess和朋友的例子。基本上,在启动应用程序时,应用程序使用一个特殊的命令行参数启动自身的第二个实例,该命令行参数告诉第二个子进程进入后台。然后父进程将退出,将子进程留在后台运行。
  4. 这个守护进程将在事件循环中运行它需要的任何代码,这是Qt程序的方式。每当它收到一个值得注意的事件,你可以处理和行动这些事件,以你的心。如果您需要从非Qt上下文中获取事件,只需创建一个QTimer并轮询事件所需的任何接口。
  5. 一旦事件发生,您就可以在屏幕上以您想要的位置显示QWidgets (howto 这里)。
  6. 一旦您的守护进程正常工作,下一个就是研究如何部署它。大多数守护进程需要作为服务安装到操作系统中,才能在引导时可靠地启动。每个窗口环境都可能有自己的“在注销前运行”部署的配置。如果你觉得自己特别喜欢,程序可以在分叉之前完成所需的部署程序,这使得它可以即插即用。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47670254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档