<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python Qt GUI設(shè)計:表格和樹類(提升篇—1)

          共 8237字,需瀏覽 17分鐘

           ·

          2021-12-16 22:04

          點擊上方藍(lán)色字體,關(guān)注我們


          表格與樹解決的問題是如何在一個控件中有規(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對象來實現(xiàn)的。通常使用QTableWidget就能夠滿足我們的要求。


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



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



          實現(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中的一項時會彈出消息框(提示選擇的是哪─項)。


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


          from PyQt5.QtWidgets import QApplication, QWidget , QVBoxLayout , QListView, QMessageBoxfrom 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列表中的一個條目時會彈出消息框,提示選擇的是哪個條目。


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


          import sysfrom 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 對象來實現(xiàn)的。使用QTableWidget時就需要QTableWidgetltem,用來表示表格中的一個單元格,整個表格就是用各單元格構(gòu)建起來的。


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



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



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



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



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



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


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



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


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


          import sysfrom 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)榻咕庉?/span> #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類實現(xiàn)了樹形結(jié)構(gòu),效果如下圖所示:



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



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



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



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


          import sysfrom 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é)點") updateBtn = QPushButton("修改節(jié)點") delBtn = QPushButton("刪除節(jié)點") 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_())


          往期推薦



          點擊閱讀原文,更精彩~
          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲一级免费在线观看 | 成人电影一区二区 | 大香蕉伊人手机在线 | 草青青在线免费视频 | 日批视频欧美在线播放 |