有什么昵称不存在 2024-06-12 17:11 采纳率: 66.7%
浏览 77

嵌入式qt5使用qtvirtualkeyboard无法弹出

正在使用嵌入式linux开发板进行qt开发,需要使用虚拟键盘,但是当我将模拟器正常运行的代码移植到开发板后,qtvirtualkeyboard键盘却无法弹出,能否给予一些建议,谢谢!
qt版本:5.12.7
QT环境构建:通过buildroot构建

img


img

交叉编译后生成的库在开发板上的路径:/usr/lib

img

程序运行路径:/tmp
当我使用qwidget的示例代码时,开发板上不能弹出键盘,而当我使用quick 创建一个示例时,键盘则可以弹出
qwidget示例代码:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    lineEdit = new QLineEdit(this);
    lineEdit->setGeometry(30,100,600,100);
    lineEdit->setFocusPolicy(Qt::StrongFocus); // 确保可以接收焦点
}

int main(int argc, char *argv[])
{
    qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
    QApplication a(argc, argv);
    MainWindow w;

    w.show();
    return a.exec();
}

quickt示例代码:

int main(int argc, char *argv[])
{
    qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}


qml:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.VirtualKeyboard 2.4
import QtQuick.Controls 2.12 // 这里的x应该替换为你使用的Qt版本对应的版本号

Window {
    id: window
    visible: true
    width: 720
    height: 680
    title: "Hello World"

    flags: Qt.Window | Qt.FramelessWindowHint

        Column {
            spacing: 10
            anchors.centerIn: parent
            TextField {
                id:textUser
                placeholderText: qsTr("User name")
            }
        }

    InputPanel {
        id: inputPanel
        z: 99
        x: 0
        y: window.height
        width: window.width

        Component.onCompleted: {
                    VirtualKeyboardSettings.activeLocales = ["en_GB","zh_CN"]
                    VirtualKeyboardSettings.locale = "en_GB"
                }

        states: State {
            name: "visible"
            when: inputPanel.active
            PropertyChanges {
                target: inputPanel
                y: window.height - inputPanel.height
            }
        }
        transitions: Transition {
            from: ""
            to: "visible"
            reversible: true
            ParallelAnimation {
                NumberAnimation {
                    properties: "y"
                    duration: 250
                    easing.type: Easing.InOutQuad
                }
            }
        }
    }



        TextField {
            anchors.top: parent.top
            anchors.horizontalCenter: parent.horizontalCenter
        }
}




  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-12 17:11
    关注

    引自免费微信小程序:皆我百晓生

    针对你遇到的问题,即在嵌入式Linux环境下使用Qt5.12.7与qtvirtualkeyboard时,从QWidget应用程序中无法调出虚拟键盘的情况,这里有几点建议和可能的解决方案:

    1. 检查环境配置

    确保你的Qt环境正确配置了对qtvirtualkeyboard的支持。从你的构建菜单截图来看,qt5virtualkeyboard模块已经被选中。但是,还需要确认在编译Qt时,是否正确启用了所有依赖项,特别是dbusfontconfigharfbuzz等模块,因为它们对于qtvirtualkeyboard的正常工作至关重要。

    2. 设置环境变量

    你已经在代码中设置了QT_IM_MODULE环境变量为qtvirtualkeyboard,这是正确的。但是,也请确保在开发板上运行Qt应用之前,这个环境变量同样被正确设置。可以通过在启动Qt应用前在命令行中执行export QT_IM_MODULE=qtvirtualkeyboard来实现。

    3. 检查输入方法框架

    qtvirtualkeyboard是基于Qt的输入方法框架(Input Method Framework)工作的,确保你的Qt构建中已经启用了这个框架。这通常意味着你需要在Qt的构建配置中选择input-method支持。

    4. 检查Qt平台插件

    确保你的Qt应用使用了正确的平台插件。在嵌入式系统中,这通常是eglfslinuxfb。在你的Qt构建菜单中,可以看到eglfslinuxfb支持都未被标记为选中状态,这可能是问题所在。你需要根据你的硬件和图形栈选择合适的图形平台,并在构建Qt时启用它。

    5. 检查X11或Wayland支持

    尽管你在使用QWidget示例时遇到了问题,但是在QML示例中虚拟键盘可以正常工作。这可能意味着你的环境更倾向于支持QML和Wayland或X11。检查你的系统是否正确安装并启用了Wayland或X11相关组件,以及Qt构建是否包含了对这些组件的支持。

    6. 重新编译Qt

    如果以上步骤都无法解决问题,尝试重新编译Qt库,确保所有的选项和依赖都被正确地包含进来。在构建过程中,仔细检查每一个选项,尤其是那些与图形和输入方法相关的选项。

    7. 检查权限和DBUS

    在某些情况下,qtvirtualkeyboard需要通过DBUS与系统其他部分通信。确保你的Qt应用有正确的权限访问DBUS,以及DBUS服务本身正在运行。

    8. 日志和调试

    启用Qt的日志记录功能,查看是否有任何错误信息可以帮助定位问题。你可以在Qt应用中加入qDebug()qCritical()语句,输出调试信息。

    示例代码修改

    考虑到你的QWidget示例,这里是一个修改后的版本,确保QLineEdit组件可以请求虚拟键盘:

    #include <QApplication>
    #include <QMainWindow>
    #include <QLineEdit>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr)
            : QMainWindow(parent)
        {
            QLineEdit *lineEdit = new QLineEdit(this);
            lineEdit->setGeometry(30, 100, 600, 100);
            lineEdit->setFocusPolicy(Qt::StrongFocus); // 确保可以接收焦点
            setCentralWidget(lineEdit);
        }
    };
    
    int main(int argc, char *argv[])
    {
        qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        return a.exec();
    }
    

    这个修改主要是将QLineEdit设为了主窗口的中心部件,这在某些Qt版本中是必要的,以便正确触发虚拟键盘。

    如果上述建议仍不能解决问题,可能需要深入检查你的硬件驱动、系统配置,或是考虑寻求社区的帮助,比如在Qt论坛或Stack Overflow上提问,提供详细的错误信息和系统配置。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月12日

悬赏问题

  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络