我遇到了一个问题,我无法更新QGroupBox
.
我想从Windows 中的标准图片文件夹接收所有图片,然后单击按钮,如果图片较多或较少,请在 中更新view
,但启动时,updater
该函数showImg
会收到一个包含新图像的列表并将它们放入在列表内pix_dict
,但不重绘小部件。
这是 PyQT5 中可重现的最小示例:
import fnmatch
import os
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QVBoxLayout, QGridLayout, QGroupBox, QScrollArea, QPushButton
from win32comext.shell import shell, shellcon
class Main(QWidget):
def __init__(self):
super().__init__()
self.setMinimumSize(300, 300)
self.setWindowTitle('Test')
grid = QGridLayout()
grid.addWidget(self.update_photo(), 0, 0, Qt.AlignCenter)
grid.addWidget(self.showImg(), 1, 0, Qt.AlignCenter)
grid.addWidget(self.test_widget_2(), 2, 0, Qt.AlignCenter)
self.setLayout(grid)
def update_photo(self):
but = QPushButton('Обновить')
but.setFixedSize(200, 50)
but.clicked.connect(self.updater)
return but
def test_widget_2(self):
but = QPushButton('test_but_2')
but.setFixedSize(200, 50)
return but
def updater(self):
self.showImg().close()
self.showImg()
def find(self, pattern, path):
result = []
for root, dirs, files in os.walk(path):
for name in files:
if fnmatch.fnmatch(name, pattern):
result.append(os.path.join(root, name))
return result
def showImg(self):
path = shell.SHGetKnownFolderPath(shellcon.FOLDERID_Pictures)
all_image = self.find('*.jpg', f'{path}')
pix_dict = []
for image in all_image:
pxm = QPixmap(image)
pix_dict.append(pxm)
box = QGroupBox()
box.setStyleSheet("border:0;")
scr = QScrollArea(self)
scr.setStyleSheet('height:0px; width:0px;')
pnl = QWidget(self)
vbox = QVBoxLayout(self)
for image in list(reversed(pix_dict)):
photo_label = QLabel()
photo_label.setAlignment(Qt.AlignCenter)
photo_label.setMaximumSize(200, 120)
photo_label.setPixmap(image.scaled(photo_label.width(), photo_label.height(), Qt.KeepAspectRatio))
vbox.addWidget(photo_label)
pnl.setLayout(vbox)
scr.setWidget(pnl)
scr.setWidgetResizable(True)
group_box_layout = QVBoxLayout()
group_box_layout.addWidget(scr)
box.setLayout(group_box_layout)
return box
if __name__ == "__main__":
App = QApplication(sys.argv)
w = Main()
w.show()
sys.exit(App.exec())
尝试这个: