用QlistView写几十个带有图片的按钮,每一页24个,带上一页下一页功能
时间: 2024-05-08 15:21:14 浏览: 11
可以使用QListView和QStandardItemModel来实现这个功能。以下是一个简单的示例代码:
```python
from PyQt5.QtWidgets import QApplication, QListView, QStyledItemDelegate, QAbstractItemView, QHBoxLayout, QVBoxLayout, QWidget, QPushButton, QLabel, QGridLayout, QFrame
from PyQt5.QtGui import QPixmap, QStandardItemModel, QStandardItem
from PyQt5.QtCore import Qt
class ImageDelegate(QStyledItemDelegate):
def __init__(self, parent=None):
super().__init__(parent)
def paint(self, painter, option, index):
if not index.isValid():
return
pixmap = index.data(Qt.DecorationRole)
if pixmap.isNull():
return
pixmap = pixmap.scaled(option.rect.width(), option.rect.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
painter.drawPixmap(option.rect.x(), option.rect.y(), pixmap)
def sizeHint(self, option, index):
return option.rect.size()
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Image Buttons')
self.setGeometry(100, 100, 800, 600)
self.model = QStandardItemModel(self)
self.listView = QListView(self)
self.listView.setModel(self.model)
self.listView.setViewMode(QListView.IconMode)
self.listView.setIconSize(Qt.SizeHint(160, 160))
self.listView.setResizeMode(QListView.Adjust)
self.listView.setUniformItemSizes(True)
self.listView.setSpacing(20)
self.listView.setItemDelegate(ImageDelegate(self))
self.listView.setSelectionMode(QAbstractItemView.NoSelection)
self.prevButton = QPushButton('Prev', self)
self.nextButton = QPushButton('Next', self)
self.prevButton.clicked.connect(self.prevPage)
self.nextButton.clicked.connect(self.nextPage)
self.pageLabel = QLabel('Page 1', self)
self.pageLabel.setAlignment(Qt.AlignHCenter)
self.gridLayout = QGridLayout()
self.gridLayout.addWidget(self.listView, 0, 0, 1, 3)
self.gridLayout.addWidget(self.prevButton, 1, 0)
self.gridLayout.addWidget(self.pageLabel, 1, 1)
self.gridLayout.addWidget(self.nextButton, 1, 2)
self.setLayout(self.gridLayout)
self.images = []
for i in range(1, 61):
self.images.append(QPixmap(f'button_{i}.png'))
self.itemsPerPage = 24
self.currentPage = 1
self.totalPages = len(self.images) // self.itemsPerPage + 1
self.updatePage()
def updatePage(self):
self.model.clear()
start = (self.currentPage - 1) * self.itemsPerPage
end = start + self.itemsPerPage
for pixmap in self.images[start:end]:
item = QStandardItem()
item.setData(pixmap, Qt.DecorationRole)
self.model.appendRow(item)
self.pageLabel.setText(f'Page {self.currentPage}')
self.prevButton.setEnabled(self.currentPage > 1)
self.nextButton.setEnabled(self.currentPage < self.totalPages)
def prevPage(self):
if self.currentPage > 1:
self.currentPage -= 1
self.updatePage()
def nextPage(self):
if self.currentPage < self.totalPages:
self.currentPage += 1
self.updatePage()
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
这个示例使用了一个自定义的QStyledItemDelegate来绘制图像。它会根据项的大小自适应缩放图像。我们还使用了QStandardItemModel来管理项目和图像数据。
在MainWindow类的initUI方法中,我们创建了一个QListView和一个QStandardItemModel,并将它们关联起来。我们还设置了QListView的视图模式,图标大小,调整模式和项委托。我们禁用了项的选择,因为我们不需要它。
我们还添加了一个前一页和后一页按钮,并将它们连接到prevPage和nextPage方法,这些方法将更新当前页码并重新加载模型。我们还在窗口中添加了一个用于显示当前页码的标签,并将其居中对齐。
在MainWindow类的构造函数中,我们将所有图像加载到一个列表中,并计算总页数。然后,我们调用updatePage方法,该方法会根据当前页码更新模型和页码标签,并禁用或启用前一页和后一页按钮,以防止用户浏览超过边界。