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

Posted

技术标签:

【中文标题】在 QTableView 中编辑单元格时出现 QtVirtualKeyboard 焦点问题【英文标题】:QtVirtualKeyboard focus problem when editing a cell in a QTableView 【发布时间】:2020-10-19 13:53:22 【问题描述】:

过去几天我一直在努力将 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

在我的 .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。我知道这是可行的,因为如果我单击我的单元格,光标开始闪烁,如果我使用连接到我的树莓的物理键盘,我可以编辑文本。 (当然,物理键盘仅在我的应用开发过程中可用,不会在成品中可用)。

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

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

干杯。

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

Qt Virtual Keyboard in QQuickWidget

Resize qtvirtualkeyboard according to QObject

Qt Virtual Keyboard

【问题讨论】:

【参考方案1】:

好的,所以在与虚拟键盘又进行了几天的全面战争之后,我终于达到了预期的效果。

找到this gem of a guide后,原来是因为包含我的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();
    

希望这可以帮助任何和我一样遇到麻烦的人使用这个功能强大但文档不足的插件。

【讨论】:

以上是关于在 QTableView 中编辑单元格时出现 QtVirtualKeyboard 焦点问题的主要内容,如果未能解决你的问题,请参考以下文章

Qt QTableView 在活动单元格周围绘制边框

Qt:在编辑 QTableView 项目数据时而不是在编辑完成后发出信号?

QT QTableview QItemDelegate 简单使用

在 QTableView 中插入行

当许多单元格同时可见时,QTableView 滚动缓慢

Qt 中 QTableView 中如何设置某一单元格文本的颜色值,希望能贴出代码。