【发布时间】:2020-12-29 05:17:53
【问题描述】:
我正在尝试使用 PyQt5 构建一个 UI,将按钮放置在确切的位置。我相信 QGridLayout 是一个很好的方法,而不是直接在 QMainWindow 中绘制它们。我查看 QGridLayout 的原因是因为我希望将按钮网格与 UI 的其他部分分开,例如按钮网格右侧的图像(使用 QHBoxLayout)。
当我直接在 QMainWindow 中绘制按钮时,按钮会出现在正确的位置。但是,当我使用具有相同坐标的 QGridLayout 时,按钮没有放置在正确的位置并且似乎被压扁了。
方法 1:我使用 QPushButton .move() 和 .resize() 方法直接在 QMainWindow 中绘制按钮。在这种情况下,按钮被绘制在正确的位置。
# below imports, data variable, and main() are used for both examples
import sys
from PyQt5.QtWidgets import (QApplication, QPushButton, QMainWindow,
QGridLayout, QWidget)
data = [{'xmin': 2, 'ymin': 4, 'width': 205, 'height': 54, 'label': 'Go to Page 1'},
{'xmin': 34, 'ymin': 22, 'width': 141, 'height': 17, 'label': 'Go to Page 2'},
{'xmin': 2, 'ymin': 90, 'width': 187, 'height': 54, 'label': 'Go to Page 3'},
{'xmin': 34, 'ymin': 108, 'width': 122, 'height': 17, 'label': 'Go to Page 4'},
{'xmin': 2, 'ymin': 176, 'width': 231, 'height': 54, 'label': 'Go to Page 5'}]
class VisualizerWindow(QMainWindow):
def __init__(self):
super().__init__()
for rect in data:
button = QPushButton(rect['label'], parent=self)
button.move(rect['xmin'], rect['ymin'])
button.resize(rect['width'], rect['height']+10)
def main():
app = QApplication(sys.argv)
viz_window = VisualizerWindow()
viz_window.showMaximized()
sys.exit(app.exec())
if __name__ == '__main__':
main()
方法 2:当我采用使用 QMainWindow、QGridLayout 的方法,然后通过 layout.addWidget() 添加 QPushButtons 时,即使我提供了精确的坐标,按钮也没有放置在屏幕上的正确位置.addWidget() 方法。
class VisualizerWindow(QMainWindow):
def __init__(self):
super().__init__()
layout = QGridLayout()
for rect in data:
button = QPushButton(rect['label'], parent=self)
layout.addWidget(button, rect['xmin'],
rect['ymin'], rect['width'],
rect['height']+10)
widget = QWidget(self)
widget.setLayout(layout)
self.setCentralWidget(widget)
方法 2 中的网格布局似乎在主窗口中被挤压。 为什么我看到这两种方法之间的绘图行为不同?如何正确使用 QGridLayout 将按钮绘制在正确的位置?
【问题讨论】: