在 QTableView 中编辑单元格时 QtVirtualKeyboard 焦点问题

QtVirtualKeyboard focus problem when editing a cell in a QTableView

过去几天我一直在努力将 QtVirtualKeyboard 添加到我的基于 QWidget 的应用程序中,该应用程序 运行 在 Raspberry Pi 上带有 7" 触摸屏显示器。

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

安装插件:

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
                }
            }
        }
    }
}

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

现在解决我的问题:

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

任何有关这些问题的帮助将不胜感激。

干杯。

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

Resize qtvirtualkeyboard according to QObject

Qt Virtual Keyboard

好的,又在虚拟键盘上拼了几天war,终于达到了我想要的效果

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

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

解决方法是从我的 setWindowFlags() 方法中删除 Qt:Dialog 标志。也许最重要的是,将我的 QQuickWidget 的焦点策略设置为 NoFocus,如下所示:

// 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 最终将点击的键发送到我的 editable 单元格。

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

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

希望这能帮助那些和我有同样问题的人使用这个功能强大但痛苦的 under-documented 插件。