【发布时间】:2022-07-01 02:35:10
【问题描述】:
我仅在一个示例中尝试过,但我不知道该怎么做。 即使在 QtDesigner 中我也无法正确运行它,我也搜索了 2-3 个小时。 我也试过 .focusProxy 不工作
import sys
from PyQt5.QtWidgets import *
class Pencere(QWidget):
def __init__(self):
super().__init__()
self.icayarlar()
def icayarlar(self):
self.setWindowTitle("Deneme")
self.b1=QLineEdit()
self.b2=QLineEdit()
self.b3=QLineEdit()
self.v_box=QHBoxLayout()
self.v_box.addWidget(self.b1)
self.v_box.addWidget(self.b2)
self.v_box.addWidget(self.b3)
self.setTabOrder(self.b1,self.b3)
self.setLayout(self.v_box)
app=QApplication(sys.argv)
pencere=Pencere()
pencere.show()
sys.exit(app.exec_())
我也试过了
self.setTabOrder(self.b1,self.b3)
self.setTabOrder(self.b3, self.b2)
self.setTabOrder(self.b2, self.b1)
【问题讨论】:
-
如果你在终端或提示符下运行代码,你会看到一个重要的警告:
QWidget::setTabOrder: 'first' and 'second' must be in the same window。那是因为您在 小部件实际上成为同一父级的子级之前设置了标签顺序。移动setLayout()之前setTabOrder(),或者直接移动self.v_box = QHBoxLayout(self)。顺便说一句,尽量避免不必要的空行,而是在用作赋值的等号周围使用空格。 -
你太棒了。非常感谢您的解决方案和解释以及建议。当我在 pycharm 中尝试它时,它没有给我任何错误消息。一直正常工作。
-
IDE 并不总是能够显示调试消息,而且当它们显示时,它们通常是不完整的。这不是错误,这是由于它们的性质。每当您遇到意外行为并且没有收到任何警告时,请始终考虑从终端或提示符运行代码。虽然它可能并不总是提供解决方案,但安全总比后悔好。无论如何,您必须始终了解对象关系(“亲子关系”),许多功能要求对象在某个级别上是严格相关的。在您的代码中,这些行编辑实际上是完全独立的,直到布局被设置(父级)。
-
澄清一下,虽然 QLayout 的文档说
addItem()(在调用addWidget()或addLayout()时由布局内部调用)获取项目的所有权,但所有权仅是关于包含 小部件或布局的 QLayoutItem。只有当布局最终成为小部件的一部分(直接或通过在小部件上设置的父布局)时,底层小部件的父级才会最终更改。在那之前,这些小部件实际上不是同一个窗口的一部分(除非它们是另一个窗口的子窗口)。 -
再次感谢你 :),它真的拓展了我的视野,不仅仅是关于 PyQt。