PyQt 中的 GridLayout 位置

GridLayout position in PyQt

我有以下问题,因为我希望“输入 IP 地址”的框架与其下方的其他三个框架具有相同的大小,即“打开 file/Save 文件”,“参数”和“hyppighed”。我希望我的“开始日志”框架一直到顶层,但它是这样显示的:

这是代码:

class myWindow(QWidget):
    def __init__(self):
        super(myWindow, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("Unisab 3 Modbuslogger")
        self.setWindowIcon(QtGui.QIcon("logger\johnsoncontrols.png"))
        self.createLayout()
        self.showMaximized()

    def createLayout(self):
        gridLayout = QGridLayout()
        vlayout5 = QHBoxLayout()

        self.frame1_custom = ConfigurationWidget()
        gridLayout.addWidget(self.frame1_custom, 0, 0, 1, 1)

        self.frame2_custom = SaveOpenWidget()
        gridLayout.addWidget(self.frame2_custom, 1, 0, 1, 1)

        self.frame3_custom = ParameterWidget()
        gridLayout.addWidget(self.frame3_custom, 2, 0, 1, 1)

        self.frame4_custom = HyppighedWidget()
        gridLayout.addWidget(self.frame4_custom, 3, 0, 1, 1)

        self.frame5_custom = StartLogWidget()
        gridLayout.addWidget(self.frame5_custom, 0, 1, 4, 4)

        self.setLayout(gridLayout)


class ConfigurationWidget(QFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.frame1 = self
        self.frame1.setFrameShape(self.StyledPanel)
        self.vlayout = QVBoxLayout()

        self.labelIP = QLabel("Enter IP-address:", self)
        self.labelIP.setFont(QFont("Times", 12))
        self.lineeditIP = QLineEdit(self)
        self.lineeditIP.setFont(QFont("Times", 12))
        self.labelIPConfirm = QLabel(self)
        self.labelIPConfirm.setFont(QFont("Times", 12))
        self.lineeditIP.returnPressed.connect(self.labelIPpressed)
        self.vlayout.addWidget(self.labelIP)
        self.vlayout.addWidget(self.lineeditIP)
        self.vlayout.addWidget(self.labelIPConfirm)
        self.frame1.setLayout(self.vlayout)

    def labelIPpressed(self):
        response = os.popen(f"ping {self.lineeditIP.text()}").read()
        if "Received = 4" in response:
           self.labelIPConfirm.setText(f"UP {self.lineeditIP.text()} Ping 
           Successful")
        else:
             self.labelIPConfirm.setText(f"DOWN {self.lineeditIP.text()} 
             Ping Unsuccesful")


class SaveOpenWidget(QFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.frame2 = self
        self.frame2.setFrameShape(self.StyledPanel)
        self.hlayout = QHBoxLayout()
        self.widget = QWidget()

        self.buttonSave = QPushButton("Save file", self)
        self.buttonSave.setFont(QFont("Times", 12))
        self.buttonSave.clicked.connect(self.SaveFileDialog)
        self.buttonOpen = QPushButton("Open file", self)
        self.buttonOpen.setFont(QFont("Times", 12))
        self.buttonOpen.clicked.connect(self.OpenFileDialog)
        self.hlayout.addWidget(self.buttonOpen)
        self.hlayout.addWidget(self.buttonSave)
        self.frame2.setLayout(self.hlayout)

    def SaveFileDialog(self):
        option = QFileDialog.Options()
        file = QFileDialog.getSaveFileName(self.widget, "Save File Window 
        Title", "default.txt", "All Files (*)", options=option)
        print(file[0])

    def OpenFileDialog(self):
        option = QFileDialog.Options()
        file = QFileDialog.getOpenFileName(self.widget, "Open file window 
        title", "Default file", "All Files (*)", options = option)
        print(file)

class ParameterWidget(QFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.frame3 = self
        self.frame3.setFrameShape(self.StyledPanel)
        self.vlayout = QVBoxLayout()

        self.buttonParameter = QPushButton("Parameter", self)
        self.vlayout.addWidget(self.buttonParameter)
        self.frame3.setLayout(self.vlayout)

class HyppighedWidget(QFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.frame4 = self
        self.frame4.setFrameShape(self.StyledPanel)
        self.vlayout = QVBoxLayout()

        self.buttonHyppighed = QPushButton("Hyppighed", self)
        self.vlayout.addWidget(self.buttonHyppighed)
        self.frame4.setLayout(self.vlayout)

class StartLogWidget(QFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.frame5 = self
        self.frame5.setFrameShape(self.StyledPanel)
        self.vlayout = QVBoxLayout()

        self.buttonLog = QPushButton("Start log", self)
        self.vlayout.addWidget(self.buttonLog)
        self.frame5.setLayout(self.vlayout)


def window():
app = QApplication(sys.argv)
win = myWindow()
win.show()
sys.exit(app.exec_())


window()

而且我认为给第一帧 ConfigurationWidget() 坐标 (0, 0, 1, 1) 是有意义的,但是 GUI 是这样显示的,这是错误的,因为我希望左边的框架具有与第一张图片相同的大小:

您必须将第二列的拉伸因子设置为 1:

gridLayout.setColumnStretch(1, 1)