在dragndrop之后没有调整pyqt scrollarea的大小

时间:2015-09-19 12:59:07

标签: pyqt qscrollarea

简短版本:
- 拿走代码,运行它,(你需要的只是两个png图标)
- 调整窗口大小要大得多 - dragndrop远离其中一个图标(距离至少300多个像素)
- 然后将窗口调整回原始尺寸
- 然后尝试滚动查看你拖下去的图标 - 你将无法做到。因为scrollarea太小了 - 为什么?

长版:
我无法确定如何更新我的scrollarea以反映我的应用程序中添加或修改的内容 我正在显示图标,我可以将它们拖出来。
如果我让窗户变大,请将一个图标拖到底部,
然后调整窗口大小,
scrollarea不允许我滚动到底部看我的图标 基本上,一旦应用程序启动,scrollarea维度永远不会改变 如何在dragndrop上制作scrollarea,以更新到新的尺寸? 它可能更大,如下面的截图所示,
或者更小,如果我的所有图标都分组在左上角,例如..
如果内容适合窗口,我将不会显示滑块。

这是一个显示问题的屏幕截图,
它是同一个窗口,我只是调整它的大小,并在底部拖出一个图标:

scrollarea_not_updated (scrollarea没有更新,所以我无法向下滚动到我放在底部的图标)


这是迄今为止的代码:

#!/usr/bin/python3

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys


class DragWidget(QFrame):

    def __init__(self, parent=None):
        super(DragWidget, self).__init__(parent)

        self.setMinimumSize(200, 200)
        self.setAcceptDrops(True)

        test_icon1 = QLabel(self)
        test_icon1.setPixmap(QPixmap('./images/closeicon.png'))
        test_icon1.move(20, 20)
        test_icon1.show()
        test_icon1.setAttribute(Qt.WA_DeleteOnClose)

        test_icon2 = QLabel(self)
        test_icon2.setPixmap(QPixmap('./images/openicon.png'))
        test_icon2.move(60, 20)
        test_icon2.show()
        test_icon2.setAttribute(Qt.WA_DeleteOnClose)

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat('application/x-dnditemdata'):
            if event.source() == self:
                event.setDropAction(Qt.MoveAction)
                event.accept()
            else:
                event.acceptProposedAction()
        else:
            event.ignore()

    dragMoveEvent = dragEnterEvent

    def dropEvent(self, event):
        if event.mimeData().hasFormat('application/x-dnditemdata'):
            itemData = event.mimeData().data('application/x-dnditemdata')
            dataStream = QDataStream(itemData, QIODevice.ReadOnly)

            pixmap = QPixmap()
            offset = QPoint()
            dataStream >> pixmap >> offset

            newIcon = QLabel(self)
            newIcon.setPixmap(pixmap)
            newIcon.move(event.pos() - offset)
            newIcon.show()
            newIcon.setAttribute(Qt.WA_DeleteOnClose)

            if event.source() == self:
                event.setDropAction(Qt.MoveAction)
                event.accept()
            else:
                event.acceptProposedAction()
        else:
            event.ignore()

    def mousePressEvent(self, event):
        child = self.childAt(event.pos())
        if not child:
            return

        pixmap = QPixmap(child.pixmap())

        itemData = QByteArray()
        dataStream = QDataStream(itemData, QIODevice.WriteOnly)
        dataStream << pixmap << QPoint(event.pos() - child.pos())

        mimeData = QMimeData()
        mimeData.setData('application/x-dnditemdata', itemData)

        drag = QDrag(self)
        drag.setMimeData(mimeData)
        drag.setPixmap(pixmap)
        drag.setHotSpot(event.pos() - child.pos())

        tempPixmap = QPixmap(pixmap)
        painter = QPainter()
        painter.begin(tempPixmap)
        painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127))
        painter.end()

        child.setPixmap(tempPixmap)
        if drag.exec_(Qt.CopyAction | Qt.MoveAction) == Qt.MoveAction:
            child.close()
        else:
            child.show()
            child.setPixmap(pixmap)


class Window(QWidget):

    def __init__(self, parent=None):
        super(Window, self).__init__()

        widget = QWidget()
        palette = QPalette()
        palette.setBrush(QPalette.Background, QBrush(QPixmap("images/pattern.png")))
        widget.setPalette(palette)
        layout = QVBoxLayout(self)
        layout.addWidget(DragWidget())
        widget.setLayout(layout)
        scroll = QScrollArea()
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        scroll.setWidgetResizable(True)
        scroll.setWidget(widget)
        vlayout = QVBoxLayout(self)
        vlayout.setContentsMargins(0, 0, 0, 0)
        vlayout.setSpacing(0)
        vlayout.addWidget(scroll)
        self.setLayout(vlayout)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window('./')
    sys.exit(app.exec_())

0 个答案:

没有答案