1

在过去的几天里,我一直在努力将 QtVirtualKeyboard 包含在我的基于 QWidget 的应用程序中,该应用程序在具有 7 英寸触摸屏显示器的 Raspberry Pi 上运行。

这是我到目前为止所做的:

安装插件:

sudo apt-get install -y qtvirtualkeyboard-plugin
sudo apt-get install -y qml-module-qtquick-controls2
sudo apt-get install -y qtdeclarative5-dev
sudo apt-get install qml-module-qt-labs-folderlistmodel

添加QT_IM_MODULE环境变量并将其设置为qtvirtualkeyboard

添加QT += quickwidgets到我的 .pro

创建了一个QQuickWidget来放置我的虚拟键盘。

。H

private:
    QQuickWidget *m_quickWidget;

.cpp

// In constructor
QUrl source(QML_FILE_PATH + "virtualkeyboard.qml");
m_quickWidget->setSource(source);
m_quickWidget->setAttribute(Qt::WA_AcceptTouchEvents);
ui->verticalLayout->addWidget(m_quickWidget);

最后是我的 virtualkeyboard.qml 文件

import QtQuick 2.7
import QtQuick.VirtualKeyboard 2.1

Rectangle {
    id: window
    width: 600
    height: 0

    InputPanel {
        id: inputPanel
        width: window.width

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

所以到目前为止,从视觉上看,一切都很好。当我打开我的应用程序时,键盘小部件不可见(窗口高度:qml 中的 0),当我双击 QTableView 中的一个单元格(具有标志 Qt::ItemIsEnabled | Qt::ItemIsEditable)时,键盘小部件以正确的位置和大小显示在我的垂直布局的底部。

现在我的问题:

  • 我遇到的主要问题是当我双击我的可编辑单元格时,我的键盘小部件出现并且我的单元格似乎仍然有焦点(在单击的单元格中可以看到闪烁的光标)。到目前为止,一切都运行良好。但是当我单击虚拟键盘上的按钮时,可编辑单元格失去焦点,键盘小部件关闭,并且我在应用程序控制台中收到此错误: 我的 Designer 表单中基本小部件的名称在InputContext::sendKeyClick(): no focus to send key click - QGuiApplication::focusWindow() is: QWidgetWindow(0x1e68250, name="ConfigWindow")哪里。ConfigWindow

  • 我遇到的另一个较小但看似无法解决的问题是,只有在我双击 QTableView 中的单元格时才会打开键盘。这是一个奇怪的,因为我在我的设计师中设置editTriggers了。CurrentChanged我知道这是可行的,因为如果我单击我的单元格,光标开始闪烁,如果我使用连接到我的树莓的物理键盘,我可以编辑文本。(当然,物理键盘仅在我的应用程序开发过程中可用,不会在成品中可用)。

我希望我已经足够清楚,但如果需要,我很乐意提供更多细节。

对于这些问题中的任何一个的任何帮助将不胜感激。

干杯。

编辑:我遇到的一些有用的链接:

QQuickWidget 中的 Qt 虚拟键盘

根据 QObject 调整 qtvirtualkeyboard 的大小

Qt 虚拟键盘

4

1 回答 1

1

好的,经过几天与虚拟键盘的全面战争,我终于达到了预期的效果。

在找到这个 gem of a guide之后,事实证明,因为包含 myQTableViewQtVirtualKeyboarda的小部件QDialog是使用该exec()方法显示的,这意味着窗口属性不允许键盘修改我的数据。虽然指南中提出的解决方案没有解决我的问题,但让我的小部件继承QWidget确实让我沿着让它正常工作的道路前进。

我这样说是因为一旦我将 my 更改QDialog为,然后每次按下一个键时都会出现QWidget控制台输出错误。unknown:0 input method is not set

解决方案是从我的方法中删除Qt:Dialog标志。setWindowFlags()也许最重要的是,将 my 的焦点策略设置QQuickWidgetNoFocus

// In constructor
QUrl source(QML_FILE_PATH + "virtualkeyboard.qml");
m_quickWidget->setSource(source);
m_quickWidget->setAttribute(Qt::WA_AcceptTouchEvents);
m_quickWidget->setFocusPolicy(Qt::NoFocus);
ui->verticalLayout->addWidget(m_quickWidget);

哈利路亚!!我的 QtVirtualKeyboard 最终将点击的键发送到我的可编辑单元格。

最后,要通过单击表格中的单元格来打开键盘,我确信有比这更好的解决方案,但是我将一个插槽连接到我QTableViewpressed信号并手动设置输入法的可见性:

void ConfigWindow::on_tableView_pressed(const QModelIndex &index)
{
    if ((index.column() == 0) || (index.column() == 1))
    {
        QApplication::inputMethod()->show();
    }
}

希望这可以帮助任何与我遇到同样麻烦的人使用这个强大但令人痛苦的文档不足的插件。

于 2020-10-22T09:15:18.930 回答