如何在设置Qt.Popup标志的情况下自动聚焦QDialog?

时间:2015-09-23 11:46:42

标签: python qt

使用Python 3和PyQt 5.5考虑以下代码片段:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

import sys

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    d = QDialog()
    l = QLineEdit(d)
    w.show()
    # Comment the following line to gain focus.
    d.setWindowFlags(Qt.Popup)
    d.show()
    app.exec_()

调用d.show()后,会显示对话框,但其中的QLineEdit没有焦点。 raise_()activateWindow()setFocus()似乎没有任何效果。如何在对话框显示时自动获得焦点?我想把对话保持为Qt.Popup,因为当我点击它之外我需要关闭它。

2 个答案:

答案 0 :(得分:1)

QWidget::raise();
QWidget::activateWindow();

来自文档: 将包含此窗口小部件的顶级窗口小部件设置为活动窗口。

活动窗口是一个可见的顶级窗口,具有键盘输入焦点。

此功能执行与在顶级窗口的标题栏上单击鼠标相同的操作。在X11上,结果取决于窗口管理器。如果你想确保窗口堆叠在顶部,你也应该调用raise()。请注意,窗口必须是可见的,否则activateWindow()无效。

在Windows上,如果在应用程序当前不是活动应用程序时调用此方法,则它不会使其成为活动窗口。它将更改任务栏条目的颜色,以指示窗口已以某种方式更改。这是因为Microsoft不允许应用程序中断用户当前在另一个应用程序中执行的操作。

答案 1 :(得分:0)

在显示对话框后,您似乎需要将焦点设置在行编辑上:

    l = QLineEdit(d)
    w.show()
    d.setWindowFlags(Qt.Popup)
    d.show()
    l.setFocus()
    app.exec_()

如果不起作用,请使用计时器尝试:

    QTimer.singleShot(1, l.setFocus)