gpt4 book ai didi

c++ - 如何找到包含 QtVirtualKeyboard 的窗口

转载 作者:行者123 更新时间:2023-12-02 10:26:59 24 4
gpt4 key购买 nike

我在嵌入式设备上使用 qt widgets,但虚拟键盘有问题。键盘全屏显示并与所有应用重叠。

文章Virtual keyboard top black screen in Yocto描述了如何解决这个问题。

总之就是要找到带键盘的QQuickWindow,在这个窗口上调用setMask。那么键盘上方的区域就会透明

我在如何使用虚拟键盘找到 QQuickWindow 时遇到问题。我试着用

QApplication::allWidgets()

但是窗口不在这里。

最佳答案

要获得所有窗口,您可以使用QGuiApplication::allWindows(),但这还不够,因为QtVirtualKeyboard 窗口不一定在开始时创建,所以QInputMethod 的visibleChanged 信号必须是用过的。我没有使用 QQuickWindow 中的信息进行过滤,因为通常应用程序可能有其他信息,而是使用窗口所属类的名称。

#include <QApplication>
#include <QWindow>
#include <cstring>

static void handleVisibleChanged(){
if (!QGuiApplication::inputMethod()->isVisible())
return;
for(QWindow * w: QGuiApplication::allWindows()){
if(std::strcmp(w->metaObject()->className(), "QtVirtualKeyboard::InputView") == 0){
if(QObject *keyboard = w->findChild<QObject *>("keyboard")){
QRect r = w->geometry();
r.moveTop(keyboard->property("y").toDouble());
w->setMask(r);
return;
}
}
}
}

int main(int argc, char *argv[])
{
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
QApplication a(argc, argv);
QObject::connect(QGuiApplication::inputMethod(), &QInputMethod::visibleChanged, &handleVisibleChanged);
// ...

Python 版本:

import os
import sys

from PySide2 import QtCore, QtGui, QtWidgets
# from PyQt5 import QtCore, QtGui, QtWidgets


def handleVisibleChanged():
if not QtGui.QGuiApplication.inputMethod().isVisible():
return
for w in QtGui.QGuiApplication.allWindows():
if w.metaObject().className() == "QtVirtualKeyboard::InputView":
keyboard = w.findChild(QtCore.QObject, "keyboard")
if keyboard is not None:
r = w.geometry()
r.moveTop(keyboard.property("y"))
w.setMask(QtGui.QRegion(r))
return


def main():
os.environ["QT_IM_MODULE"] = "qtvirtualkeyboard"
app = QtWidgets.QApplication(sys.argv)

QtGui.QGuiApplication.inputMethod().visibleChanged.connect(handleVisibleChanged)

w = QtWidgets.QLineEdit()
w.show()
sys.exit(app.exec_())


if __name__ == "__main__":
main()

关于c++ - 如何找到包含 QtVirtualKeyboard 的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63955568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com