在另一个窗口小部件上显示/隐藏焦点上的窗口小部件



我想要"按钮";对象消失时;目标";对象不在焦点上(例如当对象"次要"被聚焦时(并且当"次要"聚焦时重新出现;目标";再次成为焦点。因此,";目标";focused="focused";按钮";看得见的换句话说,在下面的代码中有两行;线A";以及";线B";,我想在代码中实现的。

`

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit

class Wn(QWidget):
def __init__(self):
super().__init__()
self.target = Target("Target", self)
self.target.setFixedSize(400, 60)
self.target.move(50, 50)
self.secondary = QLineEdit("Secondary", self)
self.secondary.setFixedSize(400, 60)
self.secondary.move(50, 150)
self.button = QPushButton("Appears @ Target focused. Disappears @ target not focused", self)
self.button.setFixedSize(400, 60)
self.button.move(50, 250)

class Target(QLineEdit):
def focusInEvent(self, k):
print("The target is in focus: Button should be shown")
self.setStyleSheet("background-color: red;")
# Wn.button.setHidden(False)                             # Line A
def focusOutEvent(self, p):
print("The target is out of focus: Button should be hidden")
self.setStyleSheet("background-color: white;")
# Wn.button.setHidden(True)                              # Line B

app = QApplication(sys.argv)
wn = Wn()
wn.show()
sys.exit(app.exec())

`

您可以创建一个信号,并在焦点发生变化时发出信号,然后将其与按钮的setVisible()连接。

class Wn(QWidget):
def __init__(self):
# ...
self.target.focusChanged.connect(self.button.setVisible)

class Target(QLineEdit):
focusChanged = pyqtSignal(bool)
def focusInEvent(self, k):
super().focusInEvent(k)
print("The target is in focus: Button should be shown")
self.setStyleSheet("background-color: red;")
self.focusChanged.emit(True)
def focusOutEvent(self, p):
super().focusOutEvent(p)
print("The target is out of focus: Button should be hidden")
self.setStyleSheet("background-color: white;")
self.focusChanged.emit(False)

或者,您可以在edit行上安装一个事件过滤器,并查找FocusInFocusOut事件。

请注意,您应该始终调用事件处理程序重写的基本实现,除非真的知道您在做什么,否则您可能会阻止对象的正确默认行为。

此外,应该始终使用布局管理器,而不是固定的几何图形。由于小部件的可见性也会使其在布局中的大小无效,并调整其管理的其他小部件(类似于CSS中的display: none(,因此您可能应该考虑使用setRetainSizeWhenHidden()作为小部件的大小策略:

class Wn(QWidget):
def __init__(self):
# ...
# create a proper layout and add widgets
# ...
policy = self.button.sizePolicy()
policy.setRetainSizeWhenHidden(True)
self.button.setSizePolicy(policy)

最新更新