如何在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

如何在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 中使用流式布局和滚动条了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。

发布于 2021-03-21 22:38:14
收藏
分享
海报
0 条评论
171
上一篇:如何在Java中使用Arrays.asList方法 下一篇:如何在YII2框架中使用Query()查询生成器
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码