PyQt6/PySide6中QTreeView類的實(shí)現(xiàn)
QTreeView 是 PyQt6 或 PySide6 庫(kù)中用于顯示分層數(shù)據(jù)的控件。它適用于展示樹(shù)形結(jié)構(gòu)的數(shù)據(jù),如文件系統(tǒng)、組織結(jié)構(gòu)等。QTreeView 也是基于模型-視圖架構(gòu)的,通常與 QAbstractItemModel 的子類(如 QStandardItemModel 或自定義模型)一起使用。下面我將詳細(xì)介紹 QTreeView 的主要特性及其使用方法。
1. 基本概念
- 樹(shù)形視圖:用于顯示分層數(shù)據(jù)的控件。
- 模型-視圖架構(gòu):
QTreeView使用模型-視圖架構(gòu),其中QTreeView是視圖部分,負(fù)責(zé)顯示數(shù)據(jù);而模型(如QStandardItemModel)則負(fù)責(zé)管理數(shù)據(jù)。 - 節(jié)點(diǎn):樹(shù)形結(jié)構(gòu)中的基本單位,每個(gè)節(jié)點(diǎn)可以有子節(jié)點(diǎn)。
- 根節(jié)點(diǎn):樹(shù)形結(jié)構(gòu)的最頂層節(jié)點(diǎn)。
- 展開(kāi)/折疊:控制節(jié)點(diǎn)的顯示狀態(tài),展開(kāi)時(shí)顯示其子節(jié)點(diǎn),折疊時(shí)隱藏其子節(jié)點(diǎn)。
- 選擇模式:控制用戶如何選擇節(jié)點(diǎn)。
- 編輯模式:允許用戶直接在樹(shù)形視圖中編輯數(shù)據(jù)。
2. 創(chuàng)建 QTreeView 實(shí)例
要使用 QTreeView,首先需要導(dǎo)入相應(yīng)的庫(kù):
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)建一個(gè)窗口,并在其中添加 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)建樹(shù)形視圖
self.tree_view = QTreeView(self)
# 創(chuàng)建模型
self.model = QStandardItemModel()
self.model.setHorizontalHeaderLabels(['名稱', '類型'])
# 添加數(shù)據(jù)
root_item = self.model.invisibleRootItem()
item1 = QStandardItem('項(xiàng)目1')
item1.appendRow([QStandardItem('子項(xiàng)目1.1'), QStandardItem('類型A')])
item1.appendRow([QStandardItem('子項(xiàng)目1.2'), QStandardItem('類型B')])
root_item.appendRow(item1)
item2 = QStandardItem('項(xiàng)目2')
item2.appendRow([QStandardItem('子項(xiàng)目2.1'), QStandardItem('類型C')])
item2.appendRow([QStandardItem('子項(xiàng)目2.2'), QStandardItem('類型D')])
root_item.appendRow(item2)
# 設(shè)置模型到視圖
self.tree_view.setModel(self.model)
# 添加按鈕
button = QPushButton("打印選中項(xiàng)", 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è)置是否啟用自動(dòng)換行。
- 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è)置是否啟用自動(dòng)換行。
- wordWrap() -> bool:判斷是否啟用自動(dòng)換行。
- 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):展開(kāi)指定索引的節(jié)點(diǎn)。
- collapse(QModelIndex):折疊指定索引的節(jié)點(diǎn)。
- expandAll():展開(kāi)所有節(jié)點(diǎn)。
- collapseAll():折疊所有節(jié)點(diǎn)。
- 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('項(xiàng)目1')
item1.appendRow([QStandardItem('子項(xiàng)目1.1'), QStandardItem('類型A')])
item1.appendRow([QStandardItem('子項(xiàng)目1.2'), QStandardItem('類型B')])
root_item.appendRow(item1)
item2 = QStandardItem('項(xiàng)目2')
item2.appendRow([QStandardItem('子項(xiàng)目2.1'), QStandardItem('類型C')])
item2.appendRow([QStandardItem('子項(xiàng)目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}")
展開(kāi)和折疊節(jié)點(diǎn)
# 展開(kāi)指定索引的節(jié)點(diǎn) tree_view.expand(tree_view.model().index(0, 0)) # 折疊指定索引的節(jié)點(diǎn) tree_view.collapse(tree_view.model().index(0, 0)) # 展開(kāi)所有節(jié)點(diǎn) tree_view.expandAll() # 折疊所有節(jié)點(diǎn) 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) # 擴(kuò)展多選 tree_view.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection) # 多選
設(shè)置編輯觸發(fā)器
tree_view.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked | QAbstractItemView.EditTrigger.SelectedClicked) # 雙擊或選中后點(diǎn)擊編輯
設(shè)置工具提示和狀態(tài)欄提示
tree_view.setToolTip("這是一個(gè)樹(shù)形視圖")
tree_view.setStatusTip("查看和編輯數(shù)據(jù)")
5. 信號(hào)與槽機(jī)制
QTreeView 支持多種信號(hào),這些信號(hào)可以在用戶交互時(shí)發(fā)射。常見(jiàn)的信號(hào)包括 clicked、doubleClicked、pressed、activated 和 selectionChanged。你可以通過(guò)連接這些信號(hào)到槽函數(shù)來(lái)處理用戶的輸入事件。
def on_clicked(index):
row = index.row()
column = index.column()
value = index.data()
print(f"點(diǎn)擊: 行: {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è)置外,你還可以通過(guò)樣式表(QSS)來(lái)自定義 QTreeView 的外觀。樣式表類似于CSS,提供了強(qiáng)大的樣式控制能力。
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. 動(dòng)態(tài)更新和控制
你可以動(dòng)態(tài)地更新 QTreeView 的內(nèi)容,或者根據(jù)某些條件控制其行為。例如,在定時(shí)器或其他事件觸發(fā)時(shí)更新樹(shù)形視圖的數(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)建定時(shí)器
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)建樹(shù)形視圖
self.tree_view = QTreeView(self)
# 創(chuàng)建模型
self.model = QStandardItemModel()
self.model.setHorizontalHeaderLabels(['名稱', '類型'])
# 添加數(shù)據(jù)
root_item = self.model.invisibleRootItem()
item1 = QStandardItem('項(xiàng)目1')
item1.appendRow([QStandardItem('子項(xiàng)目1.1'), QStandardItem('類型A')])
item1.appendRow([QStandardItem('子項(xiàng)目1.2'), QStandardItem('類型B')])
root_item.appendRow(item1)
item2 = QStandardItem('項(xiàng)目2')
item2.appendRow([QStandardItem('子項(xiàng)目2.1'), QStandardItem('類型C')])
item2.appendRow([QStandardItem('子項(xiàng)目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('項(xiàng)目1 (更新)')
item1.appendRow([QStandardItem('子項(xiàng)目1.1 (更新)'), QStandardItem('類型A')])
item1.appendRow([QStandardItem('子項(xiàng)目1.2 (更新)'), QStandardItem('類型B')])
root_item.appendRow(item1)
item2 = QStandardItem('項(xiàng)目2 (更新)')
item2.appendRow([QStandardItem('子項(xiàng)目2.1 (更新)'), QStandardItem('類型C')])
item2.appendRow([QStandardItem('子項(xiàng)目2.2 (更新)'), QStandardItem('類型D')])
root_item.appendRow(item2)
if __name__ == "__main__":
app = QApplication([])
window = MyWindow()
window.show()
app.exec()
總結(jié)
QTreeView 是 PyQt6/PySide6 中非常強(qiáng)大且靈活的控件,適用于各種需要展示和編輯樹(shù)形結(jié)構(gòu)數(shù)據(jù)的場(chǎng)景。通過(guò)設(shè)置不同的屬性和使用樣式表,你可以創(chuàng)建出豐富多樣的樹(shù)形視圖樣式。同時(shí),通過(guò)信號(hào)與槽機(jī)制,你可以方便地處理用戶的輸入事件。希望以上內(nèi)容能幫助你更好地理解和運(yùn)用 QTreeView,并能夠根據(jù)具體需求創(chuàng)建出功能豐富且用戶友好的樹(shù)形視圖控件。
到此這篇關(guān)于PyQt6/PySide6中QTreeView類的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)PyQt6/PySide6 QTreeView類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python對(duì)網(wǎng)易云歌單數(shù)據(jù)分析及可視化
這篇文章主要介紹了使用Python對(duì)網(wǎng)易云歌單數(shù)據(jù)分析及可視化,本項(xiàng)目以數(shù)據(jù)采集、處理、分析及數(shù)據(jù)可視化為項(xiàng)目流程,需要的朋友可以參考下2023-03-03
mac使用python識(shí)別圖形驗(yàn)證碼功能
這篇文章主要介紹了mac使用python識(shí)別圖形驗(yàn)證碼功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
有關(guān)pycharm登錄github時(shí)有的時(shí)候會(huì)報(bào)錯(cuò)connection reset的問(wèn)題
這篇文章主要介紹了有關(guān)pycharm登錄github時(shí)有的時(shí)候會(huì)報(bào)錯(cuò)connection reset的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
selenium+python實(shí)現(xiàn)自動(dòng)化登錄的方法
這篇文章主要介紹了selenium+python實(shí)現(xiàn)自動(dòng)化登錄的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
深入理解Python中的*args和**kwargs參數(shù)(示例代碼)
*args和**kwargs是Python函數(shù)編程中極其有用的特性,它們?yōu)楹瘮?shù)參數(shù)的處理提供了極大的靈活性和強(qiáng)大的功能,這篇文章主要介紹了Python中的*args和**kwargs參數(shù),需要的朋友可以參考下2024-06-06

