您尚未登录。

#1 2025-05-05 20:08:18

AscendLiu
会员
注册时间: 2025-02-15
帖子: 18

翻译软件的实现原理

我想开发一款类似在Windows的百度翻译软件,实现鼠标选中带翻译的文本则自动翻译,请教如何能实现Qt程序能实时获取当前全局鼠标的选择内容
当前我已知的方法:
  1.通过获取粘贴板的内容去获取选择的内容,该方法需要一直复制当前的选择内容,不知道如何触发在任何地方鼠标选中则自动复制

QDBusInterface *m_interface;


DBusPortal::DBusPortal(QObject *parent) : QObject(parent) {
    m_interface = new QDBusInterface("org.kde.klipper", "/klipper", "org.kde.klipper.klipper");
}

void DBusPortal::requestSelectedText() {
    if (!m_interface->isValid()) {
        qWarning() << "DBus interface not valid!";
        return;
    }

    QDBusReply<QString> reply = m_interface->call("getClipboardContents");
    if (reply.isValid()) {
        qDebug() << reply.value();
        return;
    }


}

当前我感觉在这里提问可能不太好,但搜索了下也不知道在哪里提问,按道理在KDE项目里提问相关度更高,不知道有大佬知道如何实现, Xorg貌似有能直接获取当前选择的缓冲区,在Wayland协议中,不知道如何解决

系统环境:
操作系统: Arch Linux
KDE Plasma 版本: 6.3.4
KDE 程序框架版本: 6.13.0
Qt 版本: 6.9.0
内核版本: 6.14.4-zen1-2-zen (64 位)
图形平台: Wayland
处理器: 20 × 12th Gen Intel® Core™ i7-12700
内存: 31.1 GiB 内存
图形处理器: Intel® UHD Graphics 770
制造商: Gigabyte Technology Co., Ltd.
产品名称: B760M GAMING

离线

#2 2025-05-05 20:43:24

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 9,266
个人网站

Re: 翻译软件的实现原理

你需要使用 wlr-data-control-unstable-v1 来监听 primary 剪贴板的内容。
PS: 持续获取剪贴板有时候挺伤性能的。

离线

#3 2025-05-08 09:36:20

AscendLiu
会员
注册时间: 2025-02-15
帖子: 18

Re: 翻译软件的实现原理

依云 说:

你需要使用 wlr-data-control-unstable-v1 来监听 primary 剪贴板的内容。
PS: 持续获取剪贴板有时候挺伤性能的。

使用该协议开发,发现始终实现不成功,不能成功获取文本内容,这是我的实现,请问能帮忙看下,或者有相关的实现示例能学习下
PS:这个协议好像是不需要经过剪切板吧,感觉效率应该是最高的,但是还存在一堆问题:如部分应用选择时会持续触发选择

离线

#4 2025-05-08 09:53:33

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 9,266
个人网站

Re: 翻译软件的实现原理

你设置 WAYLAND_DEBUG=1 看看呢?
什么叫「不需要经过剪切板」,这个就是剪贴板协议啊。
持续触发的,你自己 debounce 一下啦。

离线

#5 2025-05-10 22:56:55

AscendLiu
会员
注册时间: 2025-02-15
帖子: 18

Re: 翻译软件的实现原理

    m_displayFd = wl_display_get_fd(m_display);
    if (m_displayFd == -1) {
        qWarning() << "Failed to get Wayland display file descriptor";
        return;
    }

    m_notifier = new QSocketNotifier(m_displayFd, QSocketNotifier::Read, this);
    connect(m_notifier, &QSocketNotifier::activated, this, [this]() {
        if (wl_display_dispatch(m_display) == -1) {
            qWarning() << "Error dispatching Wayland events";
        }
    });

为什么使用该方法没有被触发的原因一般是啥,我使用WAYLAND_DEBUG=1,发现在其他地方进行文本选择时,确实没有协议被触发
我现在换成zwp_primary_selection_device_manager_v1 协议,我发现Kwin项目有一个控制台实现了相同的功能,但是我没看懂
使用命令:qdbus6 org.kde.KWin /KWin org.kde.KWin.showDebugConsole  可以打开该控制台,在剪切板中就有该功能

离线

页脚