小部件位置和 window 大小

widget position and window size

我是 GUI 开发的新手,我正在尝试学习如何在 python 中使用 pyqt5。 下面是我正在处理的示例代码。我想要一个 window,在 window 的右侧有一些复选框、组合框和单选按钮。 QtWidget 对象的详细信息在代码中。

from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QWidget, QPushButton, QComboBox, QRadioButton, QVBoxLayout, QCheckBox
from PyQt5.QtGui import QIcon

class App(QMainWindow):

    def __init__(self):
        super().__init__()
        self.left = 0
        self.top = 500
        self.title = 'Chip2 Torque Data'
        self.width = 500
        self.height =500
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        xselect=QRadioButton("X",self)
        xselect.setChecked(True)

        xselect.move(340,400)
        zselect=QRadioButton("Z",self)
        zselect.move(380,400)
        sselect=QRadioButton("SP1",self)
        sselect.move(420,400)
        pass_list=QComboBox(self)
        pass_list.addItems(sheets_idealcut)
        pass_list.move(340,300)
        rawdata_check=QCheckBox("Raw Data",self)
        rawdata_check.setChecked(True)
        rawdata_check.move(340,200)
        mvgavg_check=QCheckBox("Moving average",self)
        mvgavg_check.setChecked(True)
        mvgavg_check.move(380,200)
        mvgstd_check=QCheckBox("Moving stdev",self)
        mvgstd_check.setChecked(True)
        mvgstd_check.move(420,200)
        self.show()
if __name__ == '__main__':
  sheets_idealcut=['pass2','pass3','pass4','pass5']

    app = QApplication.instance()
    if app is None:
         app = QApplication(sys.argv)
    else:
        print('QApplication instance already exists: %s' % str(app))
    ex = App()
    #ex.show()
    app.exec_()

下面是代码的输出。 (请忽略重叠的复选框名称。我打算稍后更正它。)

我的问题是当我最大化这个 window 时,QtWidget 对象(QComboBoxQRadioButtonQCheckBox)没有重新调整它们的位置使用新的 window 尺寸。

那么要让小部件自动重新定位自己,应该使用什么方法?

我用谷歌搜索了它,但找不到任何有用的东西。

请帮忙。

您正在使用 move(x,y) 将小部件设置到特定的固定位置。因此,您可以编写一个在最大化 window 时调用的函数,然后相应地重新定位您的小部件。

另一种自动化方法是使用框布局。 QtGui.QHBoxLayoutQtGui.QVBoxLayout 是基本布局 类,它们水平或垂直排列小部件。从你的照片中我不知道你希望你的小部件结束的确切位置,所以我试着按照我认为你想要的方式解释它。

每一行元素都可以像这样分配到一个HBox中:

hbox = QtGui.QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(rawdata_check)
hbox.addWidget(mvgavg_check)
hbox.addWidget(mvgstd_check)

如果您随后调整 window 的大小,小部件应自动重新定位到 window 的右侧。 QtDesigner 可以帮助您安排所有元素。

您应该使用布局来动态调整大小。有很多不同的布局。本例中使用的布局是最基本的类型。我还将 "App" 的父级更改为 QDialog。它们更容易处理。

这是您的应用示例,使用布局:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QWidget, QPushButton, QComboBox, QRadioButton, \
QVBoxLayout, QCheckBox, QHBoxLayout, QGroupBox, QDialog
from PyQt5.QtGui import QIcon

class App(QDialog):

    def __init__(self):
        super().__init__()
        self.left = 0
        self.top = 500
        self.title = 'Chip2 Torque Data'
        self.width = 500
        self.height = 500
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.main_layout = QVBoxLayout()

        xselect=QRadioButton("X",self)
        xselect.setChecked(True)
        # xselect.move(340,400)
        self.main_layout.addWidget(xselect)

        zselect=QRadioButton("Z",self)
        # zselect.move(380,400)
        self.main_layout.addWidget(zselect)

        sselect=QRadioButton("SP1",self)
        # sselect.move(420,400)
        self.main_layout.addWidget(sselect)



        pass_list=QComboBox(self)
        pass_list.addItems(sheets_idealcut)
        self.main_layout.addWidget(pass_list)
        #pass_list.move(340,300)
        rawdata_check=QCheckBox("Raw Data",self)
        rawdata_check.setChecked(True)
        self.main_layout.addWidget(rawdata_check)
        #rawdata_check.move(340,200)
        mvgavg_check=QCheckBox("Moving average",self)
        mvgavg_check.setChecked(True)
        #mvgavg_check.move(380,200)
        mvgstd_check=QCheckBox("Moving stdev",self)
        mvgstd_check.setChecked(True)
        #mvgstd_check.move(420,200)

        self.check_group = QHBoxLayout()
        self.check_group.addWidget(mvgavg_check)
        self.check_group.addWidget(mvgstd_check)
        self.check_group.stretch(1)

        self.main_layout.addLayout(self.check_group)
        self.setLayout(self.main_layout)
        self.show()

if __name__ == '__main__':
    sheets_idealcut=['pass2','pass3','pass4','pass5']

    app = QApplication.instance()
    if app is None:
         app = QApplication(sys.argv)
    else:
        print('QApplication instance already exists: %s' % str(app))
    ex = App()
    #ex.show()
    app.exec_()