QGridLayout奇怪的小部件放置

时间:2018-09-23 14:42:42

标签: python pyqt5

我正在尝试使用PyQt5构建一个简单的GUI,其中有一些我想使用QGridLayout对齐的小部件。

看下面在一些网站上找到的示例代码:

import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit,
    QTextEdit, QGridLayout, QApplication)

class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        title = QLabel('Title')
        author = QLabel('Author')
        review = QLabel('Review')

        titleEdit = QLineEdit()
        authorEdit = QLineEdit()
        reviewEdit = QTextEdit()

        grid = QGridLayout()
        grid.setSpacing(10)

        grid.addWidget(title, 1, 0)
        grid.addWidget(titleEdit, 1, 1)

        grid.addWidget(author, 2, 0)
        grid.addWidget(authorEdit, 2, 1)

        grid.addWidget(review, 3, 0)
        grid.addWidget(reviewEdit, 3, 1, 5, 1)


        self.setLayout(grid)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('Review')
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

输出

如您所见,第一列中有三个标签,每个标签垂直跨越一个单元格,水平跨越一个单元格。 在第二列中,有两个1x1小部件和一个5x1小部件。

假设我要在下面放置另一个名为test的标签和一个名为testEdit的行编辑。

天真的我会这样修改initUI()

def initUI(self):

    title = QLabel('Title')
    author = QLabel('Author')
    review = QLabel('Review')
    test = QLabel('Test')

    titleEdit = QLineEdit()
    authorEdit = QLineEdit()
    reviewEdit = QTextEdit()
    testEdit = QTextEdit()

    grid = QGridLayout()
    grid.setSpacing(10)

    grid.addWidget(title, 1, 0)
    grid.addWidget(titleEdit, 1, 1)

    grid.addWidget(author, 2, 0)
    grid.addWidget(authorEdit, 2, 1)

    grid.addWidget(review, 3, 0)
    grid.addWidget(reviewEdit, 3, 1, 5, 1)

    grid.addWidget(test, 8, 0)
    grid.addWidget(testEdit, 8, 1)

    self.setLayout(grid)

    self.setGeometry(300, 300, 350, 300)
    self.setWindowTitle('Review')
    self.show()

我刚刚将新的1x1小部件放在第8行中的上一行下方,它会产生:

输出2

但是结果不是我期望的,因为testEdit-widget的大小绝对不是1x1,并且reviewEdit-widget也被更改了。 那么为什么它不能这样工作?

1 个答案:

答案 0 :(得分:0)

尝试一下:

import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit,
                             QTextEdit, QGridLayout, QApplication,
                             )

class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        title  = QLabel('Title')
        author = QLabel('Author')
        review = QLabel('Review')
        test   = QLabel('Test')            

        titleEdit  = QLineEdit()
        authorEdit = QLineEdit()
        reviewEdit = QTextEdit()
        testEdit   = QTextEdit()                 
        testEdit.setMaximumHeight(20)         # +++

        grid = QGridLayout()
        grid.setSpacing(10)

        grid.addWidget(title,      1, 0)
        grid.addWidget(titleEdit,  1, 1)
        grid.addWidget(author,     2, 0)
        grid.addWidget(authorEdit, 2, 1)
        grid.addWidget(review,     3, 0)
        grid.addWidget(reviewEdit, 3, 1, 5, 1)   

        grid.addWidget(test,       8, 0)               
        grid.addWidget(testEdit,   8, 1)      

        self.setLayout(grid)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('Review')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

enter image description here