セクション15.23 PyQtは(パイソン+ Qtの)ポータル学習:開発モデルをサポートするモデル/ビューアーキテクチャQListViewビューを使用して

I.概要

QListViewは理論的に可能であり、すべてのQAbstractItemModelは、ドッキングなどQStringListModel、QDirModel、QFileSystemModel、QStandardItemModelなどのクラスを派生しますが、QListViewが実際に意義を示すために、QListViewを使用してモデルを使用して、複雑な階層ツリーのために少しだけのデータを表示することができます。このセクションでは、単純なコードのいくつかの例が開発したQListView /モデルへのプロセスを説明します。

二、QListView / QStringListModel

2.1、QStringListModel導入

QStringListModel Qtは達成されたインターフェースのQAbstractItemModelモデルが提供され、QListView QComboBoxオブジェクトとしてオブジェクトと文字列の簡略化されたビューの系列を表示するようになっ。

すべての標準機能QStringListModel編集可能なモデルを提供し、データは行モデルの複数の文字列のリストとして格納されます。

使用率(INT行、= 0 INTカラム、QModelIndex親=()QModelIndex)はフラグ(QModelIndexインデックス)を取得アイテムフラグを使用して、エントリに対応するモデル指数関数を取得し、データ項目を読み取るための使用データ()関数、及びのsetData ()は、データ・モデル内の行の数にアクセスするをrowCount()関数を使用してデータ項目を書き込みます。

モデルは、文字列を設定するために、既存の文字列のリスト、または缶setStringList()関数を構築するために使用することができます。文字列が挿入insertRowsための通常の方法で()関数であり、removeRowsによって除去することができます()。あなたは、取得するために、文字列STRINGLIST()関数の内容のリストを使用することができます。

2.2、QListViewとしてモデルQStringListModelを使用して

データがモデルにモデルに格納されたデータに保存され、その後、作成したばかりのQListViewオブジェクトモデルモデルインスタンスを設定されていない場合QListViewは非常に単純であるとしてQStringListModelを使用してモデルのアプローチは、まず、対象のQStringListModelインスタンスを作成します。次のステップ:

2.2.1は、オブジェクトのインスタンスを作成するQStringListModel

オブジェクトのインスタンスを作成する方法は2つあります。

  • データモデルに全く作成しない
    構文をされていますQStringListModel(QObjectを親=なし)
  • データ初期化中にモデルを作成する
    構文は次のとおりです。QStringListModel(文字列、QObjectを親=なし)
    データの文字列は、文字列のリストを表示するようにしました。
2.2.2は、データモデルが初期化されます

何のデータモデルが作成されない場合は、いくつかの方法でデータモデルを初期化することができます。

  • 完全な初期化メソッドに使用setStringList(STR)、サンプルコード:
self.model1.setStringList(["item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10"])
  • 組み合わせの使用insertRows()、インデックス()、のsetData()メソッド
    データinsertRowsのデータ・モデル内の空レコードを挿入することで、データのみの位置を占め、しかしのsetDataの実際の記憶によって生成される実際のデータを必要としません。方法のこの組み合わせはほとんど実用的な価値を持って、特定のパラメータおよび方法の意味は、詳細なしで本明細書に記載されます。

  • 接続モデルとビューを確立するためのビュー(モデル)メソッドを使用するために使ってsetModel

2.2.3、サンプルコードと実行ショット

オブジェクトを作成し、初期化データsetStringListの方法を使用して、このコードが使用:

 def initStringListModel(self):
        strList = ["item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10"]
        self.model = QStringListModel()
        self.model.setStringList(strList )
        self.listView.setModel(self.model)

ファイル名を指定して実行ショット:
ここに画像を挿入説明

三、QListView / QFileSystemModel

3.1概要

QFileSystemModelは、新しいディレクトリ機能を作成するだけでなく、名前変更、削除、ファイルやディレクトリを提供し、ローカルファイルシステムへのアクセスを提供するファイルのリストを格納するためのローカルファイルシステムのディレクトリツリーのファイル構造に指定されたモデルクラスを提供します。最も単純な場合には、ブラウザの一部として、又はディスプレイで使用するための適切なフィルタ手段を機能させることができます。

QListViewは、単一レベルのビューですが、QFileSystemModelは、ツリー・レベルのモデルであるが、それでもQListViewのツリーで、このQFileSystemModelモデル階層データのようなものを使用することができます。しかし、ときにのみ、トップレベルのビューのショーなので、少し実用的な意義のデータを示しています。

3.2、QListViewとしてモデルQFileSystemModelを使用して

QListViewとして使用QFileSystemModelモデルは、たった3つのステップを達成することができ、非常に簡単です:

  1. QFileSystemModelを作成されたオブジェクト

  2. ファイルセットに対応するディレクトリへのパスSetRootPath QFileSystemModel

  3. 接続モデルとビューを確立するためのビュー(モデル)メソッドを使用するために使ってsetModel

3.3サンプルコード

    def initDirModel(self):
        self.model = QtWidgets.QFileSystemModel()
        self.model.setRootPath(r"c:\temp")#监视目录异动
        self.listView.setModel(self.model)
        self.listView.setRootIndex(self.model.index(r"c:\temp"))()))#切换显示目录

ファイル名を指定して実行ショット:
ここに画像を挿入説明

四、QListView / QStandardItemModel

4.1概要

QStandardItemModelストアカスタムデータに使用される一般的なモデルモデル/ビューアーキテクチャである、それはプロセスモデルの項目に基づいて古典的なアプローチを提供し、項目タイプモデルはQStandardItemクラスまたはサブクラスでなければなりません。

QAbstractItemModelは、モデルがデータビューを提供するために、(例えばQListView、QTableViewとQTreeViewだけでなく、独自のカスタムビュー)インターフェイスのいずれかのサポートを使用できることを意味インターフェイスを、定義された達成QStandardItemModel。データストレージの異なるタイプのサポートを提供する性能と柔軟性、サブクラスQAbstractItemModelモデルの必要性を達成するために、例えば、QDirModelは、基礎となるファイルシステムにインタフェースするためのモデルを提供します。

4.2、QListViewとしてモデルQStandardItemModelを使用して

由于QStandardItemModel是一个通用的Model,使用它作为视图的Model实现起来比类似QFileSystemModel等便利化专用化的Model要稍微复杂,其复杂主要是数据初始化方面。具体实现步骤如下:

  1. 创建Model对象
    可以使用QStandardItemModel(parent: QObject = None)、QStandardItemModel(int rowCount, int columnCount, parent: QObject = None)来创建Model对象。

  2. 初始化数据
    初始化数据时,需要每个数据创建一个QStandardItem或其派生类的对象,并将其加入到Model中去。QStandardItem类有四个构造方法QStandardItem()、QStandardItem(str text)、QStandardItem(QIcon icon, str text)、QStandardItem(int rows, int columns = 1),分别用于创建单个空项、一个带数据的项、一个带图标和数据的项、多个空项,对于空项还需要使用setText(QVariant value, int role = Qt.UserRole + 1)等方法设置项存储的数据。

  3. 使用视图的setModel(model)方法将model和view建立连接

4.3、 一个完整的初始化方法代码及运行截图

    def initStandItemModel(self):
        self.model = QStandardItemModel()
        strList = ["item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10"]
        row = 0
        for itemStr in strList:
            item = StandardItem(itemStr)
            self.model.setItem(row, 0, item)
            row += 1
        self.listView.setModel(self.model)

运行截图:
ここに画像を挿入説明

五、QListView与多列Model及使用QListView的modelColumn属性

5.1、概述

QListView的modelColumn属性用于控制视图中展现model中哪一列数据,缺省值为0,即展现第一列数据。

可以通过modelColumn()、setModelColumn(int column)来访问和设置该属性。但Qt Designer中该属性值只能为0,无法设置为非0,这是因为QListView只显示一列数据,一般情况下如果使用的Model没有多列数据的话,是无需设置modelColumn属性,但并不是不能使用多列数据的Model。如上面第三部分使用QFileSystemModel与QListView配合使用。

5.2、使用多列模式初始化

下面是一个使用QStandardItemModel创建的一个6行5列的Model与QListView配合使用的初始化代码:

    def initMultiColumnModel(self):
        self.model = QStandardItemModel()
        for row in range(6):
            for col in range(5):
                item = StandardItem("row: {row},col: {col}".format(row=row + 1, col=col + 1))
        self.listView.setModel(self.model)

如使用QFileSystemModel来测试,发现可以通过setModelColumn来调整显示的数据内容,然后又改成了QStandardItemModel,使用model的setItem方法来设置多列数据,也可以使用setModelColumn来调整显示数据。

5.3、多列模式动态调整显示数据列

多列模式的Model初始化后显示的是第一列数据,如果要调整显示其他列的数据,可以通过setModelColumn来调整显示列。

六、支持列表中展示图标的两种方法

在视图中的项不但可以展示文字,也可以展示图标和复选框,同时可以指定项是否可以拖拽、选择、编辑。有两种方法支持在项中展示图标。

6.1、使用QStandardItem(QIcon icon, str text)创建项

下面的代码支持将指定目录的图象文件的文件名和图象在视图中展示:

    def initIconModel(self):
        self.model = QStandardItemModel()

        ICon1 = QStandardItem(QIcon(r"F:\学习\python\资源\图像文件\add.png"),'add.png')
        ICon2 = QStandardItem(QIcon(r"F:\学习\python\资源\图像文件\application_windows_add.png"), 'application_windows_add.png')
        ICon3 = QStandardItem(QIcon(r"F:\学习\python\资源\图像文件\save.png"), 'save.png')
        ICon4 = QStandardItem(QIcon(r"F:\学习\python\资源\图像文件\search.png"), 'search.png')
        ICon5 = QStandardItem(QIcon(r"F:\学习\python\资源\图像文件\stop.gif"), 'stop.gif')

        self.model.appendRow(ICon1)
        self.model.appendRow(ICon2)
        self.model.appendRow(ICon3)
        self.model.appendRow(ICon4)
        self.model.appendRow(ICon5)
        self.listView.setModel(self.model)

运行后的界面初始化截图如下:
ここに画像を挿入説明

6.2、使用QStandardItem()创建空项后通过setData指定图标文件为Qt.DecorationRole角色的数据

使用项的setData( QtCore.QVariant(icon), Qt.DecorationRole)方法,对应数据角色使用 Qt.DecorationRole。示例代码:

    def initIconModel(self):
        self.model = QStandardItemModel()
        ICon1 = QStandardItem('add.png')
        ICon1.setData(QtCore.QVariant(QIcon(r"F:\学习\python\资源\图像文件\add.png")),Qt.DecorationRole)
        ICon2 = QStandardItem('save.png')
        ICon2.setData(QtCore.QVariant(QIcon(r"F:\学习\python\资源\图像文件\save.png") ),Qt.DecorationRole)
        self.model.appendRow(ICon1)
        self.model.appendRow(ICon2)
        self.listView.setModel(self.model)

运行截图:
ここに画像を挿入説明
其实还有个类似的方法,就是使用model的setData( QModelIndex,QtCore.QVariant(icon), Qt.DecorationRole)方法,当选择操作时要更改图标文件可以使用这种方法。只要在方法中获取到modelIndex就可以调用该方法。

七、支持获取变更数据的方法

在QListView视图中数据如果发生变化,可以通过QStandardItemModel的信号itemChanged连接一个自定义槽函数来获取变动的数据。
1、定义一个槽函数itemChanged

 def itemChanged(self,item):
        print(f"itemChanged,row={item.row()},column={item.column()}")

2、在构造方法中建立信号和槽的连接

self.model.itemChanged[QStandardItem ].connect(self.itemChanged)

这样只要触发了项的编辑就会发出该信号从而知道变动的数据项。

八、小结

本节通过案例详细介绍了QListView/Model编程的几个要点,包括QListView与不同model的配合步骤、多列Model中数据展示列的控制、给展示数据加上图标、获取变更数据项的方法等内容。

后记

另外老猿关于PyQt的付费专栏《使用PyQt开发图形界面Python应用》只需要9.9元,该部分与第十五章的内容基本对应,但同样内容在付费专栏上总体来说更详细、案例更多。本节内容在付费专栏的《第十八章、QListView/Model开发》。如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

最后感谢各位支持,你们的支持是我持续学习和更新的动力!

老猿Python,跟老猿学Python!

公開された581元の記事 ウォンの賞賛3398 ビュー30万+

おすすめ

転載: blog.csdn.net/LaoYuanPython/article/details/104071932