2014-09-01 81 views
1

我有一個QScrollArea,我將添加一些其他小部件。我想要的是,QScrollArea開始滾動時,其中的小部件擴大其大小。QScrollArea正在擴展而不是滾動

但是,滾動區域開始自己擴大。

下面是我使用的代碼:

import sys 
from PyQt4 import QtGui, QtCore 

class Widget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 

     self.vbox = QtGui.QVBoxLayout() 
     self.setLayout(self.vbox) 

    def add_button(self): 
     tmp = QtGui.QPushButton("...", self) 
     self.vbox.addWidget(tmp) 

class ScrollArea(QtGui.QScrollArea): 
    def __init__(self, parent=None): 
     QtGui.QScrollArea.__init__(self, parent) 

     self.vbox = QtGui.QVBoxLayout() 

     self.w = Widget(self) 
     self.setWidget(self.w) #set the widget to provide scrolling for here 
     self.vbox.addWidget(self.w) 

     self.plus = QtGui.QPushButton("button", self) 
     self.connect(self.plus, QtCore.SIGNAL("clicked()"), self.add_button) 
     self.vbox.addWidget(self.plus) 

     self.setLayout(self.vbox) 

    def add_button(self): 
     self.w.add_button() 

app = QtGui.QApplication(sys.argv) 
main = ScrollArea() 
main.show() 
sys.exit(app.exec_()) 

我也試着設置子部件self.w的佈局在類ScrollArea,而不是在自己的類,但它有同樣的效果。

+2

根據文檔的'QScrollArea'能夠顯示裏面* *一個小部件,你必須添加使用'setWidget'方法的窗口小部件,不建立您自己的佈局並手動將其應用於該區域。請參閱[這裏](http://qt-project.org/doc/qt-4.8/qscrollarea.html#details)。 – Bakuriu 2014-09-01 19:57:05

+0

是的,你是對的,我忘了那個。但不幸的是,添加'self.setWidget(self.w)'行不會改變行爲。根據文檔,它應該提供現在滾動的小部件'self.w',但不知道它不。 – 2014-09-01 21:19:02

+0

你仍然在調用'setLayout'。 *那是什麼打破了這種行爲。 – Bakuriu 2014-09-02 06:53:55

回答

1

前面已經指出的Bakuriu一個不自己的佈局適用於QScrollArea是很重要的,但只是通過setWidget指定一個小部件(在下面用w表示)作爲一個滾動區域應注意關閉。

你打電話setWidget之前設置的w佈局是很重要的,如果一個人想了幾個其他孩子加入到w(如QPushButton S IN上述問題),這也是很重要的來電setSizeConstraintw' (例如setSizeContraint(QLayout.SetMinAndMaxSize),更多選項請參閱this)。請按照this link瞭解有關QScrollArea行爲的更多詳細信息。

下面的代碼是一個工作示例:

import sys 
from PyQt4 import QtGui, QtCore 

class Widget(QtGui.QWidget): 
    """ Here we add more buttons, if the size of the buttons exceeds the size of the widget scrolling starts. """ 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 

     self.vbox = QtGui.QVBoxLayout() 
     self.vbox.setSizeConstraint(QtGui.QLayout.SetMinAndMaxSize) 
     self.setLayout(self.vbox) 

    def add_button(self): 
     tmp = QtGui.QPushButton("...", self) 
     self.vbox.addWidget(tmp) 

class ScrollArea(QtGui.QScrollArea): 
    """ This scroll area only handles one widget for which scrolling should be provided. """ 
    def __init__(self, parent=None): 
     QtGui.QScrollArea.__init__(self, parent) 

     self.w = Widget() 
     self.setWidget(self.w) #set the widget to provide scrolling for here 

    def add_button(self): 
     self.w.add_button() 

class MainWindow(QtGui.QWidget): 
    """ Use this widget to arrange the QScrollArea and the QPushButton. """ 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self) 

     self.vbox = QtGui.QVBoxLayout() 
     self.scroll = ScrollArea(self) 
     self.vbox.addWidget(self.scroll) 

     self.plus = QtGui.QPushButton("button", self) 
     self.connect(self.plus, QtCore.SIGNAL("clicked()"), self.add_button) 
     self.vbox.addWidget(self.plus) 

     self.setLayout(self.vbox) 

    def add_button(self): 
     self.scroll.add_button() 

app = QtGui.QApplication(sys.argv) 
main = MainWindow() 
main.show() 
sys.exit(app.exec_())