为啥虚拟键盘不适用于 Qt 中的 QDialog 文本框?

Posted

技术标签:

【中文标题】为啥虚拟键盘不适用于 Qt 中的 QDialog 文本框?【英文标题】:Why virtual keyboard does not work with QDialog textbox in Qt?为什么虚拟键盘不适用于 Qt 中的 QDialog 文本框? 【发布时间】:2016-06-15 04:32:26 【问题描述】:

我为无键盘设备制作了一个应用程序。 我将thisRef 用作键盘作为虚拟键盘。 我的项目中有一个对话框,其中有两个文本框(一个用于输入用户名,另一个用于输入密码),带有两个按钮:确定和取消。构建项目并运行后,按菜单按钮显示菜单形式,然后出现对话框以检查用户身份验证。用户应在虚拟键盘的文本框中输入数据。 出现虚拟键盘(thisRef 中的输入面板),但按钮不起作用。 当我搜索时,我看到了这个"sounds like you are trying to open another window from the dialog - this is your error. Of course the dialog will stay on top - that is its job." 因为对话框是模态的,所以虚拟键盘被禁用 无论如何编辑对话框或键盘以在模式小部件中工作?

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include "myinputpanelcontext.h"


int main(int argc, char *argv[])

    QApplication a(argc, argv);
    MyInputPanelContext *ic= new MyInputPanelContext; ;
    a.setInputContext(ic);

    MainWindow w;
    //w.show();
    w.showFullScreen();
    w.centralWidget()->releaseKeyboard();
    return a.exec();

MainWindow.cpp:

MyDialog *d=new MyDialog(this);
d.exec();

【问题讨论】:

听起来像焦点问题。但请在问题中提供更好的问题描述,因此无需外部链接即可回答。尝试创建MVCE 来隔离问题。 它解决了: 1. 模态对话框由 exec() 启动,它们在嵌套事件循环运行时阻塞程序流。 2. 无模式对话框由show() 启动,不会阻塞程序流程。 投票重新打开,因为虚拟键盘存在特定问题,这里有解决方案。 【参考方案1】:

解决了:

模态对话框由 exec() 启动,它们在嵌套事件循环运行时阻塞程序流。 无模式对话框由 show() 启动,它们不会阻塞程序流程。

来自http://www.qtforum.org/article/14285/modeless-dialog.html 我使用此代码:

 MyDialog *d=new MyDialog(this);
   d->show();
   d->raise();
   q->activewindows();

代替这段代码:

MyDialog *d=new MyDialog(this);
   d.exec();

作为文档参考:

无模式对话框:void EditorWindow::find()

    if (!findDialog) 
>         findDialog = new FindDialog(this);
>         connect(findDialog, SIGNAL(findNext()), this, SLOT(findNext()));
>      findDialog->show();
>     findDialog->raise();
>     findDialog->activateWindow(); 

来自here

【讨论】:

以上是关于为啥虚拟键盘不适用于 Qt 中的 QDialog 文本框?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Slime 检查仅适用于鼠标单击而不适用于键盘命令?

Qt 4.8.4 Release 版本不适用于 Windows 7 64 位

为啥单击编辑文本后不显示qml虚拟键盘,而我在.pro和main.cpp中调用插件

Qt虚拟键盘全屏

QT_5-QDialog

为啥带有边框和背景图像样式的 QWidget 的行为与 QLabel、QDialog、...不同?