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



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

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

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

现在我的问题是:

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

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

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

在这两个问题上的任何帮助都将不胜感激。

干杯。

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

QQuickWidget 中的Qt虚拟键盘

根据QObject 调整qtvirtualkeyboard的大小

Qt虚拟键盘

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

在找到这本指南之后,事实证明,因为包含我的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();
}
}

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

相关内容

  • 没有找到相关文章