如何将输入焦点设置为 Qt 中显示的对话框?
Posted
技术标签:
【中文标题】如何将输入焦点设置为 Qt 中显示的对话框?【英文标题】:How to set input focus to a shown dialog in Qt? 【发布时间】:2010-05-25 08:41:41 【问题描述】:在一个按钮单击槽中,我创建并exec()
一个带有 NULL 父级的对话框。在对话框的构造函数中,我有:
this->activateWindow();
this->raise();
this->setFocus();
对话框是应用程序模式,具有很强的焦点。但是,在我单击它之前,它不会响应键盘事件。如何使对话框获得焦点而无需单击它?
【问题讨论】:
【参考方案1】:问题是我设置了 Qt:Tool 窗口标志。使用 Qt::Popup 或 Qt::Window 会导致在显示对话框时自动设置输入焦点。
我自己使用了 Qt::Window。其他一些标志可能也会起作用,但主要的是带有 Qt::Tool 标志的 QDialog不会在显示对话框时自动设置输入焦点。
【讨论】:
【参考方案2】:为对话框安装事件过滤器。
classObject->installEventFilter(this);
void className::keyPressEvent(QKeyEvent *event)
if (event->key() == Qt::Key_Space)
focusNextChild();
else
QLineEdit::keyPressEvent(event);
有关更多信息,请参阅此处。 http://doc.trolltech.com/4.6/eventsandfilters.html
【讨论】:
该类只是一个QDialog派生类,设置了以下窗口标志:(Qt::CustomizeWindowHint | Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint
它没有孩子也没有父母。
是的,无论如何,对于要获取键盘事件的对话框,为对话框安装事件过滤器,在对话框构造函数中编写 this->installEventFilter(this);在上面的示例中使用函数“focusNextChild()”。在对话牧民文件中声明keyPressEvent函数和cpp文件提供如上的实现
你是这个意思吗? this->installEventFilter(this);无效 QDialogDerived::keyPressEvent(QKeyEvent *event) QLineEdit::keyPressEvent(event); // 在这里做我的处理吗?
你在那里检查基于事件的键类型,如空格或输入键..等...
我试过了,但没有用。看,问题是,当显示对话框时,它没有输入焦点。 我可以用鼠标点击对话框,它获得输入焦点就好了。我需要让对话框自动获得输入焦点,而不必先点击它。
【参考方案3】:
在我的情况下,即使设置 Qt::Window 也没有成功。我不得不
QMetaObject::invokeMethod(widgetToFocus, "setFocus", Qt::QueuedConnection);
在show()
或exec()
之前。
【讨论】:
以上是关于如何将输入焦点设置为 Qt 中显示的对话框?的主要内容,如果未能解决你的问题,请参考以下文章