1

があり、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

4

1 に答える 1

1

Bakuriu が既に指摘したように、独自のレイアウトを に適用するのではなく、スクロール領域が処理する必要があるものとしてQScrollArea1 つのウィジェット (以下で で示されwます) を指定することが重要です。setWidget

を呼び出すw 前にのレイアウトを設定することが重要です。 (上記の問題の s のように)setWidgetに他の子をいくつか追加したい場合は、のレイアウトを呼び出すことも重要です (たとえば、その他のオプションについては、こちらを参照してください)。の動作の詳細については、このリンクをたどってください。wQPushButtonsetSizeConstraintwsetSizeContraint(QLayout.SetMinAndMaxSize)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_())
于 2014-09-02T09:15:47.253 に答える