如何将输入焦点设置为 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 中显示的对话框?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TabCtrl 内的子对话框中将焦点设置为 CEdit?

qt ui界面如何把对其方式设置为alignment

如何在不将焦点转移到另一个窗口的情况下显示 MFC 对话框

在 QWebView 中设置文本输入焦点

当焦点可见时,将焦点设置为usercontrol

jQuery UI 对话框按钮焦点