Python Qt GUI設(shè)計:QTableView、QListView提完、QListWidet蜗字、QTableWidget级零、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

表格與樹解決的問題是如何在一個控件中有規(guī)律地呈現(xiàn)更多的數(shù)據(jù)。PyQt提供了兩種控件類用于解決該問題序调,其中一種是表格結(jié)構(gòu)的控件類发绢,另一種是樹形結(jié)構(gòu)的控件類坯认。

1荆隘、QTableView類

在通常情況下,一個應(yīng)用需要和一批數(shù)據(jù)(比如數(shù)組浇雹、列表)進(jìn)行交互柱徙,然后以表格的形式輸出這些信息缓屠,這時就要用到QTableView類了。在QtableView中可以使用自定義的數(shù)據(jù)模型來顯示內(nèi)容护侮,通過setModel來綁定數(shù)據(jù)源敌完。

QTableWidget繼承自QTableView,主要區(qū)別是QTableView可以使用自定義的數(shù)據(jù)模型來顯示內(nèi)容(先要通過setModel來綁定數(shù)據(jù)源)羊初,而QTableWidget只能使用標(biāo)準(zhǔn)的數(shù)據(jù)模型滨溉,并且其單元格數(shù)據(jù)是通過QTableWidgetltem對象來實(shí)現(xiàn)的。通常使用QTableWidget就能夠滿足我們的要求长赞。

QTableView控件可以綁定一個模型數(shù)據(jù)用來更新控件上的內(nèi)容晦攒,可用的模式如下表所示:

通過示例了解QTableView類的使用方法,效果如下所示:

實(shí)現(xiàn)代碼如下所示:

from 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(['標(biāo)題1','標(biāo)題2','標(biāo)題3','標(biāo)題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)

#下面代碼讓表格100填滿窗口

#self.tableView.horizontalHeader().setStretchLastSection(True)

#self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

dlgLayout=QVBoxLayout();

dlgLayout.addWidget(self.tableView)

self.setLayout(dlgLayout)

if __name__ == '__main__':

app = QApplication(sys.argv)

table = Table()

table.show()

sys.exit(app.exec_())

2得哆、QListView類

QListView類用于展示數(shù)據(jù)脯颜,它的子類是QListWidget類。QListView是基于模型(Model)的贩据,需要程序來建立模型栋操,然后再保存數(shù)據(jù)。

QListWidget是一個升級版本的QListView饱亮,它已經(jīng)建立了一個數(shù)據(jù)存儲模(QListWidgetltem)矾芙,直接調(diào)用addltem()函數(shù),就可以添加條目(ltem)近上。

QListView類中的常用方法如下表所示:

QListView類中的常用信號如下表所示:

通過示例了解QListView類的使用方法剔宪,效果如下所示:

示例中,將QListView控件的clicked信號與自定義對象的clicked()槽函數(shù)進(jìn)行綁定壹无,當(dāng)單擊QListView控件里Model中的一項時會彈出消息框(提示選擇的是哪─項)歼跟。

實(shí)現(xiàn)代碼如下所示:

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 = ['Pyhon語言','C語言','C++語言','Java語言' ]

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、QListWidet類

QListWidet類是一個基于條目的接口格遭,用于從列表中添加或刪除條目哈街。列表中的每個條目都是一個QListWidgetltem對象。QListWidget可以設(shè)置為多重選擇拒迅。

QListWidget類中的常用方法如下表所示:

QListWidget類中的常用信號如下表所示:

通過示例了解QListWidget類的使用方法骚秦,效果如下所示:

示例中, 將QListWidget控件的itemClicked信號與自定義對象的Clicked()槽函數(shù)進(jìn)行綁定璧微,當(dāng)單擊QListWidget列表中的一個條目時會彈出消息框作箍,提示選擇的是哪個條目。

實(shí)現(xiàn)代碼如下所示:

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

listWidget.resize(300,120)

listWidget.addItem("Pyhon語言");

listWidget.addItem("C語言");

listWidget.addItem("C++語言");

listWidget.addItem("Java語言");

listWidget.setWindowTitle('QListwidget 例子')

listWidget.itemClicked.connect(listWidget.clicked)

listWidget.show()

sys.exit(app.exec_())

4前硫、QTableWidget類

QTableWidget是Qt程序中常用的顯示數(shù)據(jù)表格的空間胞得,類似于C#中的DataGrid。QTableWidget是QTableView的子類屹电,它使用標(biāo)準(zhǔn)的數(shù)據(jù)模型阶剑,并且其單元格數(shù)據(jù)是通過QTableWidgetltem 對象來實(shí)現(xiàn)的跃巡。使用QTableWidget時就需要QTableWidgetltem,用來表示表格中的一個單元格牧愁,整個表格就是用各單元格構(gòu)建起來的素邪。

QTableWidget類中的常用方法如下表所示:

編輯規(guī)則的枚舉值類型如下表所示:

表格的選擇行為的枚舉值類型如下表所示:

單元格文本的水平對齊方式如下表所示:

單元格文本的垂直對齊方式如下表所示:

如果要設(shè)置水平和垂直對齊方式,比如在表格空間內(nèi)上猪半、下兔朦、左、右居中對齊磨确,那么只要使用Qt.AlignHCenter和Qt.AlignVCenter 即可沽甥。

通過示例了解QTableWidget類的使用方法,效果如下所示:

示例中乏奥, 構(gòu)造了一個QTableWidget對象摆舟,并且設(shè)置表格為4行3列。生成了一個QTableWidgetltem對象英融,名稱為“不脫發(fā)的程序猿”盏檐。

實(shí)現(xiàn)代碼如下所示:

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("不脫發(fā)的程序猿")?

tableWidget.setItem(0, 0, newItem)?

newItem = QTableWidgetItem("男")?

tableWidget.setItem(0, 1, newItem)?

newItem = QTableWidgetItem("65")?

tableWidget.setItem(0, 2, newItem)?

# 將表格變?yōu)榻咕庉?/i>

#tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)

# 設(shè)置表格為整行選擇

#tableWidget.setSelectionBehavior( QAbstractItemView.SelectRows)

# 將行和列的大小設(shè)為與內(nèi)容相匹配

#tableWidget.resizeColumnsToContents()

#tableWidget.resizeRowsToContents()

#表格表頭的顯示與隱藏

#tableWidget.verticalHeader().setVisible(False)

#tableWidget.horizontalHeader().setVisible(False)

# 不顯示表格單元格的分割線

#tableWidget.setShowGrid(False)

? ? ? ? ? ? ? ? # 不顯示垂直表頭

tableWidget.verticalHeader().setVisible(False)

self.setLayout(conLayout)

if __name__ == '__main__':

app = QApplication(sys.argv)

example = Table()?

example.show()?

sys.exit(app.exec_())

5、QTreeWidget和QTreeWidgetltem類

QTreeWidget類實(shí)現(xiàn)了樹形結(jié)構(gòu)驶悟,效果如下圖所示:

QTreeWidget類中的常用方法如下表所示:

QTreeWidgetltem類中的常用方法如下表所示:

通過示例了解QTreeWidget和QTreeWidgetltem類的使用方法胡野,效果如下所示:

示例中,實(shí)現(xiàn)樹形結(jié)構(gòu)節(jié)點(diǎn)的添加痕鳍、修改和刪除硫豆, 實(shí)現(xiàn)代碼如下所示:

import sys

from PyQt5.QtWidgets import *

#from PyQt5.QtGui import QIcon ,? QBrush , QColor

#from PyQt5.QtCore import Qt

class TreeWidgetDemo(QWidget):?

def __init__(self,parent=None):

super(TreeWidgetDemo,self).__init__(parent)

self.setWindowTitle('TreeWidget 例子')

operatorLayout = QHBoxLayout()

addBtn = QPushButton("添加節(jié)點(diǎn)")

updateBtn =? QPushButton("修改節(jié)點(diǎn)")

delBtn = QPushButton("刪除節(jié)點(diǎn)")

operatorLayout.addWidget(addBtn)

operatorLayout.addWidget(updateBtn)

operatorLayout.addWidget(delBtn)

# 按鈕的信號槽連接

addBtn.clicked.connect(self.addTreeNodeBtn )

updateBtn.clicked.connect(self.updateTreeNodeBtn )

delBtn.clicked.connect(self.delTreeNodeBtn )

self.tree = QTreeWidget(self)

? ? ? ? # 設(shè)置列數(shù)

self.tree.setColumnCount(2)

? ? ? ? # 設(shè)置頭的標(biāo)題

self.tree.setHeaderLabels(['Key','Value'])

root= QTreeWidgetItem(self.tree)

root.setText(0,'root')

root.setText(1,'0')

child1 = QTreeWidgetItem(root)

child1.setText(0,'child1')

child1.setText(1,'1')

child2 = QTreeWidgetItem(root)

child2.setText(0,'child2')

child2.setText(1,'2')

child3 = QTreeWidgetItem(root)

child3.setText(0,'child3')

child3.setText(1,'3')

child4 = QTreeWidgetItem(child3)

child4.setText(0,'child4')

child4.setText(1,'4')

child5 = QTreeWidgetItem(child3)

child5.setText(0,'child5')

child5.setText(1,'5')

self.tree.addTopLevelItem(root)

self.tree.clicked.connect( self.onTreeClicked )

mainLayout = QVBoxLayout(self);

mainLayout.addLayout(operatorLayout);

mainLayout.addWidget(self.tree);

self.setLayout(mainLayout)

def onTreeClicked(self, qmodelindex):

item = self.tree.currentItem()

print("key=%s ,value=%s" % (item.text(0), item.text(1)))

def addTreeNodeBtn(self):

print('--- addTreeNodeBtn ---')

item = self.tree.currentItem()

node = QTreeWidgetItem(item)

node.setText(0,'newNode')

node.setText(1,'10')

def updateTreeNodeBtn(self):

print('--- updateTreeNodeBtn ---')

item = self.tree.currentItem()

item.setText(0,'updateNode')

item.setText(1,'20')

def delTreeNodeBtn(self):

print('--- delTreeNodeBtn ---')

item = self.tree.currentItem()

root = self.tree.invisibleRootItem()

for item in self.tree.selectedItems():

(item.parent() or root).removeChild(item)

if __name__ == '__main__':

app = QApplication(sys.argv)

tree = TreeWidgetDemo()

tree.show()

sys.exit(app.exec_())

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市笼呆,隨后出現(xiàn)的幾起案子熊响,更是在濱河造成了極大的恐慌,老刑警劉巖诗赌,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汗茄,死亡現(xiàn)場離奇詭異,居然都是意外死亡铭若,警方通過查閱死者的電腦和手機(jī)洪碳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叼屠,“玉大人瞳腌,你說我怎么就攤上這事【涤辏” “怎么了嫂侍?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我挑宠,道長菲盾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任痹栖,我火速辦了婚禮亿汞,結(jié)果婚禮上瞭空,老公的妹妹穿的比我還像新娘揪阿。我一直安慰自己,他們只是感情好咆畏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布南捂。 她就那樣靜靜地躺著,像睡著了一般旧找。 火紅的嫁衣襯著肌膚如雪溺健。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天钮蛛,我揣著相機(jī)與錄音鞭缭,去河邊找鬼。 笑死魏颓,一個胖子當(dāng)著我的面吹牛岭辣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甸饱,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沦童,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叹话?” 一聲冷哼從身側(cè)響起偷遗,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驼壶,沒想到半個月后氏豌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡热凹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年泵喘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碌嘀。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涣旨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出股冗,到底是詐尸還是另有隱情霹陡,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站烹棉,受9級特大地震影響攒霹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浆洗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一催束、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伏社,春花似錦抠刺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聪黎,卻和暖如春罕容,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稿饰。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工锦秒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喉镰。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓旅择,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梧喷。 傳聞我的和親對象是個殘疾皇子砌左,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容