根据高度

时间:2017-10-23 23:49:01

标签: python pyside

我试图找到一种方法让我的一个小部件根据其高度保持宽度。我有其他小部件正在重新实现 heightForWidth 方法。这很简单,因为该方法是标准的。我知道没有包含 widthForHeight 方法,所以我尝试了很多互联网建议的选项,但没有任何工作方式。我现在所拥有的几乎让我在那里。

我首先重新实现我的小部件的sizeHint,以使其宽度成为其父级(QHBoxLayout)高度的比率。

sizeHint使MyCustomLabel在首次显示时显示正确的大小,但在用户调整窗口大小时没有更新。我不知道这是否是最好的方法,但要解决这个问题,我正在重新实现resizeEvent并调用adjustSize来强制sizeHint重新计算。

使用这两个重新实现的方法MyCustomLabel显示正确的大小。我将这个自定义小部件放在QHBoxLayout中,并带有一些其他标准小部件。问题是当用户调整窗口大小时,布局中的其他小部件不会尊重MyCustomLabel的新大小。我最终得到的是布局中的其他小部件重叠或放置得离MyCustomLabel太远。我有点得到它,我粗暴地强迫我的小部件大小,而不是让布局做的工作。但是我想更新sizeHint会告知MyCustomLabel新大小的布局并相应地调整所有内容。我如何解决这个布局问题,或者我是否以错误的方式解决了这个widthForHeight问题?

修改 我试过@AlexanderVX建议将SizePolicy设置为Minimum,虽然它确实阻止其他小部件重叠,但它也将MyCustomLabel锁定为固定大小。我需要使用布局来扩展和缩小窗口小部件。我还尝试了Preferred,Expanding,MinimumExpanding策略,看看他们是否会做任何事情,但没有运气。

from __future__ import division
from PySide import QtCore
from PySide import QtGui
import sys    


class MyCustomLabel(QtGui.QLabel):
    clicked = QtCore.Signal(int)
    dblClicked = QtCore.Signal(int)    

    def __init__(self, leadSide='height', parent=None):
        super(MyCustomLabel, self).__init__()
        self.leadSide = leadSide    

        # sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, 
        #         QtGui.QSizePolicy.Preferred)
        # sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, 
        #         QtGui.QSizePolicy.Expanding)
        # sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, 
        #         QtGui.QSizePolicy.MinimumExpanding)
        # sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, 
        #         QtGui.QSizePolicy.Minimum)
        # self.setSizePolicy(sizePolicy)    

    def resizeEvent(self, event):
        super(MyCustomLabel, self).resizeEvent(event)
        self.adjustSize()    

    def sizeHint(self):
        super(MyCustomLabel, self).sizeHint()
        parentSize = self.parent().size().toTuple()
        if self.leadSide.lower() == 'height':
            new_size = QtCore.QSize(parentSize[1] * (16 / 9), parentSize[1]) * .9
        if self.leadSide.lower() == 'width':
            new_size = QtCore.QSize(parentSize[0], parentSize[0] / (16 / 9)) * .9    

        return new_size    


class __Test__(QtGui.QWidget):    

    def __init__(self):
        super(__Test__, self).__init__()    

        self.initUI()    

    def initUI(self):
        customLabel = MyCustomLabel(leadSide='height')
        # customLabel.setScaledContents(True)
        customLabel.setStyleSheet('background-color: blue;' 
            'border:2px solid red;')    

        btn01 = QtGui.QPushButton('button')
        btn01.setFixedHeight(80)    

        textEdit = QtGui.QTextEdit()
        textEdit.setFixedSize(150, 150)    

        layout01 = QtGui.QHBoxLayout()
        layout01.setContentsMargins(0,0,0,0)
        layout01.setSpacing(0)
        layout01.addWidget(customLabel)
        layout01.addWidget(btn01)
        layout01.addWidget(textEdit)
        self.setLayout(layout01)    

        self.setGeometry(300, 300, 600, 300)
        self.setWindowTitle('Testing')
        self.show()    


def main():    

    app = QtGui.QApplication(sys.argv)
    ex = __Test__()
    sys.exit(app.exec_())    

if __name__ == '__main__':
    main()

0 个答案:

没有答案