這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何在Pyqt5 中使用流式布局和滾動(dòng)條,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

流式布局
所謂流式布局指的是容器中的元素像流水一樣,是可以浮動(dòng)的,當(dāng)元素一行或者一列占滿的時(shí)候,它會(huì)自動(dòng)流入到下一行或者下一列。
pyqt5流式布局
pyqt中采用流式布局的方法原理是,通過contentsMargins獲取到子元素距離布局的上下左右寬度,然后我們將所有子元素進(jìn)行遍歷,如果它加上邊距可以在一行放入的話,那么就放在一行內(nèi),如果不能,就放入到下一行,具體代碼如下:
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 for item in self._item_list: wid = item.widget() space_x = self.spacing() space_y = self.spacing() if wid is not None: 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 if next_x - space_x > effective_rect.right() and line_height > 0: x = effective_rect.x() y = y + line_height + space_y next_x = x + item.sizeHint().width() + space_x line_height = 0 if not test_only: item.setGeometry(QRect(QPoint(x, y), item.sizeHint())) x = next_x line_height = max(line_height, item.sizeHint().height())
滾動(dòng)條的設(shè)置
pyqt中有專門的滾動(dòng)條組件QScrollBar,這個(gè)組件需要配合其他組件使用,我們這里使用QScrollArea這個(gè)組件進(jìn)行滾動(dòng)條的設(shè)置。
滾動(dòng)條的使用方法
首先,我們需要聲明QScrollArea
然后,我們需要設(shè)置QScrollArea的位置大小
最后,我們將需要產(chǎn)生滾動(dòng)條的元素放入它的內(nèi)部。
q = QWidget() qscrollarea = QtWidgets.QScrollArea(q) qscrollarea.setGeometry(QRect(50,100,600,500)) qscrollarea.setWidgetResizable(True) listWidget = QtWidgets.QListWidget() qscrollarea.setWidget(listWidget)
流式布局和滾動(dòng)條的結(jié)合案例:
在文件當(dāng)前目錄創(chuàng)建一個(gè)images文件夾,然后放入想要展示的多張圖片,然后執(zhí)行當(dāng)前程序,就會(huì)看到帶有滾動(dòng)條的流式布局界面。
運(yùn)行程序,需要安裝pyqt5

from PyQt5.QtCore import QPoint, QRect, QSize, Qt,pyqtSignal
import os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (
QApplication, QLayout, QPushButton, QSizePolicy, QWidget, QGridLayout)
import sys
class Window(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)
for file in os.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)
for file in iter(self.files_it):
pixmap = QtGui.QPixmap(file)
if not pixmap.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("Flow Layout Scroll")
class FlowLayout(QLayout):
"""流式布局,使用說明
1.聲明流式布局 layout = FlowLayout
2.將元素放入流式布局中
3.將QGroupBox應(yīng)用流式布局
4.如果期望水平流式,將QGroupBox放入到QHBoxLayout,如果期望垂直布局,將QGroupBox放入到QVBoxLayout
"""
heightChanged = pyqtSignal(int)
def __init__(self, parent=None, margin=0, spacing=-1):
super().__init__(parent)
if parent is not None:
self.setContentsMargins(margin, margin, margin, margin)
self.setSpacing(spacing)
self._item_list = []
def __del__(self):
while self.count():
self.takeAt(0)
def addItem(self, item): # pylint: disable=invalid-name
self._item_list.append(item)
def addSpacing(self, size): # pylint: disable=invalid-name
self.addItem(QSpacerItem(size, 0, QSizePolicy.Fixed, QSizePolicy.Minimum))
def count(self):
return len(self._item_list)
def itemAt(self, index): # pylint: disable=invalid-name
if 0 <= index < len(self._item_list):
return self._item_list[index]
return None
def takeAt(self, index): # pylint: disable=invalid-name
if 0 <= index < len(self._item_list):
return self._item_list.pop(index)
return None
def expandingDirections(self): # pylint: disable=invalid-name,no-self-use
return Qt.Orientations(Qt.Orientation(0))
def hasHeightForWidth(self): # pylint: disable=invalid-name,no-self-use
return True
def heightForWidth(self, width): # pylint: disable=invalid-name
height = self._do_layout(QRect(0, 0, width, 0), True)
return height
def setGeometry(self, rect): # pylint: disable=invalid-name
super().setGeometry(rect)
self._do_layout(rect, False)
def sizeHint(self): # pylint: disable=invalid-name
return self.minimumSize()
def minimumSize(self): # pylint: disable=invalid-name
size = QSize()
for item in self._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)
return size
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
for item in self._item_list:
wid = item.widget()
space_x = self.spacing()
space_y = self.spacing()
if wid is not None:
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
if next_x - space_x > effective_rect.right() and line_height > 0:
x = effective_rect.x()
y = y + line_height + space_y
next_x = x + item.sizeHint().width() + space_x
line_height = 0
if not test_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)
return new_height
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWin = Window()
mainWin.show()
sys.exit(app.exec_())上述就是小編為大家分享的如何在Pyqt5 中使用流式布局和滾動(dòng)條了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章題目:如何在Pyqt5中使用流式布局和滾動(dòng)條-創(chuàng)新互聯(lián)
文章源于:http://chinadenli.net/article30/dgpcso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、自適應(yīng)網(wǎng)站、網(wǎng)站營銷、網(wǎng)頁設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)