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

3
我最近几天一直在尝试将QtVirtualKeyboard添加到我的基于QWidget的应用程序中,在树莓派上运行,并使用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 在我的.pro文件中添加了QT += quickwidgets 创建了一个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标志)时,键盘小部件会出现在垂直布局底部的正确位置和大小。

现在来谈谈我的问题:

我遇到的主要问题是,当我双击可编辑单元格时,我的键盘小部件显示出来,而且单元格似乎仍然有焦点(点击的单元格中会出现闪烁的光标)。到目前为止一切都正常。但是,当我在虚拟键盘上点击一个按钮时,可编辑单元格失去焦点,键盘小部件关闭,我在应用程序控制台中得到以下错误信息: InputContext::sendKeyClick(): no focus to send key click - QGuiApplication::focusWindow() is: QWidgetWindow(0x1e68250, name="ConfigWindow") 其中 ConfigWindow 是我设计表单中基本窗口的名称。
我还遇到另一个较小但看起来无法解决的问题是,键盘只在我双击 QTableView 中的单元格时才打开。这很奇怪,因为我在设计器中将 editTriggers 设置为 CurrentChanged。我知道这有效,因为如果我单击单元格,光标开始闪烁,如果我使用与我的树莓派连接的物理键盘,我可以编辑文本。(当然,在开发应用程序期间,物理键盘只能用于测试,在完成的产品中不可用)。
我希望我的表述已经足够清晰,如果需要的话,我很乐意提供更多细节。
非常感谢对这些问题的任何帮助。
干杯。
编辑: 我遇到了一些有用的链接: 在QQuickWidget中使用Qt虚拟键盘 根据QObject调整qtvirtualkeyboard大小 Qt虚拟键盘
1个回答

3

好的,经过几天与虚拟键盘的激烈战斗后,我终于达到了预期的结果。

在找到这篇宝贵的指南后,我发现由于包含我的QTableViewQtVirtualKeyboard的小部件是一个使用exec()方法显示的QDialog,这意味着窗口属性不允许键盘修改我的数据。虽然指南中提出的解决方案没有解决我的问题,但让我的小部件继承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终于可以将点击的键发送到可编辑单元格。

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

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

希望这篇文章能帮助到遇到和我一样问题的人,这个插件虽然功能强大,但文档却非常不充分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接