在 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), 键盘小部件以正确的位置和大小显示在我的垂直布局的底部。
现在解决我的问题:
我遇到的主要问题是当我双击我的可编辑单元格时,我的键盘小部件出现并且我的单元格似乎仍然具有焦点(闪烁的光标在单击的单元格中可见)。到目前为止,一切都运行良好。但是,当我单击虚拟键盘上的按钮时,可编辑单元格失去焦点,键盘小部件关闭,我的应用程序控制台出现此错误:
InputContext::sendKeyClick(): no focus to send key click - QGuiApplication::focusWindow() is: QWidgetWindow(0x1e68250, name="ConfigWindow")
其中 ConfigWindow
是我的设计器表单中基本小部件的名称。
我遇到的另一个较小但看似无法解决的问题是键盘仅在我双击 QTableView 中的单元格时打开。这很奇怪,因为我在我的设计器中将 editTriggers
设置为 CurrentChanged
。我知道这行得通,因为如果我单击我的单元格,光标就会开始闪烁,如果我使用连接到我的树莓派的物理键盘,我就可以编辑文本。 (当然,物理键盘只有在我的app开发过程中才有,成品中不会有)。
我希望我已经足够清楚了,但如果需要,我很乐意提供更多细节。
任何有关这些问题的帮助将不胜感激。
干杯。
编辑:
我遇到的一些有用的链接:
好的,又在虚拟键盘上拼了几天war,终于达到了我想要的效果
在找到 this gem of a guide 之后,事实证明,因为包含我的 QTableView
和 QtVirtualKeyboard
的小部件是一个 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 中的一个单元格打开键盘,我确信有比这更好的解决方案,但我将一个插槽连接到我的 QTableView
的pressed
信号并手动设置输入法的可见性:
void ConfigWindow::on_tableView_pressed(const QModelIndex &index)
{
if ((index.column() == 0) || (index.column() == 1))
{
QApplication::inputMethod()->show();
}
}
希望这能帮助那些和我有同样问题的人使用这个功能强大但痛苦的 under-documented 插件。
过去几天我一直在努力将 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), 键盘小部件以正确的位置和大小显示在我的垂直布局的底部。
现在解决我的问题:
我遇到的主要问题是当我双击我的可编辑单元格时,我的键盘小部件出现并且我的单元格似乎仍然具有焦点(闪烁的光标在单击的单元格中可见)。到目前为止,一切都运行良好。但是,当我单击虚拟键盘上的按钮时,可编辑单元格失去焦点,键盘小部件关闭,我的应用程序控制台出现此错误:
InputContext::sendKeyClick(): no focus to send key click - QGuiApplication::focusWindow() is: QWidgetWindow(0x1e68250, name="ConfigWindow")
其中ConfigWindow
是我的设计器表单中基本小部件的名称。我遇到的另一个较小但看似无法解决的问题是键盘仅在我双击 QTableView 中的单元格时打开。这很奇怪,因为我在我的设计器中将
editTriggers
设置为CurrentChanged
。我知道这行得通,因为如果我单击我的单元格,光标就会开始闪烁,如果我使用连接到我的树莓派的物理键盘,我就可以编辑文本。 (当然,物理键盘只有在我的app开发过程中才有,成品中不会有)。
我希望我已经足够清楚了,但如果需要,我很乐意提供更多细节。
任何有关这些问题的帮助将不胜感激。
干杯。
编辑: 我遇到的一些有用的链接:
好的,又在虚拟键盘上拼了几天war,终于达到了我想要的效果
在找到 this gem of a guide 之后,事实证明,因为包含我的 QTableView
和 QtVirtualKeyboard
的小部件是一个 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 中的一个单元格打开键盘,我确信有比这更好的解决方案,但我将一个插槽连接到我的 QTableView
的pressed
信号并手动设置输入法的可见性:
void ConfigWindow::on_tableView_pressed(const QModelIndex &index)
{
if ((index.column() == 0) || (index.column() == 1))
{
QApplication::inputMethod()->show();
}
}
希望这能帮助那些和我有同样问题的人使用这个功能强大但痛苦的 under-documented 插件。