生活随笔
收集整理的這篇文章主要介紹了
pyqt讲解7:表格和树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
表格和樹的作用就是在一個控件中有規律得呈現更多的數據,因此 PyQt5 提供了表格結構和樹形結構的控件類。
一.表格
1、QTableView
QTableView 用于將數據(數組、列表)以表格的形式呈現在界面中;QTableView 類中可以使用自定義數據模型來顯示內容,通過 setModel 綁定數據源。
QTableWidget 繼承自 QTableView,區別在于 QTableView 可以使用自定義數據模型來顯示內容,而 QTableWidget 只能使用標準的數據模型,并且單元格數據是人通過 QTableWidgetItem 對象來實現的。
QTable 控件可以綁定一個模型數據來更新控件上的內容,可用的模式如下表:
名稱 含義
QStringListModel :存儲一組字符串
QStandardItemModel :存儲任意層次結構的數據
QDirModel :對文件系統進行封裝
QSqlQueryModel ;對 SQL 的查詢結果集進行封裝
QSqlTableModel :對 SQL 中的表格進行封裝
QSqlRelationTableModel :對帶有 foreign key 的 SQL 表格進行封裝
QSortFilterProxyModel :對模型中的數據進行排序或過濾
rom PyQt5
.QtWidgets
import *
from PyQt5
.QtGui
import *
from PyQt5
.QtCore
import *
import sys
class Table(QWidget
):def __init__(self
, arg
=None):super(Table
, self
).__init__
(arg
)self
.setWindowTitle
("QTableView表格視圖控件的例子") self
.resize
(500,300);self
.model
=QStandardItemModel
(4,4);self
.model
.setHorizontalHeaderLabels
(['標題1','標題2','標題3','標題4'])for row
in range(4):for column
in range(4):item
= QStandardItem
("row %s, column %s"%(row
,column
))self
.model
.setItem
(row
, column
, item
)self
.tableView
=QTableView
()self
.tableView
.setModel
(self
.model
)dlgLayout
=QVBoxLayout
();dlgLayout
.addWidget
(self
.tableView
)self
.setLayout
(dlgLayout
)if __name__
== '__main__':app
= QApplication
(sys
.argv
) table
= Table
()table
.show
()sys
.exit
(app
.exec_
())
刪除當前選中的數據,有下面兩種方法:
indexs
= self
.tableView
.selectionModel
().selection
().indexes
()
if len(indexs
)>0:
index
= indexs
[0]
self
.model
.removeRows
(index
.row
(), 1)
index
= self
.tableView
.currentIndex
()
self
.model
.removeRow
(index
.row
())
2、QListView
QListView 類用于展示數據,子類是 QListWidget。 QListView 是基于模型的。
QListWidget 是 QListView 的升級版,此類已經建立了數據存儲模型(QListWidgetItem),直接調用 addItem() 函數添加條目。
QListView 常用方法如下表
方法描述
| setModel() | 用來設置 View 所關聯的 Model,可以使用 Python 原生的 list 作為數據源 Model |
| selectedItem() | 選中 Model 中的條目 |
| isSelected() | 判斷 Model 中的條目是否被選中 |
常用信號
信號描述
| clicked | 當單擊某項時,觸發該信號 |
| doubleClicked | 當雙擊某項時,觸發該信號 |
from PyQt5
.QtWidgets
import QApplication
, QWidget
, QVBoxLayout
, QListView
, QMessageBox
from PyQt5
.QtCore
import QStringListModel
import sys
class ListViewDemo(QWidget
):def __init__(self
, parent
=None):super(ListViewDemo
, self
).__init__
(parent
)self
.setWindowTitle
("QListView 例子")self
.resize
(300, 270) layout
= QVBoxLayout
()listView
= QListView
() slm
= QStringListModel
();self
.qList
= ['Item 1','Item 2','Item 3','Item 4' ]slm
.setStringList
(self
.qList
)listView
.setModel
(slm
)listView
.clicked
.connect
(self
.clicked
) layout
.addWidget
( listView
)self
.setLayout
(layout
) def clicked(self
, qModelIndex
):QMessageBox
.information
(self
, "QListView", "你選擇了: "+ self
.qList
[qModelIndex
.row
()])if __name__
== "__main__": app
= QApplication
(sys
.argv
)win
= ListViewDemo
() win
.show
() sys
.exit
(app
.exec_
())
3、QListWidget
常用方法
方法描述
| addItem() | 在列表中添加QListWidgetItem對象或字符串 |
| addItems() | 添加列表中的每個條目 |
| insertItem() | 在指定地索引處插入條目 |
| clear() | 刪除列表的內容 |
| setCurrentItem() | 設置當前所選的條目 |
| sortItems() | 按升序重新排列條目 |
常用信號
方法描述
| currentItemChanged | 當列表中的條目發生改變時發射此信號 |
| itemClicked | 當點擊列表中的條目時發射此信號 |
import sys
from PyQt5
.QtCore
import *
from PyQt5
.QtGui
import *
from PyQt5
.QtWidgets
import *class ListWidget(QListWidget
):def clicked(self
,item
):QMessageBox
.information
(self
, "ListWidget", "你選擇了: "+item
.text
())if __name__
== '__main__':app
= QApplication
(sys
.argv
)listWidget
= ListWidget
()c
=['item5','item6']listWidget
.resize
(300,120) listWidget
.addItem
("Item 1");listWidget
.addItem
("Item 2");listWidget
.addItem
("Item 3");listWidget
.addItem
("Item 4");listWidget
.addItems
(c
)listWidget
.setWindowTitle
('QListwidget 例子')listWidget
.itemClicked
.connect
(listWidget
.clicked
)listWidget
.show
() sys
.exit
(app
.exec_
())
4、QTableWidget
常用方法
表格編輯類型的枚舉常量:
單元格內容對齊方式枚舉類型:
import sys
from PyQt5
.QtWidgets
import (QWidget
, QTableWidget
, QHBoxLayout
, QApplication
, QTableWidgetItem
, QAbstractItemView
)class Table(QWidget
):def __init__(self
):super().__init__
()self
.initUI
()def initUI(self
):self
.setWindowTitle
("QTableWidget 例子")self
.resize
(430,230);conLayout
= QHBoxLayout
()tableWidget
= QTableWidget
()tableWidget
.setRowCount
(4)tableWidget
.setColumnCount
(3)conLayout
.addWidget
(tableWidget
)tableWidget
.setHorizontalHeaderLabels
(['姓名','性別','體重(kg)']) newItem
= QTableWidgetItem
("張三") tableWidget
.setItem
(0, 0, newItem
) newItem
= QTableWidgetItem
("男") tableWidget
.setItem
(0, 1, newItem
) newItem
= QTableWidgetItem
("160") tableWidget
.setItem
(0, 2, newItem
) tableWidget
.verticalHeader
().setVisible
(False)self
.setLayout
(conLayout
)if __name__
== '__main__':app
= QApplication
(sys
.argv
)example
= Table
() example
.show
() sys
.exit
(app
.exec_
())
import sys
from PyQt5
.QtWidgets
import (QWidget
, QTableWidget
, QHBoxLayout
, QApplication
, QTableWidgetItem
, QHeaderView
)class Table(QWidget
):def __init__(self
):super().__init__
()self
.initUI
()def initUI(self
):self
.setWindowTitle
("QTableWidget demo")self
.resize
(500,300);conLayout
= QHBoxLayout
()tableWidget
= QTableWidget
()tableWidget
.setRowCount
(4)tableWidget
.setColumnCount
(3)conLayout
.addWidget
(tableWidget
)tableWidget
.setHorizontalHeaderLabels
(['姓名','性別','體重(kg)']) tableWidget
.horizontalHeader
().setSectionResizeMode
(QHeaderView
.Stretch
)newItem
= QTableWidgetItem
("張三") tableWidget
.setItem
(0, 0, newItem
) newItem
= QTableWidgetItem
("男") tableWidget
.setItem
(0, 1, newItem
) newItem
= QTableWidgetItem
("160") tableWidget
.setItem
(0, 2, newItem
) self
.setLayout
(conLayout
)if __name__
== '__main__':app
= QApplication
(sys
.argv
)example
= Table
() example
.show
() sys
.exit
(app
.exec_
())
'''【簡介】PyQT5中 單元格里面放控件 '''import sys
from PyQt5
.QtWidgets
import (QWidget
, QTableWidget
, QHBoxLayout
, QApplication
, QTableWidgetItem
, QAbstractItemView
,QComboBox
, QPushButton
)class Table(QWidget
):def __init__(self
):super().__init__
()self
.initUI
()def initUI(self
):self
.setWindowTitle
("QTableWidget 例子")self
.resize
(430,300);conLayout
= QHBoxLayout
()tableWidget
= QTableWidget
()tableWidget
.setRowCount
(4)tableWidget
.setColumnCount
(3)conLayout
.addWidget
(tableWidget
)tableWidget
.setHorizontalHeaderLabels
(['姓名','性別','體重(kg)']) newItem
= QTableWidgetItem
("張三") tableWidget
.setItem
(0, 0, newItem
) comBox
= QComboBox
()comBox
.addItem
("男")comBox
.addItem
("女")comBox
.setStyleSheet
("QComboBox{margin:3px};")tableWidget
.setCellWidget
(0,1,comBox
)searchBtn
= QPushButton
("修改") searchBtn
.setDown
( True )searchBtn
.setStyleSheet
("QPushButton{margin:3px};")tableWidget
.setCellWidget
(0, 2, searchBtn
) self
.setLayout
(conLayout
)if __name__
== '__main__':app
= QApplication
(sys
.argv
)example
= Table
() example
.show
() sys
.exit
(app
.exec_
())
'''【簡介】PyQT5的表格控件選中單元格'''import sys
from PyQt5
.QtWidgets
import *
from PyQt5
import QtCore
from PyQt5
.QtGui
import QColor
, QBrush
class Table(QWidget
):def __init__(self
):super().__init__
()self
.initUI
()def initUI(self
):self
.setWindowTitle
("QTableWidget 例子")self
.resize
(600,800);conLayout
= QHBoxLayout
()tableWidget
= QTableWidget
()tableWidget
.setRowCount
(30)tableWidget
.setColumnCount
(4)conLayout
.addWidget
(tableWidget
)for i
in range(30):for j
in range(4):itemContent
= '(%d,%d)'% (i
,j
) tableWidget
.setItem
(i
,j
, QTableWidgetItem
( itemContent
) )self
.setLayout
(conLayout
)text
= "(10,1)"items
= tableWidget
.findItems
(text
, QtCore
.Qt
.MatchExactly
) item
= items
[0]item
.setForeground
(QBrush
(QColor
(255, 0, 0))) row
= item
.row
() tableWidget
.verticalScrollBar
().setSliderPosition
(row
) if __name__
== '__main__':app
= QApplication
(sys
.argv
)example
= Table
() example
.show
() sys
.exit
(app
.exec_
())
二.樹QTreeWidget
QTreeWidget常用方法
方法描述
| setColumnWidth(int column,int width) | 將指定列的寬度設置為給定的值 |
| insertTopLevelItems() | 在視圖的頂層索引中引入項目的列表 |
| expandAll() | 展開所有節點的樹形節點 |
| invisibleRootItem() | 返回樹形控件中不可見的根選項(Root Item) |
| selectionItems() | 返回所有選定的非隱藏項目的列表內 |
QTreeWidgetItem類中常用的方法
方法描述
| addChild() | 將子項追加到子列表中 |
| setText() | 設置顯示的節點文本 |
| Text() | 返回顯示的節點文本 |
| setCheckState(column.state) | 設置指定列的選中狀態: |
| - | Qt.Checked:節點選中 |
| - | Qt.Unchecked:節點沒有選中 |
| setIcon(column,icon) | 在指定的列中顯示圖標 |
import sys
from PyQt5
.QtWidgets
import *
from PyQt5
.QtGui
import QIcon
, QBrush
, QColor
from PyQt5
.QtCore
import Qtclass TreeWidgetDemo
(QMainWindow
):def __init__
(self
, parent
=None
):super
(TreeWidgetDemo
, self
).__init__
(parent
)self
.setWindowTitle
('TreeWidget 例子')self
.tree
= QTreeWidget
()self
.tree
.setColumnCount
(2)self
.tree
.setHeaderLabels
(['Key', 'Value'])root
= QTreeWidgetItem
(self
.tree
)root
.setText
(0, 'root')root
.setIcon
(0, QIcon
("./images/root.png"))self
.tree
.setColumnWidth
(0, 160)child1
= QTreeWidgetItem
(root
)child1
.setText
(0, 'child1')child1
.setText
(1, 'ios')child1
.setIcon
(0, QIcon
("./images/IOS.png"))child1
.setCheckState
(0, Qt
.Checked
)child2
= QTreeWidgetItem
(root
)child2
.setText
(0, 'child2')child2
.setText
(1, '')child2
.setIcon
(0, QIcon
("./images/android.png"))child3
= QTreeWidgetItem
(child2
)child3
.setText
(0, 'child3')child3
.setText
(1, 'android')child3
.setIcon
(0, QIcon
("./images/music.png"))self
.tree
.addTopLevelItem
(root
)self
.tree
.expandAll
()self
.setCentralWidget
(self
.tree
)if __name__
== '__main__':app
= QApplication
(sys
.argv
)tree
= TreeWidgetDemo
()tree
.show()sys
.exit(app
.exec_
())
節點綁定方法
child2 = QTreeWidgetItem(root)
括號里有root
優化一:設置節點的狀態
這里添加了child1的選中狀態
child1.setCheckState(0,Qt.Checked)
優化二:設置節點的背景顏色
這里設置了根節點的背景顏色
brush_red
=QBrush
(Qt
.red
)root
.setBackground
(0,brush_red
)brush_blue
=QBrush
(Qt
.blue
)root
.setBackground
(1,brush_blue
)
優化3 :添加響應事件
self
.tree
.clicked
.connect( self
.onTreeClicked
)
def onTreeClicked
(self
, qmodelindex
):item
= self
.tree
.currentItem
()print("key=%s ,value=%s" % (item
.text(0), item
.text(1)))
電氣專業的計算機萌新,寫博文不容易,如果你覺得本文對你有用,請點個贊支持下,謝謝。
總結
以上是生活随笔為你收集整理的pyqt讲解7:表格和树的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。