zhiyiYo / PyQt-Fluent-Widgets

A fluent design widgets library based on C++ Qt/PyQt/PySide. Make Qt Great Again.
https://qfluentwidgets.com
GNU General Public License v3.0
4.99k stars 464 forks source link

[Bug]: 在FlowLayout添加很多相同控件后拖动窗体,窗体尺寸突变 #858

Closed lmhHydropower closed 1 month ago

lmhHydropower commented 2 months ago

What happened?

在FlowLayout添加很多相同控件后鼠标按住主窗体尝试拖动窗体尺寸自动变化。 或者尝试放大窗口时,窗口尺寸突然变大

Operation System

Windows 11 家庭中文版 23H2 22631.3447

Python Version

3.8.18

PyQt/PySide Version

PyQt 5.15.9

PyQt/PySide-Fluent-Widgets Version

1.3.5

How to Reproduce?

在 flow_layout 的例子中,添加很多QPushButton,然后运行。尝试拖动窗体,就可以复现,窗口尺寸持续增大的bug。或者,开始运行后,尝试将窗体高度拉大,窗体会突然变大。

Minimum code

# coding:utf-8
import sys
from PyQt5.QtCore import QEasingCurve
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

from qfluentwidgets import FlowLayout

class Demo(QWidget):

    def __init__(self):
        super().__init__()
        layout = FlowLayout(self, needAni=True)

        # customize animation
        layout.setAnimation(250, QEasingCurve.OutQuad)

        layout.setContentsMargins(30, 30, 30, 30)
        layout.setVerticalSpacing(20)
        layout.setHorizontalSpacing(10)

        layout.addWidget(QPushButton('aiko'))
        layout.addWidget(QPushButton('刘静爱'))
        layout.addWidget(QPushButton('柳井爱子'))
        layout.addWidget(QPushButton('aiko 赛高'))
        layout.addWidget(QPushButton('aiko 太爱啦😘'))
        layout.addWidget(QPushButton('aiko'))
        layout.addWidget(QPushButton('刘静爱'))
        layout.addWidget(QPushButton('柳井爱子'))
        layout.addWidget(QPushButton('aiko 赛高'))
        layout.addWidget(QPushButton('aiko 太爱啦😘'))
        layout.addWidget(QPushButton('aiko'))
        layout.addWidget(QPushButton('刘静爱'))
        layout.addWidget(QPushButton('柳井爱子'))
        layout.addWidget(QPushButton('aiko 赛高'))
        layout.addWidget(QPushButton('aiko 太爱啦😘'))
        layout.addWidget(QPushButton('aiko'))
        layout.addWidget(QPushButton('刘静爱'))
        layout.addWidget(QPushButton('柳井爱子'))
        layout.addWidget(QPushButton('aiko 赛高'))
        layout.addWidget(QPushButton('aiko 太爱啦😘'))

        self.resize(250, 300)
        self.setStyleSheet('Demo{background: white} QPushButton{padding: 5px 10px; font:15px "Microsoft YaHei"}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Demo()
    w.show()
    app.exec_()
rainzee commented 2 months ago

这应该是预期行为,并不是一个 bug

lmhHydropower commented 2 months ago

我只想拖动窗口,它会突然变得很长,而FlowLayout中内容很多,突然边长的窗口早就超出屏幕范围。请问这种突变是预期行为?

https://github.com/zhiyiYo/PyQt-Fluent-Widgets/assets/48676885/ab5094fe-d24e-4a87-8a75-74a9fe2efb4d

AlexZhu2001 commented 1 month ago

因为QWidget的大小是固定的,你这样写程序只能自动缩放到能够展示所有的控件。其实怎么使用取决于你想要实现的效果。

如果你希望不缩放窗口大小,形成从上到下的滚动区域,那你应该继承自QScrollArea,例如:

# coding:utf-8
import sys
from PyQt5.QtCore import QEasingCurve
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QScrollArea

from qfluentwidgets import FlowLayout

class Demo(QScrollArea):

    def __init__(self):
        super().__init__()
        self.w = QWidget(self)
        self.setWidget(self.w)
        self.setWidgetResizable(True)
        layout = FlowLayout(self.w, needAni=True)

        # customize animation
        layout.setAnimation(250, QEasingCurve.OutQuad)

        layout.setContentsMargins(30, 30, 30, 30)
        layout.setVerticalSpacing(20)
        layout.setHorizontalSpacing(10)

        layout.addWidget(QPushButton('aiko'))
        layout.addWidget(QPushButton('刘静爱'))
        layout.addWidget(QPushButton('柳井爱子'))
        layout.addWidget(QPushButton('aiko 赛高'))
        layout.addWidget(QPushButton('aiko 太爱啦😘'))
        layout.addWidget(QPushButton('aiko'))
        layout.addWidget(QPushButton('刘静爱'))
        layout.addWidget(QPushButton('柳井爱子'))
        layout.addWidget(QPushButton('aiko 赛高'))
        layout.addWidget(QPushButton('aiko 太爱啦😘'))
        layout.addWidget(QPushButton('aiko'))
        layout.addWidget(QPushButton('刘静爱'))
        layout.addWidget(QPushButton('柳井爱子'))
        layout.addWidget(QPushButton('aiko 赛高'))
        layout.addWidget(QPushButton('aiko 太爱啦😘'))
        layout.addWidget(QPushButton('aiko'))
        layout.addWidget(QPushButton('刘静爱'))
        layout.addWidget(QPushButton('柳井爱子'))
        layout.addWidget(QPushButton('aiko 赛高'))
        layout.addWidget(QPushButton('aiko 太爱啦😘'))

        self.resize(250, 300)
        self.setStyleSheet('Demo{background: white} QPushButton{padding: 5px 10px; font:15px "Microsoft YaHei"}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Demo()
    w.show()
    app.exec_()

其他也同理,这个layout一般也不会单独作为顶级窗口的layout使用才对

lmhHydropower commented 1 month ago

感谢,感谢。👍👍