listview添加多列:qt listview詳細用法

QListView簡介

QListView列表視圖可以用來以列表的形式來展示數據。在Qt中使用Model-View結構來處理數據與視圖之間的關係,Model負責數據的存取,View負責數據的展示, 二者之間數據的交互則是通過委託(delegate)來實現。

QT提供了一些現成的models用於處理數據項:

  • QStringListModel 用於存儲簡單的QString列表;
  • StandardItemModel 管理複雜的樹型結構數據項,每項都可以包含任意數據;
  • QDirModel 提供本地文件系統中的文件與目錄信息;
  • QSqlQueryModel, QSqlTableModel,QSqlRelationTableModel用來訪問資料庫;

QListView是Model-View框架中的一個類,是Qt Model-View框架的組成部分,QListView實現了QAbstractItemView類定義的介面,以使其能夠顯示從QAbstractItemModel類派生的模型提供的數據。

QListView常用方法:

  • setModel(): 用來設置View所關聯的Model,可以使用Python原生的list作為數據源Model;
  • selectedItem(): 選中Model的條目;
  • isSelected(): 判斷Model中的某條目是否被選中;
  • setViewMode(): 設置視圖模式。(ListMode: 條目從上到下布局,小尺寸顯示, IconMode: 條目從左到右布局,大尺寸顯示)

QListView常用信號:

  • clicked: 單擊某項時,發射此信號;
  • doubleClicked: 雙擊擊某項時,發射此信號;
  • activated: 當用戶激活index指定的項目時,發射此信號;
  • entered: 當滑鼠游標進入index指定的項目時,發射此信號;
  • iconSizeChanged: 在視圖可見時設置此圖標大小時,發射此信號;
  • indexesMoved: 在視圖中移動索引時,發射此信號;
  • pressed: 按下滑鼠按鈕時,發射此信號;
  • viewportEntered: 當滑鼠游標進入視圖時,發射此信號。

QListView類繼承關係:

實戰PyQt5: 071-列表視圖QListView

測試QListView

使用QStandardItemModel作為QListView 所使用的模型,在QStandardItemModel中每個QStandardItem條目添加一個圖標和文本。完整代碼如下:

import sys,os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
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('實戰PyQt5: QListView Demo!')      
        # 設置窗口大小
        self.resize(480, 360)
      
        self.initUi()
        
    def initUi(self):
        vLayout = QVBoxLayout(self)
        
        lv = QListView(self) 
        slm = QStandardItemModel()
        self.sports = [
            {'img':'/images/basketball.png', 'title':'籃球'},
            {'img':'/images/football.png', 'title':'足球'},
            {'img':'/images/rugby-ball.png', 'title':'橄欖球'},
            {'img':'/images/valley-ball.png', 'title':'排球'}
        ] 
        
        for sport in self.sports:
            item = QStandardItem(QIcon(os.path.dirname(__file__) + sport['img']), sport['title'])
            slm.appendRow(item)
        
        lv.setModel(slm)
        lv.clicked.connect(self.onListViewClicked)
        self.label = QLabel(self)
        
        vLayout.addWidget(lv)
        vLayout.addWidget(self.label)
        
        self.setLayout(vLayout)
        
        #設置選中第一行
        lv.setCurrentIndex(slm.index(0, 0))
        self.label.setText('當前選擇為: ' + self.sports[0]['title'])
        
    def onListViewClicked(self, index):
        #顯示選中的x信息
        self.label.setText('當前選擇為: ' + self.sports[index.row()]['title'])
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DemoListView()
    window.show()
    sys.exit(app.exec())

運行結果如下圖:實戰PyQt5: 071-列表視圖QListView

測試QListView

本文知識點

  • 使用QStandardItemModel作為視圖的模型;
  • 使用QStandItem為QStandardItemModel添加條目;
  • 為QStandItem條目添加一個圖標和文字信息。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/221880.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 13:25
下一篇 2024-12-09 13:25

相關推薦

發表回復

登錄後才能評論