使用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,因为当我点击它之外我需要关闭它。
答案 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)