小部件位置和窗口大小

时间:2017-07-27 09:58:32

标签: python user-interface pyqt5 spyder

我是GUI开发的新手,我正在尝试学习如何在python中使用pyqt5。 下面是我正在处理的示例代码。我想要一个窗口,窗口右侧有一些复选框,组合框和单选按钮。 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_()

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

enter image description here

我的问题是,当我最大化此窗口时,QtWidget个对象(QComboBoxQRadioButtonQCheckBox)不会使用新窗口重新调整其位置大小。
enter image description here

因此,为了让小部件自动重新定位,应该使用什么方法?

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

请帮忙。

2 个答案:

答案 0 :(得分:1)

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

另一种自动化方法是使用盒子布局。 QtGui.QHBoxLayoutQtGui.QVBoxLayout是基本布局类,可以水平或垂直排列小部件。从你的照片我不知道你希望你的小部件到底有什么确切的位置,所以我试着像我想你想要的那样解释它。

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

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

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

答案 1 :(得分:1)

您应该使用布局进行动态调整大小。有很多不同的布局。此示例中使用的布局是最基本的类型。我还改变了" 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_()