如何在Pyqt5 中使用流式布局和滚动条
这期内容当中小编将会给大家带来有关如何在Pyqt5 中使用流式布局和滚动条,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
流式布局
所谓流式布局指的是容器中的元素像流水一样,是可以浮动的,当元素一行或者一列占满的时候,它会自动流入到下一行或者下一列。
pyqt5流式布局
pyqt中采用流式布局的方法原理是,通过contentsMargins获取到子元素距离布局的上下左右宽度,然后我们将所有子元素进行遍历,如果它加上边距可以在一行放入的话,那么就放在一行内,如果不能,就放入到下一行,具体代码如下:
m=self.contentsMargins() effective_rect=rect.adjusted(+m.left(),+m.top(),-m.right(),-m.bottom()) x=effective_rect.x() y=effective_rect.y() line_height=0 foriteminself._item_list: wid=item.widget() space_x=self.spacing() space_y=self.spacing() ifwidisnotNone: space_x+=wid.style().layoutSpacing( QSizePolicy.PushButton,QSizePolicy.PushButton,Qt.Horizontal) space_y+=wid.style().layoutSpacing( QSizePolicy.PushButton,QSizePolicy.PushButton,Qt.Vertical) next_x=x+item.sizeHint().width()+space_x ifnext_x-space_x>effective_rect.right()andline_height>0: x=effective_rect.x() y=y+line_height+space_y next_x=x+item.sizeHint().width()+space_x line_height=0 ifnottest_only: item.setGeometry(QRect(QPoint(x,y),item.sizeHint())) x=next_x line_height=max(line_height,item.sizeHint().height())
滚动条的设置
pyqt中有专门的滚动条组件QScrollBar,这个组件需要配合其他组件使用,我们这里使用QScrollArea这个组件进行滚动条的设置。
滚动条的使用方法
首先,我们需要声明QScrollArea
然后,我们需要设置QScrollArea的位置大小
最后,我们将需要产生滚动条的元素放入它的内部。
q=QWidget() qscrollarea=QtWidgets.QScrollArea(q)qscrollarea.setGeometry(QRect(50,100,600,500)) qscrollarea.setWidgetResizable(True) listWidget=QtWidgets.QListWidget() qscrollarea.setWidget(listWidget)
流式布局和滚动条的结合案例:
在文件当前目录创建一个images文件夹,然后放入想要展示的多张图片,然后执行当前程序,就会看到带有滚动条的流式布局界面。
运行程序,需要安装pyqt5
fromPyQt5.QtCoreimportQPoint,QRect,QSize,Qt,pyqtSignal importos fromPyQt5importQtCore,QtGui,QtWidgets fromPyQt5.QtWidgetsimport( QApplication,QLayout,QPushButton,QSizePolicy,QWidget,QGridLayout) importsys classWindow(QWidget): def__init__(self): self.imageheight=100 super(Window,self).__init__() self.resize(800,600) #self.listwidget=QtWidgets.QListWidget(self) #self.listwidget.resize(400,300) #self.listwidget.setGeometry(QtCore.QRect(0,0,300,200)) #self.listwidget.addItem("test") highlight_dir=r"./images" self.files_it=iter([os.path.join(highlight_dir,file) forfileinos.listdir(highlight_dir)]) #self.centralwidget=QtWidgets.QWidget(MainWindow) #self.gongzuomoshi=QtWidgets.QGroupBox(self.centralwidget) self.listWidget=QtWidgets.QListWidget(self) #self.listWidget.setFixedWidth(600) container_layout=QtWidgets.QVBoxLayout() g=QtWidgets.QGroupBox('') l=FlowLayout() g.setLayout(l) forfileiniter(self.files_it): pixmap=QtGui.QPixmap(file) ifnotpixmap.isNull(): autoWidth=pixmap.width()*self.imageheight/pixmap.height() label=QtWidgets.QLabel(pixmap=pixmap) label.setScaledContents(True) label.setFixedHeight(self.imageheight) label.setFixedWidth(autoWidth) l.addWidget(label) container_layout.addWidget(g) container_layout.addStretch() self.listWidget.setLayout(container_layout) self.qscrollarea=QtWidgets.QScrollArea(self) self.qscrollarea.setGeometry(QRect(50,100,600,500)) self.qscrollarea.setWidgetResizable(True) self.qscrollarea.setWidget(self.listWidget) self.setWindowTitle("FlowLayoutScroll") classFlowLayout(QLayout): """流式布局,使用说明 1.声明流式布局layout=FlowLayout 2.将元素放入流式布局中 3.将QGroupBox应用流式布局 4.如果期望水平流式,将QGroupBox放入到QHBoxLayout,如果期望垂直布局,将QGroupBox放入到QVBoxLayout """ heightChanged=pyqtSignal(int) def__init__(self,parent=None,margin=0,spacing=-1): super().__init__(parent) ifparentisnotNone: self.setContentsMargins(margin,margin,margin,margin) self.setSpacing(spacing) self._item_list=[] def__del__(self): whileself.count(): self.takeAt(0) defaddItem(self,item):#pylint:disable=invalid-name self._item_list.append(item) defaddSpacing(self,size):#pylint:disable=invalid-name self.addItem(QSpacerItem(size,0,QSizePolicy.Fixed,QSizePolicy.Minimum)) defcount(self): returnlen(self._item_list) defitemAt(self,index):#pylint:disable=invalid-name if0<=index<len(self._item_list): returnself._item_list[index] returnNone deftakeAt(self,index):#pylint:disable=invalid-name if0<=index<len(self._item_list): returnself._item_list.pop(index) returnNone defexpandingDirections(self):#pylint:disable=invalid-name,no-self-use returnQt.Orientations(Qt.Orientation(0)) defhasHeightForWidth(self):#pylint:disable=invalid-name,no-self-use returnTrue defheightForWidth(self,width):#pylint:disable=invalid-name height=self._do_layout(QRect(0,0,width,0),True) returnheight defsetGeometry(self,rect):#pylint:disable=invalid-name super().setGeometry(rect) self._do_layout(rect,False) defsizeHint(self):#pylint:disable=invalid-name returnself.minimumSize() defminimumSize(self):#pylint:disable=invalid-name size=QSize() foriteminself._item_list: minsize=item.minimumSize() extent=item.geometry().bottomRight() size=size.expandedTo(QSize(minsize.width(),extent.y())) margin=self.contentsMargins().left() size+=QSize(2*margin,2*margin) returnsize def_do_layout(self,rect,test_only=False): m=self.contentsMargins() effective_rect=rect.adjusted(+m.left(),+m.top(),-m.right(),-m.bottom()) x=effective_rect.x() y=effective_rect.y() line_height=0 foriteminself._item_list: wid=item.widget() space_x=self.spacing() space_y=self.spacing() ifwidisnotNone: space_x+=wid.style().layoutSpacing( QSizePolicy.PushButton,QSizePolicy.PushButton,Qt.Horizontal) space_y+=wid.style().layoutSpacing( QSizePolicy.PushButton,QSizePolicy.PushButton,Qt.Vertical) next_x=x+item.sizeHint().width()+space_x ifnext_x-space_x>effective_rect.right()andline_height>0: x=effective_rect.x() y=y+line_height+space_y next_x=x+item.sizeHint().width()+space_x line_height=0 ifnottest_only: item.setGeometry(QRect(QPoint(x,y),item.sizeHint())) x=next_x line_height=max(line_height,item.sizeHint().height()) new_height=y+line_height-rect.y() self.heightChanged.emit(new_height) returnnew_height if__name__=='__main__': app=QApplication(sys.argv) mainWin=Window() mainWin.show() sys.exit(app.exec_())
上述就是小编为大家分享的如何在Pyqt5 中使用流式布局和滚动条了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
Python+PyQt如何实现数据库表格动态增删改
-
PyQt5如何使用mimeData实现拖拽事件
-
Python PyQt5如何实现文件拷贝器
-
pyqt5与html数据交互的原理是什么
pyqt5与html数据交互的原理是什么本文小编为大家详细介绍“p...
-
怎么用Python+PyQT5实现手绘图片生成器
-
如何使用PyQT5制作一个敏感词检测工具
-
怎么用PyQT5制作一个桌面摸鱼工具
怎么用PyQT5制作一个桌面摸鱼工具这篇文章主要介绍“怎么用PyQ...
-
如何在pyqt5中展示pyecharts生成的图像
-
如何实现pyqt5圆形label显示打开的摄像头功能
-
pyqt5蒙版遮罩mask,setmask的使用