QT提供了一些现成的models用于处理数据项。
QListView常用方法:
名称 | 描述 |
---|---|
setModel() | 用来设置View所关联的Model,可以使用Python原生的list作为数据源Model |
setCurrentIndex() | 设置当前选中的项目 |
setViewMode() | 设置视图模式。(ListMode: 条目从上到下布局,小尺寸显示, IconMode: 条目从左到右布局,大尺寸显示) |
listView.model().rowCount() | ListView中的Item总数 |
clicked: 单击某项时,发射此信号;
doubleClicked: 双击击某项时,发射此信号;
activated: 当用户激活index指定的项目时,发射此信号;
entered: 当鼠标光标进入index指定的项目时,发射此信号;
iconSizeChanged: 在视图可见时设置此图标大小时,发射此信号;
indexesMoved: 在视图中移动索引时,发射此信号;
pressed: 按下鼠标按钮时,发射此信号;
viewportEntered: 当鼠标光标进入视图时,发射此信号。
import os
import sys
from PyQt5.QtGui import QIcon, QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import (QApplication, QWidget, QListView,
QLabel, QVBoxLayout)
class DemoListView(QWidget):
def __init__(self, parent=None):
super(DemoListView, self).__init__(parent)
self.setWindowTitle("QListView 例子")
self.resize(480, 360)
self.init_ui()
def init_ui(self):
v_box = QVBoxLayout(self)
l_view = QListView(self)
s_model = QStandardItemModel()
self.sports = [
{'img': '/images/dog.png', 'title': '篮球'},
{'img': '/images/boy.jpg', 'title': '足球'}]
for sport in self.sports:
item = QStandardItem(QIcon(os.path.dirname(__file__) + sport['img']), sport['title'])
s_model.appendRow(item)
l_view.setModel(s_model)
l_view.clicked.connect(self.on_listview_clicked)
self.label = QLabel(self)
v_box.addWidget(l_view)
v_box.addWidget(self.label)
self.setLayout(v_box)
l_view.setCurrentIndex(s_model.index(1, 0)) # 设置选中第一行
self.label.setText('当前选择为: ' + self.sports[0]['title'])
def on_listview_clicked(self, index):
self.label.setText('当前选择为: ' + self.sports[index.row()]['title'])
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DemoListView()
window.show()
sys.exit(app.exec_())
from PyQt5.Qt import *
import sys
class ListViewDemo(QWidget):
def __init__(self, parent=None):
super(ListViewDemo, self).__init__(parent)
self.setWindowTitle("QListView 例子")
self.resize(300, 50)
vbox = QVBoxLayout()
l_view = QListView() # 创建一个listview对象
string_model = QStringListModel() # 创建model
self.qList = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] # 添加的数组数据
string_model.setStringList(self.qList) # 将数据设置到model
l_view.setModel(string_model) #绑定 l_view 和 model
l_view.clicked.connect(self.clickedlist)
vbox.addWidget(l_view)
self.setLayout(vbox)
l_view.setCurrentIndex(string_model.index(2)) # 设置选中第一行
print(l_view.model().rowCount())
print(l_view.selectedIndexes())
def clickedlist(self, index):
QMessageBox.information(self, "QListView", "你选择了: " + self.qList[index.row()])
print("点击的是:" + str(index.row()))
if __name__ == "__main__":
app = QApplication(sys.argv)
win = ListViewDemo()
win.show()
sys.exit(app.exec_())