我想开发一款类似在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
离线
你需要使用 wlr-data-control-unstable-v1 来监听 primary 剪贴板的内容。
PS: 持续获取剪贴板有时候挺伤性能的。
离线
你需要使用 wlr-data-control-unstable-v1 来监听 primary 剪贴板的内容。
PS: 持续获取剪贴板有时候挺伤性能的。
使用该协议开发,发现始终实现不成功,不能成功获取文本内容,这是我的实现,请问能帮忙看下,或者有相关的实现示例能学习下
PS:这个协议好像是不需要经过剪切板吧,感觉效率应该是最高的,但是还存在一堆问题:如部分应用选择时会持续触发选择
离线
你设置 WAYLAND_DEBUG=1 看看呢?
什么叫「不需要经过剪切板」,这个就是剪贴板协议啊。
持续触发的,你自己 debounce 一下啦。
离线
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 可以打开该控制台,在剪切板中就有该功能
离线