我有一个QScrollArea,其中包含一个具有QVBoxLayout的小部件。在这个布局中有几个其他小部件。我希望用户能够拖动这些小部件的下边界以在垂直方向上调整它们的大小。当它们被调整大小时,我不希望它们从滚动区域中“窃取”其他小部件的大小;相反,我希望整个滚动的“页面”改变其大小。因此,如果您扩大其中一个小部件,则应将其他小部件向下推(超出滚动区域的视口);如果您缩小它,则应将其他小部件向上拉。拖动一个小部件的边界不应更改垂直滚动中任何其他小部件的大小;它只应该移动它们。
我开始使用QSplitter。 如果我使用它,我可以拖动更改小部件的大小,但似乎没有办法使它像上面描述的那样“推/拉”其他部件,而不是增长/缩小它们。 但我找不到任何其他方法来给一个小部件一个可拖动的手柄,允许我改变它的大小。 我该如何实现这一点?
这里是我正在做的简单示例。(在这个示例中,我已经注释掉了分裂器,但如果您取消注释它,您可以看到该版本的情况。)
我开始使用QSplitter。 如果我使用它,我可以拖动更改小部件的大小,但似乎没有办法使它像上面描述的那样“推/拉”其他部件,而不是增长/缩小它们。 但我找不到任何其他方法来给一个小部件一个可拖动的手柄,允许我改变它的大小。 我该如何实现这一点?
这里是我正在做的简单示例。(在这个示例中,我已经注释掉了分裂器,但如果您取消注释它,您可以看到该版本的情况。)
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.Qsci import QsciScintilla, QsciLexerPython
class SimplePythonEditor(QsciScintilla):
def __init__(self, parent=None):
super(SimplePythonEditor, self).__init__(parent)
self.setMinimumHeight(50)
class Chunk(QFrame):
def __init__(self, parent=None):
super(Chunk, self).__init__(parent)
layout = QVBoxLayout(self)
sash = QSplitter(self)
layout.addWidget(sash)
sash.setOrientation(Qt.Vertical)
editor = self.editor = SimplePythonEditor()
output = self.output = SimplePythonEditor()
output.setReadOnly(True)
sash.addWidget(editor)
sash.addWidget(output)
self.setLayout(layout)
print(self.sizePolicy())
class Widget(QWidget):
def __init__(self, parent= None):
global inout
super(Widget, self).__init__()
#Container Widget
widget = QWidget()
#Layout of Container Widget
layout = QVBoxLayout(self)
#sash = QSplitter(self)
#layout.addWidget(sash)
#sash.setOrientation(Qt.Vertical)
for num in range(5):
editor = SimplePythonEditor()
editor.setText("Some stuff {}".format(num))
layout.addWidget(editor)
#sash.addWidget(editor)
widget.setLayout(layout)
#Scroll Area Properties
scroll = QScrollArea()
scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
scroll.setWidgetResizable(True)
scroll.setWidget(widget)
scroll.setMaximumHeight(500)
#Scroll Area Layer add
vLayout = QVBoxLayout(self)
vLayout.addWidget(scroll)
self.setLayout(vLayout)
if __name__ == '__main__':
app = QApplication(sys.argv)
dialog = Widget()
dialog.show()
app.exec_()
setSizePolicy
和QSizePolicy
,例如scroll.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
。 - Christos Lytras