PyQt5 組合選擇框、列表、表格 使用方法
一、組合選擇框
- QComboBox 是組合選擇框,也叫下拉框
- 信號:選項改變
- 如果用戶操作修改了 QComboBox 中的選項就會發出 currentIndexChanged 信號,可以這樣指定處理該信號的函數
cbox.currentIndexChanged.connect(function)
- 方法:添加一個選項
- 代碼中可以使用 addItem 方法來添加一個選項到 末尾,參數就是選項文本
cbox.addItem("one")
cbox.addItem("two")
- 方法:添加多個選項
- 代碼中可以使用 addItems 方法來添加多個選項到 末尾,參數是包含了多個選項文本的列表(使用列表或者元組)
cbox.addItems(["one", "two", "three"])
或者
cbox.addItems(("one", "two", "three"))
- 方法:清空選項
- 代碼中可以使用 clear 方法來清空選項,也就是刪除選擇框內所有的選項
cbox.addItems(("one", "two", "three"))
cbox.clear()
- 方法:獲取當前選項文本
- 代碼中可以使用 currentText 方法來獲取當前 選中的選項 的文本,可以結合信號選項發生改變,進而打印出當前選擇的文本
from PyQt5.Qt import *
app = QApplication([])
window = QWidget()
window.resize(250, 120)
window.move(300, 300)
def display():
curtext = cbox.currentText() # 獲取當前文本
ouput.setText(curtext) # 獲取當前文本並作為字符串傳遞給QLabel顯示出來
ouput = QLabel(window)
ouput.resize(80, 20)
ouput.move(150, 30)
cbox = QComboBox(window)
cbox.addItems(("one", "two", "three"))
ouput.setText(cbox.currentText()) # 獲取當前文本並作為字符串傳遞給QLabel顯示出來
cbox.currentIndexChanged.connect(display)
cbox.move(40, 10)
window.show()
app.exec_()
二、列表
- QListWidget 是列表控件
- 信號:選項改變
- 如何用戶使用操作選中 QListWidget 中的某一個選項就會 發出 itemSelectionChanged 信號,可以這樣指定處理該信號的函數
listsheet.itemSelectionChanged.connect(function)
- 方法:添加一個選項
- 代碼中同樣可以使用 addItem 方法來添加一個選項到 末尾 ,參數就是選項文本(與下拉框一樣)
listsheet.addItem("測試一")
listsheet.addItem("測試二")
- 方法:添加多個選項
- 代碼中可以使用 addItems 方法來添加多個選項到 末尾,參數是包含了多個選項文本的列表(與下拉框一樣)
listsheet.addItems(["測試一", "測試二", "測試三", "測試四", "測試五"])
- 方法:刪除某一個選項
- 代碼中可以使用 takeItem 方法來刪除 1 個選項,參數是該選項所在行(行數從 0 開始)
listsheet.addItems(["測試一", "測試二", "測試三", "測試四", "測試五"])
listsheet.takeItem(1)
- 方法:清空選項
- 代碼中可以使用 clear 方法來清空選項,也就是刪除選擇框內所有的選項
listsheet.addItems(["測試一", "測試二", "測試三", "測試四", "測試五"])
listsheet.clear()
- 方法:獲取當前選項文本
-
selectedItems 方法可以得到當前選中項對象(QListWidgetItem)的列表 ,再調用這個對象的 text 方法,就可以獲取文本內容
-
由於列表在創建前未選中任何文本,所以需要與(itemSelectionChanged)該信號機制一起使用;與下拉框不一樣,下拉框默認會選中第一個文本
from PyQt5.Qt import *
app = QApplication([])
window = QWidget()
window.resize(500, 205)
window.move(300, 300)
label = QLabel(window)
label.resize(80, 20)
label.move(350, 50)
def display():
curtext = listsheet.selectedItems()
label.setText(curtext[0].text())
listsheet = QListWidget(window)
listsheet.move(15, 5)
listsheet.addItems(["測試一", "測試二", "測試三", "測試四", "測試五"])
listsheet.itemSelectionChanged.connect(display)
window.show()
app.exec_()
三、表格
- QTableWidget 是表格控件,默認模型提供基於項目的表格視圖,如下圖所示
- 創建表格——需求已定
-
表格小部件為應用程序提供標准的表格顯示, QTableWidget 中的項目由 QTableWidgetItem 提供
-
如果你想要一個使用你自己的數據模型的表,你應該使用 QTableView 而不是這個類
-
表格小部件可以用所需數量的行和列來構建
tablewidget = QTableWidget(3, 2, window) # 前面的 3 是指的行數;2 是指列數
- 這樣就會創建一個3行,2列的表格
- 創建表格——需求未定
- 如何在沒有給定表格大小的情況下,可以使用 setRowCount() 和 setColumnCount() 方法構建表格,並在稍后調整大小
tablewidget = QTableWidget(window)
tablewidget.setRowCount(3)
tablewidget.setColumnCount(2)
- 修改列和行標題
-
由於QTableWidget會自動生成列和行標題,也就是水平和垂直標題
-
創建標題的最簡單方法是向 setHorizontalHeaderLabels() 和 setVerticalHeaderLabels() 函數提供一個字符串列表(列表或元組),這些將為表的列和行提供簡單的文本標題
tablewidget = QTableWidget(3, 2, window)
tablewidget.setHorizontalHeaderLabels(("項目", "值")) # 設置水平標題
tablewidget.setVerticalHeaderLabels(["科目一", "科目二", "科目三"]) # 設置垂直標題
- 方法:插入一行、刪除一行
-
注意:表格中行數、列數都是從 0 開始
-
insertRow() 方法可以在指定位置插入一行
tablewidget.insertRow(0) # 這樣就插入一行到第 1 行這個位置, 表格原來第1行(包括原來的第1行)以后的內容,全部往下移動一行;
tablewidget.insertRow(2) # 同理,插入一行到第 3 行這個位置, 表格原來第3行(包括原來的第3行)以后的內容,全部往下移動一行
- removeRow() 方法可以刪除指定位置的一行
tablewidget.removeRow(0) # 這樣就刪除第 1 行, 表格原來第1行以后的內容,全部往上移動一行
tablewidget.removeRow(2) # 就刪除第 3 行, 表格原來第3行以后的內容,全部往上移動一行;表格原來第3行以上的內容,不動
- 方法:設置單元格文本內容
-
qt表格的單元格內的內容對象 是一個 單元格對象 QTableWidgetItem 實例
-
如果單元格 沒有被設置過 內容,使用 QTableWidgetItem 對象,並使用setItem()插入到表格中
from PyQt5.QtWidgets import QTableWidgetItem
newitem = QTableWidgetItem("語文")
tablewidget.setItem(0, 0, newitem) # 前面的 0 代表 row ;后面的 0 代表 column
或者簡寫
tablewidget.setItem(0, 0, QTableWidgetItem("語文"))
- 如果單元格 已經被設置過 文本內容;item() 方法可以獲取指定位置的 QTableWidgetItem ,再調用這個對象的 setText() 方法,就可以設置單元格文本內容
from PyQt5.QtWidgets import QTableWidgetItem
tablewidget.setItem(0, 0, QTableWidgetItem("語文"))
tablewidget.item(0, 0).setText("數學") # 這樣就將原來的“語文”替換成“數學”
- 如果希望某個單元格為 只讀,不允許修改,可以使用 QTableWidgetItem 對象的 setFlags() 方法
from PyQt5.QtWidgets import QTableWidgetItem
from PyQt5.QtCore import Qt
newitem = QTableWidgetItem("語文")
newitem.setFlags(Qt.ItemIsEnabled) # 名稱字段不允許修改,默認是允許修改的
tablewidget.setItem(0, 0, newitem)
- 如果想文本內容 居中對齊,每個當對應的 QTableWidgetItem 調用 setTextAlignment 方法
from PyQt5.QtWidgets import QTableWidgetItem
from PyQt5.QtCore import Qt
newitem = QTableWidgetItem("語文")
newitem.setTextAlignment(Qt.AlignCenter) # 設置文本居中
tablewidget.setItem(0, 0, newitem)
- 文本對齊方式
-
它包含水平和垂直的標志,可以結合起來產生所需的效果
-
水平標志是:
對其方式 | 描述 |
---|---|
Qt.AlignLeft | 靠左邊緣對齊 |
Qt.AlignRight | 靠右邊緣對齊 |
Qt.AlignHCenter | 水平居中 |
- 垂直標志是:
對其方式 | 描述 |
---|---|
Qt.AlignTop | 靠上端緣對齊 |
Qt.AlignBottom | 靠下端緣對齊 |
Qt.AlignVCenter | 垂直居中 |
- 一次最多可以使用一個水平和一個垂直標志。當然凡是也有例外:Qt.AlignCenter: 水平、垂直居中
- 方法:獲取單元格文本內容
- item() 方法可以指定位置的單元格對象(QTableWidgetItem) ,再調用這個對象的 text 方法,就可以獲取文本內容
itemtext = tablewidget.item(0, 0).text() # 這樣獲取了 第1行,第1列 的單元格里面的文本
print(itemtext)
- 方法:獲取所有的行數、列數
-
代碼中可以使用 rowCount() 方法來獲取表格所有的 行數
-
可以使用 columnCount() 方法來獲取表格所有的 列數
rowcount = tablewidget.rowCount()
columncount = tablewidget.columnCount()
print(rowcount, columncount) # 打印出行數、列數
- 方法:獲取當前選中的是第幾行、第幾列
-
代碼中可以使用 currentRow() 方法來獲取當前選中是第幾行
-
代碼中可以使用 currentColumn() 方法來獲取當前選中是第幾列
-
注意:行數和列數都是從0開始的, 第一行的行數是 0,第一列的列數也是 0
-
當選中表格中某一個單元格同樣會發出,itemSelectionChanged 信號,我們就可以創建槽函數去攔截信號,說白了就是觸發函數或者方法
from PyQt5.Qt import *
from PyQt5.QtWidgets import QTableWidgetItem
app = QApplication([])
window = QWidget()
window.resize(500, 205)
window.move(300, 300)
def display():
currentrow = tablewidget.currentRow()
currentcolumn = tablewidget.currentColumn()
label.setText(f"行數是{currentrow},列數是{currentcolumn}")
label = QLabel(window)
label.resize(250, 50)
label.move(300, 50)
tablewidget = QTableWidget(3, 2, window)
tablewidget.move(12, 5)
tablewidget.setHorizontalHeaderLabels(("項目", "值"))
tablewidget.setVerticalHeaderLabels(["科目一", "科目二", "科目三"])
tablewidget.itemSelectionChanged.connect(display)
window.show()
app.exec_()
- 方法:設置表格行數、列數
-
代碼中可以使用 setRowCount() 方法來設置表格 行數
-
代碼中可以使用 setColumnCount() 方法來設置表格 列數
tablewidget.setRowCount(3)
tablewidget.setColumnCount(2)
- 方法:清除/刪除所有內容
-
clear() 方法清除表格所有的內容,包含表格欄,也就是表頭
-
clearContents() 方法可以清除表格所有的內容,但不包含表格欄
tablewidget.clear() # 清除表格內所有的內容,包含標題欄
tablewidget.clearContents() # 清除表格內所有內容,不包含標題欄
- 方法:設置列寬、行高、寬度自動縮放
- Tips:Qt Designer 上目前沒法拖拽設定 每個列的寬度,只能在代碼中指定
tablewidget.setColumnWidth(0, 100) # 設置第 1 列的寬度為 100像素
tablewidget.setColumnWidth(1, 50) # 設置第 2 列的寬度為 50像素
tablewidget.setRowHeight(0, 50) # 設置第 1 行的高度為 50像素
tablewidget.setRowHeight(1, 80) # 設置第 2 行的高度未 80像素
- 讓 表格控件寬度 隨着父窗口的縮放自動縮放,使用下面代碼
tablewidget.horizontalHeader().setStretchLastSection(True)
- 信號:單元格內容改動
- 當用戶修改了一個單元格的內容,會發出 cellChanged 信號,並且攜帶參數指明該單元格的行號和列號
from PyQt5.Qt import *
from PyQt5.QtWidgets import QTableWidgetItem
app = QApplication([])
window = QWidget()
window.resize(500, 250)
window.move(300, 300)
def display(row, column):
value = tablewidget.item(row, column).text()
label.setText(f"修改值為:{value}")
label = QLabel(window)
label.resize(200, 30)
label.move(300, 50)
tablewidget = QTableWidget(3, 2, window)
tablewidget.move(12, 5)
tablewidget.setHorizontalHeaderLabels(("項目", "值"))
tablewidget.setVerticalHeaderLabels(["科目一", "科目二", "科目三"])
tablewidget.cellChanged.connect(display)
window.show()
app.exec_()