欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

qt listview详细用法(listview添加多列)

程序员文章站 2024-03-26 14:47:35
qlistview简介qlistview列表视图可以用来以列表的形式来展示数据。在qt中使用model-view结构来处理数据与视图之间的关系,model负责数据的存取,view负责数据的展示, 二者...

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类继承关系:

qt listview详细用法(listview添加多列)

测试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())

运行结果如下图:

qt listview详细用法(listview添加多列)

测试qlistview

本文知识点

  • 使用qstandarditemmodel作为视图的模型;
  • 使用qstanditem为qstandarditemmodel添加条目;
  • 为qstanditem条目添加一个图标和文字信息。