最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyQt6/PySide6中QTreeView類的實現(xiàn)

 更新時間:2025年04月27日 11:14:37   作者:燃燈工作室  
QTreeView是PyQt6或PySide6庫中用于顯示分層數(shù)據(jù)的控件,本文主要介紹了PyQt6/PySide6中QTreeView類的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下

QTreeView 是 PyQt6 或 PySide6 庫中用于顯示分層數(shù)據(jù)的控件。它適用于展示樹形結(jié)構(gòu)的數(shù)據(jù),如文件系統(tǒng)、組織結(jié)構(gòu)等。QTreeView 也是基于模型-視圖架構(gòu)的,通常與 QAbstractItemModel 的子類(如 QStandardItemModel 或自定義模型)一起使用。下面我將詳細(xì)介紹 QTreeView 的主要特性及其使用方法。

1. 基本概念

  • 樹形視圖:用于顯示分層數(shù)據(jù)的控件。
  • 模型-視圖架構(gòu)QTreeView 使用模型-視圖架構(gòu),其中 QTreeView 是視圖部分,負(fù)責(zé)顯示數(shù)據(jù);而模型(如 QStandardItemModel)則負(fù)責(zé)管理數(shù)據(jù)。
  • 節(jié)點:樹形結(jié)構(gòu)中的基本單位,每個節(jié)點可以有子節(jié)點。
  • 根節(jié)點:樹形結(jié)構(gòu)的最頂層節(jié)點。
  • 展開/折疊:控制節(jié)點的顯示狀態(tài),展開時顯示其子節(jié)點,折疊時隱藏其子節(jié)點。
  • 選擇模式:控制用戶如何選擇節(jié)點。
  • 編輯模式:允許用戶直接在樹形視圖中編輯數(shù)據(jù)。

2. 創(chuàng)建 QTreeView 實例

要使用 QTreeView,首先需要導(dǎo)入相應(yīng)的庫:

from PyQt6.QtWidgets import QApplication, QTreeView, QVBoxLayout, QWidget, QPushButton
from PyQt6.QtGui import QStandardItemModel, QStandardItem
# 或者
from PySide6.QtWidgets import QApplication, QTreeView, QVBoxLayout, QWidget, QPushButton
from PySide6.QtGui import QStandardItemModel, QStandardItem

接著創(chuàng)建一個窗口,并在其中添加 QTreeView 控件:

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("我的應(yīng)用程序")
        self.setGeometry(100, 100, 800, 600)
      
        # 初始化UI
        self.initUI()
  
    def initUI(self):
        layout = QVBoxLayout()
      
        # 創(chuàng)建樹形視圖
        self.tree_view = QTreeView(self)
      
        # 創(chuàng)建模型
        self.model = QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['名稱', '類型'])
      
        # 添加數(shù)據(jù)
        root_item = self.model.invisibleRootItem()
        item1 = QStandardItem('項目1')
        item1.appendRow([QStandardItem('子項目1.1'), QStandardItem('類型A')])
        item1.appendRow([QStandardItem('子項目1.2'), QStandardItem('類型B')])
        root_item.appendRow(item1)
      
        item2 = QStandardItem('項目2')
        item2.appendRow([QStandardItem('子項目2.1'), QStandardItem('類型C')])
        item2.appendRow([QStandardItem('子項目2.2'), QStandardItem('類型D')])
        root_item.appendRow(item2)
      
        # 設(shè)置模型到視圖
        self.tree_view.setModel(self.model)
      
        # 添加按鈕
        button = QPushButton("打印選中項", self)
        button.clicked.connect(self.print_selection)
      
        # 添加到布局
        layout.addWidget(self.tree_view)
        layout.addWidget(button)
      
        self.setLayout(layout)
  
    def print_selection(self):
        selected_indices = self.tree_view.selectedIndexes()
        for index in selected_indices:
            row = index.row()
            column = index.column()
            value = index.data()
            print(f"行: {row}, 列: {column}, 值: {value}")

if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

3. QTreeView 的常用屬性和方法

屬性

  • model:獲取或設(shè)置當(dāng)前使用的模型。
  • selectionModel:獲取或設(shè)置當(dāng)前的選擇模型。
  • currentIndex:獲取或設(shè)置當(dāng)前選中的索引。
  • header:獲取表頭。
  • rootIndex:獲取或設(shè)置根索引。
  • alternatingRowColors:獲取或設(shè)置是否交替行顏色。
  • showGrid:獲取或設(shè)置是否顯示網(wǎng)格線。
  • gridStyle:獲取或設(shè)置網(wǎng)格線樣式。
  • wordWrap:獲取或設(shè)置是否啟用自動換行。
  • resizeMode:獲取或設(shè)置調(diào)整大小模式。
  • selectionBehavior:獲取或設(shè)置選擇行為(選擇單元格、行或列)。
  • selectionMode:獲取或設(shè)置選擇模式(單選或多選)。
  • editTriggers:獲取或設(shè)置編輯觸發(fā)器。
  • toolTip:獲取或設(shè)置工具提示文本。
  • statusTip:獲取或設(shè)置狀態(tài)欄提示文本。

方法

  • setModel(QAbstractItemModel):設(shè)置當(dāng)前使用的模型。
  • model() -> QAbstractItemModel:獲取當(dāng)前使用的模型。
  • setSelectionModel(QItemSelectionModel):設(shè)置當(dāng)前的選擇模型。
  • selectionModel() -> QItemSelectionModel:獲取當(dāng)前的選擇模型。
  • setCurrentIndex(QModelIndex):設(shè)置當(dāng)前選中的索引。
  • currentIndex() -> QModelIndex:獲取當(dāng)前選中的索引。
  • header() -> QHeaderView:獲取表頭。
  • setRootIndex(QModelIndex):設(shè)置根索引。
  • rootIndex() -> QModelIndex:獲取根索引。
  • setAlternatingRowColors(bool):設(shè)置是否交替行顏色。
  • alternatingRowColors() -> bool:判斷是否交替行顏色。
  • setShowGrid(bool):設(shè)置是否顯示網(wǎng)格線。
  • showGrid() -> bool:判斷是否顯示網(wǎng)格線。
  • setGridStyle(Qt.PenStyle):設(shè)置網(wǎng)格線樣式。
  • gridStyle() -> Qt.PenStyle:獲取網(wǎng)格線樣式。
  • setWordWrap(bool):設(shè)置是否啟用自動換行。
  • wordWrap() -> bool:判斷是否啟用自動換行。
  • setResizeMode(QHeaderView.ResizeMode):設(shè)置調(diào)整大小模式。
  • resizeMode() -> QHeaderView.ResizeMode:獲取調(diào)整大小模式。
  • setSelectionBehavior(QAbstractItemView.SelectionBehavior):設(shè)置選擇行為。
  • selectionBehavior() -> QAbstractItemView.SelectionBehavior:獲取選擇行為。
  • setSelectionMode(QAbstractItemView.SelectionMode):設(shè)置選擇模式。
  • selectionMode() -> QAbstractItemView.SelectionMode:獲取選擇模式。
  • setEditTriggers(QAbstractItemView.EditTrigger):設(shè)置編輯觸發(fā)器。
  • editTriggers() -> QAbstractItemView.EditTrigger:獲取編輯觸發(fā)器。
  • setToolTip(str):設(shè)置工具提示文本。
  • toolTip() -> str:獲取工具提示文本。
  • setStatusTip(str):設(shè)置狀態(tài)欄提示文本。
  • statusTip() -> str:獲取狀態(tài)欄提示文本。
  • expand(QModelIndex):展開指定索引的節(jié)點。
  • collapse(QModelIndex):折疊指定索引的節(jié)點。
  • expandAll():展開所有節(jié)點。
  • collapseAll():折疊所有節(jié)點。
  • selectRow(int):選擇指定行。
  • selectColumn(int):選擇指定列。
  • clearSelection():清除選擇。
  • selectAll():全選。
  • selectedIndexes() -> List[QModelIndex]:獲取所有選中的索引。
  • resizeColumnToContents(int column):根據(jù)內(nèi)容調(diào)整指定列寬。
  • resizeRowToContents(int row):根據(jù)內(nèi)容調(diào)整指定行高。
  • hideColumn(int column):隱藏指定列。
  • showColumn(int column):顯示指定列。
  • hideRow(int row):隱藏指定行。
  • showRow(int row):顯示指定行。

4. 詳細(xì)示例

設(shè)置模型

# 創(chuàng)建模型
model = QStandardItemModel()
model.setHorizontalHeaderLabels(['名稱', '類型'])

# 添加數(shù)據(jù)
root_item = model.invisibleRootItem()
item1 = QStandardItem('項目1')
item1.appendRow([QStandardItem('子項目1.1'), QStandardItem('類型A')])
item1.appendRow([QStandardItem('子項目1.2'), QStandardItem('類型B')])
root_item.appendRow(item1)

item2 = QStandardItem('項目2')
item2.appendRow([QStandardItem('子項目2.1'), QStandardItem('類型C')])
item2.appendRow([QStandardItem('子項目2.2'), QStandardItem('類型D')])
root_item.appendRow(item2)

# 設(shè)置模型到視圖
tree_view.setModel(model)

獲取當(dāng)前選中的索引

def print_selection():
    selected_indices = tree_view.selectedIndexes()
    for index in selected_indices:
        row = index.row()
        column = index.column()
        value = index.data()
        print(f"行: {row}, 列: {column}, 值: {value}")

展開和折疊節(jié)點

# 展開指定索引的節(jié)點
tree_view.expand(tree_view.model().index(0, 0))

# 折疊指定索引的節(jié)點
tree_view.collapse(tree_view.model().index(0, 0))

# 展開所有節(jié)點
tree_view.expandAll()

# 折疊所有節(jié)點
tree_view.collapseAll()

選擇行或列

# 選擇第1行
tree_view.selectRow(1)

# 選擇第2列
tree_view.selectColumn(2)

清除選擇

tree_view.clearSelection()

全選

tree_view.selectAll()

根據(jù)內(nèi)容調(diào)整列寬和行高

# 根據(jù)內(nèi)容調(diào)整第1列的寬度
tree_view.resizeColumnToContents(1)

# 根據(jù)內(nèi)容調(diào)整第1行的高度
tree_view.resizeRowToContents(1)

隱藏和顯示列或行

# 隱藏第2列
tree_view.hideColumn(2)

# 顯示第2列
tree_view.showColumn(2)

# 隱藏第3行
tree_view.hideRow(3)

# 顯示第3行
tree_view.showRow(3)

啟用或禁用排序

tree_view.setSortingEnabled(True)  # 啟用排序
tree_view.setSortingEnabled(False)  # 禁用排序

設(shè)置選擇行為

tree_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)  # 選擇整行
tree_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectColumns)  # 選擇整列
tree_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectItems)  # 選擇單元格

設(shè)置選擇模式

tree_view.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)  # 單選
tree_view.setSelectionMode(QAbstractItemView.SelectionMode.ContiguousSelection)  # 連續(xù)多選
tree_view.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)  # 擴展多選
tree_view.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection)  # 多選

設(shè)置編輯觸發(fā)器

tree_view.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked | QAbstractItemView.EditTrigger.SelectedClicked)  # 雙擊或選中后點擊編輯

設(shè)置工具提示和狀態(tài)欄提示

tree_view.setToolTip("這是一個樹形視圖")
tree_view.setStatusTip("查看和編輯數(shù)據(jù)")

5. 信號與槽機制

QTreeView 支持多種信號,這些信號可以在用戶交互時發(fā)射。常見的信號包括 clicked、doubleClickedpressed、activated 和 selectionChanged。你可以通過連接這些信號到槽函數(shù)來處理用戶的輸入事件。

def on_clicked(index):
    row = index.row()
    column = index.column()
    value = index.data()
    print(f"點擊: 行: {row}, 列: {column}, 值: {value}")

def on_double_clicked(index):
    row = index.row()
    column = index.column()
    value = index.data()
    print(f"雙擊: 行: {row}, 列: {column}, 值: {value}")

def on_pressed(index):
    row = index.row()
    column = index.column()
    value = index.data()
    print(f"按下: 行: {row}, 列: {column}, 值: {value}")

def on_activated(index):
    row = index.row()
    column = index.column()
    value = index.data()
    print(f"激活: 行: {row}, 列: {column}, 值: {value}")

def on_selection_changed(selected, deselected):
    print("選擇發(fā)生變化")

tree_view.clicked.connect(on_clicked)
tree_view.doubleClicked.connect(on_double_clicked)
tree_view.pressed.connect(on_pressed)
tree_view.activated.connect(on_activated)
tree_view.selectionModel().selectionChanged.connect(on_selection_changed)

6. 自定義樣式

除了使用內(nèi)置的樣式設(shè)置外,你還可以通過樣式表(QSS)來自定義 QTreeView 的外觀。樣式表類似于CSS,提供了強大的樣式控制能力。

tree_view.setStyleSheet("""
    QTreeView {
        background-color: #f0f0f0;
        alternate-background-color: #e0e0e0;
        selection-background-color: #0078d7;
        selection-color: white;
        gridline-color: #cccccc;
        border: 1px solid #cccccc;
    }
    QTreeView::item {
        padding: 5px;
    }
    QTreeView::item:selected {
        background-color: #0078d7;
        color: white;
    }
    QTreeView::item:hover {
        background-color: #d0d0d0;
    }
    QTreeView::item:focus {
        outline: none;
    }
    QHeaderView::section {
        background-color: #e0e0e0;
        border: 1px solid #cccccc;
        padding: 5px;
    }
    QHeaderView::section:checked {
        background-color: #0078d7;
        color: white;
    }
""")

7. 動態(tài)更新和控制

你可以動態(tài)地更新 QTreeView 的內(nèi)容,或者根據(jù)某些條件控制其行為。例如,在定時器或其他事件觸發(fā)時更新樹形視圖的數(shù)據(jù)。

import time
from PyQt6.QtCore import QTimer

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("我的應(yīng)用程序")
        self.setGeometry(100, 100, 800, 600)
      
        # 初始化UI
        self.initUI()
      
        # 創(chuàng)建定時器
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_tree_view)
        self.timer.start(5000)  # 每5秒觸發(fā)一次
  
    def initUI(self):
        layout = QVBoxLayout()
      
        # 創(chuàng)建樹形視圖
        self.tree_view = QTreeView(self)
      
        # 創(chuàng)建模型
        self.model = QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['名稱', '類型'])
      
        # 添加數(shù)據(jù)
        root_item = self.model.invisibleRootItem()
        item1 = QStandardItem('項目1')
        item1.appendRow([QStandardItem('子項目1.1'), QStandardItem('類型A')])
        item1.appendRow([QStandardItem('子項目1.2'), QStandardItem('類型B')])
        root_item.appendRow(item1)
      
        item2 = QStandardItem('項目2')
        item2.appendRow([QStandardItem('子項目2.1'), QStandardItem('類型C')])
        item2.appendRow([QStandardItem('子項目2.2'), QStandardItem('類型D')])
        root_item.appendRow(item2)
      
        # 設(shè)置模型到視圖
        self.tree_view.setModel(self.model)
      
        # 添加到布局
        layout.addWidget(self.tree_view)
      
        self.setLayout(layout)
  
    def update_tree_view(self):
        # 更新模型數(shù)據(jù)
        self.model.clear()
        self.model.setHorizontalHeaderLabels(['名稱', '類型'])
      
        # 添加新的數(shù)據(jù)
        root_item = self.model.invisibleRootItem()
        item1 = QStandardItem('項目1 (更新)')
        item1.appendRow([QStandardItem('子項目1.1 (更新)'), QStandardItem('類型A')])
        item1.appendRow([QStandardItem('子項目1.2 (更新)'), QStandardItem('類型B')])
        root_item.appendRow(item1)
      
        item2 = QStandardItem('項目2 (更新)')
        item2.appendRow([QStandardItem('子項目2.1 (更新)'), QStandardItem('類型C')])
        item2.appendRow([QStandardItem('子項目2.2 (更新)'), QStandardItem('類型D')])
        root_item.appendRow(item2)

if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

總結(jié)

QTreeView 是 PyQt6/PySide6 中非常強大且靈活的控件,適用于各種需要展示和編輯樹形結(jié)構(gòu)數(shù)據(jù)的場景。通過設(shè)置不同的屬性和使用樣式表,你可以創(chuàng)建出豐富多樣的樹形視圖樣式。同時,通過信號與槽機制,你可以方便地處理用戶的輸入事件。希望以上內(nèi)容能幫助你更好地理解和運用 QTreeView,并能夠根據(jù)具體需求創(chuàng)建出功能豐富且用戶友好的樹形視圖控件。

到此這篇關(guān)于PyQt6/PySide6中QTreeView類的實現(xiàn)的文章就介紹到這了,更多相關(guān)PyQt6/PySide6 QTreeView類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python socket C/S結(jié)構(gòu)的聊天室應(yīng)用實現(xiàn)

    Python socket C/S結(jié)構(gòu)的聊天室應(yīng)用實現(xiàn)

    這篇文章主要介紹了Python socket C/S結(jié)構(gòu)的聊天室應(yīng)用實現(xiàn),需要的朋友可以參考下
    2014-11-11
  • pyspark對Mysql數(shù)據(jù)庫進(jìn)行讀寫的實現(xiàn)

    pyspark對Mysql數(shù)據(jù)庫進(jìn)行讀寫的實現(xiàn)

    這篇文章主要介紹了pyspark對Mysql數(shù)據(jù)庫進(jìn)行讀寫的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • pd.to_datetime中時間object轉(zhuǎn)換datetime實例

    pd.to_datetime中時間object轉(zhuǎn)換datetime實例

    本文主要介紹了pd.to_datetime中時間object轉(zhuǎn)換datetime實例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • TensorFlow Autodiff自動微分詳解

    TensorFlow Autodiff自動微分詳解

    這篇文章主要介紹了TensorFlow Autodiff自動微分詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python語言生成水仙花數(shù)代碼示例

    Python語言生成水仙花數(shù)代碼示例

    這篇文章主要介紹了Python語言生成水仙花數(shù)代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • pycharm new project變成灰色的解決方法

    pycharm new project變成灰色的解決方法

    今天小編就為大家分享一篇pycharm new project變成灰色的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 在Python中使用mongoengine操作MongoDB教程

    在Python中使用mongoengine操作MongoDB教程

    這篇文章主要介紹了在Python中使用mongoengine操作MongoDB教程,包括在Django下的一些使用技巧,需要的朋友可以參考下
    2015-04-04
  • Python接入MySQL實現(xiàn)增刪改查的實戰(zhàn)記錄

    Python接入MySQL實現(xiàn)增刪改查的實戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于Python接入MySQL實現(xiàn)增刪改查的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Scrapy框架中的Pipeline使用詳解

    Scrapy框架中的Pipeline使用詳解

    這篇文章主要介紹了Scrapy框架中的Pipeline使用詳解,Scrapy 中的 Pipeline 為我們提供了處理數(shù)據(jù)的功能,在實際開發(fā)中我們經(jīng)常使用它來清洗/驗證數(shù)據(jù)、去重和數(shù)據(jù)保存,需要的朋友可以參考下
    2023-10-10
  • tensorflow實現(xiàn)打印ckpt模型保存下的變量名稱及變量值

    tensorflow實現(xiàn)打印ckpt模型保存下的變量名稱及變量值

    今天小編就為大家分享一篇tensorflow實現(xiàn)打印ckpt模型保存下的變量名稱及變量值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01

最新評論

信丰县| 登封市| 偃师市| 固镇县| 繁昌县| 凤庆县| 长白| 义马市| 大兴区| 鱼台县| 呼和浩特市| 富顺县| 红原县| 云南省| 韩城市| 东乡族自治县| 社会| 大连市| 农安县| 巴彦县| 双鸭山市| 塔城市| 耿马| 教育| 溧阳市| 望奎县| 泸水县| 莱州市| 泌阳县| 多伦县| 油尖旺区| 略阳县| 清丰县| 通河县| 莱西市| 万宁市| 巴彦淖尔市| 嘉兴市| 视频| 开原市| 长宁区|