如何解决在QTableView中编辑单元格时,QtVirtualKeyboard焦点问题
最近几天,我一直在努力将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
.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
是我的Designer表单中基本窗口小部件的名称。 -
我遇到的另一个较小但看似无法解决的问题是,只有在双击QTableView中的单元格时才会打开键盘。这是一个奇怪的问题,因为我在设计器中将
editTriggers
设置为CurrentChanged
。我知道这行得通,因为如果单击单元格,光标将开始闪烁,并且如果我使用连接到树莓派的物理键盘,则可以编辑文本。 (当然,物理键盘仅在我的应用程序开发期间可用,而在最终产品中将不可用。)
我希望我已经足够清楚了,但是如果需要,我们将很乐意提供更多详细信息。
在这些问题上的任何帮助将不胜感激。
干杯。
编辑: 我遇到了一些有用的链接:
Qt Virtual Keyboard in QQuickWidget
Resize qtvirtualkeyboard according to QObject
解决方法
好吧,经过几天与虚拟键盘的全面战斗之后,我终于达到了预期的效果。
找到this gem of a guide后,发现包含我的QTableView
和QtVirtualKeyboard
的小部件是一个QDialog
,正在使用exec()
方法显示,这意味着window属性将不允许键盘修改我的数据。尽管指南中提出的解决方案无法解决我的问题,但使小部件继承QWidget
确实使我远离了使其一切正常工作的道路。
之所以这样说,是因为一旦将QDialog
更改为QWidget
,然后每次按下键时,控制台输出错误都会显示unknown:0 input method is not set
。
解决方案是从我的Qt:Dialog
方法中删除setWindowFlags()
标志。也许最重要的是,将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最终将单击的键发送到我的可编辑单元格。
最后,要通过单击表中的单元格来打开键盘,我敢肯定有比这更好的解决方案,但是我在QTableView
的{{1} }信号并手动设置输入法的可见性:
pressed
希望这个功能强大但文档不足的插件可以帮助任何与我一样麻烦的人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。