我想要一个 QDialog 来阻止与 MainWindow 的交互,但最初没有任何小部件具有焦点,即。 e.没有按钮有蓝色边框并且在按“Enter”时被按下。
只要我在另一个窗口打开时获得阻止与主窗口的所有交互的相同行为,我就不必使用 QDialog。
我尝试重写 showEvent() 方法并调用 self.setFocus() 将焦点移动到 QDialog 窗口本身,但这不起作用。焦点始终保留在第一个按钮上。
我的想法是使用 setDefault(True) 创建一个不可见的虚拟按钮,以确保该按钮接收焦点。这是行不通的。如果我执行 setVisible(False) ,布局中的第一个 QPushButton 将获得焦点,由其周围的蓝色边框指示。但是,如果我不将可见性设置为 false,则 dummy_button 会带有蓝色边框,表示它接收到焦点。
下面是我的代码:
import sys
from PyQt5.QtWidgets import QApplication, QDialog, QPushButton, QVBoxLayout
class CustomDialog(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle("Custom Dialog")
# Create buttons
self.button1 = QPushButton("Button 1", self)
self.button2 = QPushButton("Button 2", self)
self.button1.setDefault(False)
self.button2.setDefault(False)
self.dummy_button = QPushButton(self)
self.dummy_button.setVisible(False) # Removing this line will move the focus to the dummy button
self.dummy_button.setDefault(True)
# Layout
layout = QVBoxLayout(self)
layout.addWidget(self.button1)
layout.addWidget(self.button2)
# Set layout
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
dialog = CustomDialog()
dialog.show()
sys.exit(app.exec_())
setFocus()
文档所解释的那样:
请注意,如果小部件被隐藏,则在显示之前它不会接受焦点。
虽然可以通过仔细处理事件和函数调用来更改默认行为,但对于像这样的简单情况,通过创建一个获得焦点并立即删除自身的虚拟小部件来完全解决它会更容易显示出来了。它不需要是一个按钮,因为即使使用
setFocus()
策略,NoFocus
也可以工作。
class DummyWidget(QWidget):
def __init__(self, parent):
super().__init__(parent)
self.setFocus()
def showEvent(self, event):
self.deleteLater()
class CustomDialog(QWidget):
def __init__(self):
...
DummyWidget(self) # no need for a reference