如何使 Push Buttons 相对于 PyQt4 中标签大小的变化保持不变
How to keep Push Buttons constant in relative to change of Label Size in PyQt4
我在 PyQt4 程序中有一个图像作为我的标签。该程序还包含一些按钮。现在,当我最大化我的 window 时,尽管标签被扩展但按钮保留了它们的位置。我希望按钮应保持其相对于标签的相对位置,即使在最大化时也是如此。
我的代码如下:
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.centralwidget = QtGui.QWidget(MainWindow)
MainWindow.setCentralWidget(self.centralwidget)
lay = QtGui.QVBoxLayout(self.centralwidget)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.label = QtGui.QLabel(self.centralwidget)
self.label.setText(_fromUtf8(""))
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Capture.PNG")))
self.label.setObjectName(_fromUtf8("label"))
self.label.setScaledContents(True)
lay.addWidget(self.label)
self.Langdon = QtGui.QPushButton(self.centralwidget)
self.Langdon.setGeometry(QtCore.QRect(290, 90, 75, 23))
self.Langdon.setObjectName(_fromUtf8("Langdon"))
self.ChainLakes = QtGui.QPushButton(self.centralwidget)
self.ChainLakes.setGeometry(QtCore.QRect(50, 290, 85, 23))
self.ChainLakes.setObjectName(_fromUtf8("ChainLakes"))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我该如何修改我的代码??
您对按钮使用绝对定位,但对标签使用相对定位(因为它在布局中)。由于按钮是绝对定位的,因此当容器大小(您的主要 window 或中央小部件)发生变化时,您有责任在自己周围移动它们。 OTOH 如果您使用布局定位它们,则布局会根据需要移动它们(与标签一样)。
我强烈建议您找到适合您需求的基于布局的解决方案(它们非常灵活,但有时可能需要一些调整)。除此之外,您将需要子类化容器(您的 centralWidget
QWidget
)并重新实现 QWidget::resizeEvent()
处理程序。在该处理程序中,您将根据容器的当前大小和标签的当前 size/position 将绝对定位的元素(按钮)移动到新位置。
我对 PyQt 不够熟练,无法给出具体示例(抱歉),但我确实提供了一个可能有用的 C++ 问题的类似答案:
我在 PyQt4 程序中有一个图像作为我的标签。该程序还包含一些按钮。现在,当我最大化我的 window 时,尽管标签被扩展但按钮保留了它们的位置。我希望按钮应保持其相对于标签的相对位置,即使在最大化时也是如此。
我的代码如下:
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.centralwidget = QtGui.QWidget(MainWindow)
MainWindow.setCentralWidget(self.centralwidget)
lay = QtGui.QVBoxLayout(self.centralwidget)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.label = QtGui.QLabel(self.centralwidget)
self.label.setText(_fromUtf8(""))
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Capture.PNG")))
self.label.setObjectName(_fromUtf8("label"))
self.label.setScaledContents(True)
lay.addWidget(self.label)
self.Langdon = QtGui.QPushButton(self.centralwidget)
self.Langdon.setGeometry(QtCore.QRect(290, 90, 75, 23))
self.Langdon.setObjectName(_fromUtf8("Langdon"))
self.ChainLakes = QtGui.QPushButton(self.centralwidget)
self.ChainLakes.setGeometry(QtCore.QRect(50, 290, 85, 23))
self.ChainLakes.setObjectName(_fromUtf8("ChainLakes"))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我该如何修改我的代码??
您对按钮使用绝对定位,但对标签使用相对定位(因为它在布局中)。由于按钮是绝对定位的,因此当容器大小(您的主要 window 或中央小部件)发生变化时,您有责任在自己周围移动它们。 OTOH 如果您使用布局定位它们,则布局会根据需要移动它们(与标签一样)。
我强烈建议您找到适合您需求的基于布局的解决方案(它们非常灵活,但有时可能需要一些调整)。除此之外,您将需要子类化容器(您的 centralWidget
QWidget
)并重新实现 QWidget::resizeEvent()
处理程序。在该处理程序中,您将根据容器的当前大小和标签的当前 size/position 将绝对定位的元素(按钮)移动到新位置。
我对 PyQt 不够熟练,无法给出具体示例(抱歉),但我确实提供了一个可能有用的 C++ 问题的类似答案: