当我更改选择时,为什么我的窗口布局会发生变化?

时间:2016-01-25 20:51:42

标签: python qt layout

如果您查看我的两张图片here,您会发现在两个选项之间切换会改变右侧QListWidget的大小。

我使用QGridLayout进行了布局。以下是相关的代码段,其中pn_list是相关的小部件,但您可以看到完整的代码here

def initUI(self):
    # Layouts
    grid = QtGui.QGridLayout()
    ov_main = QtGui.QHBoxLayout()
    ov_col1 = QtGui.QFormLayout()
    ov_col2 = QtGui.QVBoxLayout()
    ov_custs = QtGui.QFormLayout()


    # Main window widgets
    self.pn_input = QtGui.QLineEdit()
    overviewBox = QtGui.QGroupBox('Overview')
    self.pn_list = MyListWidget()

    # Main window layout
    grid.addWidget(QtGui.QLabel('Part Number'), 1, 1)
    grid.addWidget(self.pn_input, 1, 2)
    grid.addWidget(overviewBox, 2, 1, 1, 2)
    grid.addWidget(self.pn_list, 1, 3, 2, 1)

更新:此外,作为后续问题,我该怎么做才能防止这种情况发生?最后,我想在行长度超过预定字符限制时包装“描述”字段 - 我当前让我的演示者在超过此长度时截断“描述”。如何以给定的字符宽度进行QLabel换行?

1 个答案:

答案 0 :(得分:0)

想出来。在MyListWidget(扩展QListWidget)上,我覆盖sizeHint方法以返回我希望我的小部件为宽度的宽度:

class MyListWidget(QtGui.QListWidget):

    def sizeHint(self):
        hint = QtCore.QSize()
        hint.setWidth(120)
        return hint

然后,在我的initUI方法中,我在#Main window layout部分添加了一行:

# Main window layout
grid.addWidget(QtGui.QLabel('Part Number'), 1, 1)
grid.addWidget(self.pn_input, 1, 2)
grid.addWidget(overviewBox, 2, 1, 1, 2)
grid.addWidget(self.pn_list, 1, 3, 2, 1)

这使得右边的小部件保持恒定宽度,但是我仍然遇到不同长度描述的问题。我在initUI方法中添加了以下行,以便类似地处理描述QLabel小部件,现在一切都很好:

myQLabel.sizeHint = lambda: QtCore.QSize(150, -1)
myQLabel.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Preferred)
myQLabel.setWordWrap(True)

lambda语句实际上是一种更快捷的方式来实现我对QListWidget所做的事情。在QListWidget的情况下,我已经重新实现了该类以添加自定义信号,因此我在那里添加了sizeHint代码。