PyQt5 組合選擇框(QComboBox)、列表(QListWidget)、表格(QTableWidget) 使用方法


PyQt5 組合選擇框、列表、表格 使用方法

一、組合選擇框

  • QComboBox 是組合選擇框,也叫下拉框

  1. 信號:選項改變
  • 如果用戶操作修改了 QComboBox 中的選項就會發出 currentIndexChanged 信號,可以這樣指定處理該信號的函數

cbox.currentIndexChanged.connect(function)

  1. 方法:添加一個選項
  • 代碼中可以使用 addItem 方法來添加一個選項到 末尾,參數就是選項文本

cbox.addItem("one")
cbox.addItem("two")

  1. 方法:添加多個選項
  • 代碼中可以使用 addItems 方法來添加多個選項到 末尾,參數是包含了多個選項文本的列表(使用列表或者元組

cbox.addItems(["one", "two", "three"])
或者
cbox.addItems(("one", "two", "three"))

  1. 方法:清空選項
  • 代碼中可以使用 clear 方法來清空選項,也就是刪除選擇框內所有的選項

cbox.addItems(("one", "two", "three"))
cbox.clear()

  1. 方法:獲取當前選項文本
  • 代碼中可以使用 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 是列表控件

  1. 信號:選項改變
  • 如何用戶使用操作選中 QListWidget 中的某一個選項就會 發出 itemSelectionChanged 信號,可以這樣指定處理該信號的函數

listsheet.itemSelectionChanged.connect(function)

  1. 方法:添加一個選項
  • 代碼中同樣可以使用 addItem 方法來添加一個選項到 末尾 ,參數就是選項文本(與下拉框一樣)

listsheet.addItem("測試一")
listsheet.addItem("測試二")

  1. 方法:添加多個選項
  • 代碼中可以使用 addItems 方法來添加多個選項到 末尾,參數是包含了多個選項文本的列表(與下拉框一樣)

listsheet.addItems(["測試一", "測試二", "測試三", "測試四", "測試五"])

  1. 方法:刪除某一個選項
  • 代碼中可以使用 takeItem 方法來刪除 1 個選項,參數是該選項所在行(行數從 0 開始)

listsheet.addItems(["測試一", "測試二", "測試三", "測試四", "測試五"])
listsheet.takeItem(1)

  1. 方法:清空選項
  • 代碼中可以使用 clear 方法來清空選項,也就是刪除選擇框內所有的選項

listsheet.addItems(["測試一", "測試二", "測試三", "測試四", "測試五"])
listsheet.clear()

  1. 方法:獲取當前選項文本
  • 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 是表格控件,默認模型提供基於項目的表格視圖,如下圖所示

  1. 創建表格——需求已定
  • 表格小部件為應用程序提供標准的表格顯示, QTableWidget 中的項目由 QTableWidgetItem 提供

  • 如果你想要一個使用你自己的數據模型的表,你應該使用 QTableView 而不是這個類

  • 表格小部件可以用所需數量的行和列來構建


tablewidget = QTableWidget(3, 2, window)      # 前面的 3 是指的行數;2 是指列數

  • 這樣就會創建一個3行,2列的表格
  1. 創建表格——需求未定
  • 如何在沒有給定表格大小的情況下,可以使用 setRowCount()setColumnCount() 方法構建表格,並在稍后調整大小

tablewidget = QTableWidget(window)
tablewidget.setRowCount(3)
tablewidget.setColumnCount(2)

  1. 修改列和行標題
  • 由於QTableWidget會自動生成列和行標題,也就是水平和垂直標題

  • 創建標題的最簡單方法是向 setHorizontalHeaderLabels()setVerticalHeaderLabels() 函數提供一個字符串列表(列表或元組),這些將為表的列和行提供簡單的文本標題


tablewidget = QTableWidget(3, 2, window)
tablewidget.setHorizontalHeaderLabels(("項目", "值"))        # 設置水平標題
tablewidget.setVerticalHeaderLabels(["科目一", "科目二", "科目三"])        # 設置垂直標題

  1. 方法:插入一行、刪除一行
  • 注意:表格中行數、列數都是從 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行以上的內容,不動

  1. 方法:設置單元格文本內容
  • 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)

  1. 文本對齊方式
  • 它包含水平和垂直的標志,可以結合起來產生所需的效果

  • 水平標志是:

對其方式 描述
Qt.AlignLeft 靠左邊緣對齊
Qt.AlignRight 靠右邊緣對齊
Qt.AlignHCenter 水平居中
  • 垂直標志是:
對其方式 描述
Qt.AlignTop 靠上端緣對齊
Qt.AlignBottom 靠下端緣對齊
Qt.AlignVCenter 垂直居中
  • 一次最多可以使用一個水平和一個垂直標志。當然凡是也有例外:Qt.AlignCenter: 水平、垂直居中
  1. 方法:獲取單元格文本內容
  • item() 方法可以指定位置的單元格對象(QTableWidgetItem) ,再調用這個對象的 text 方法,就可以獲取文本內容

itemtext = tablewidget.item(0, 0).text()        # 這樣獲取了 第1行,第1列 的單元格里面的文本
print(itemtext)

  1. 方法:獲取所有的行數、列數
  • 代碼中可以使用 rowCount() 方法來獲取表格所有的 行數

  • 可以使用 columnCount() 方法來獲取表格所有的 列數


rowcount = tablewidget.rowCount()
columncount = tablewidget.columnCount()

print(rowcount, columncount)      # 打印出行數、列數

  1. 方法:獲取當前選中的是第幾行、第幾列
  • 代碼中可以使用 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_()

  1. 方法:設置表格行數、列數
  • 代碼中可以使用 setRowCount() 方法來設置表格 行數

  • 代碼中可以使用 setColumnCount() 方法來設置表格 列數


tablewidget.setRowCount(3)
tablewidget.setColumnCount(2)

  1. 方法:清除/刪除所有內容
  • clear() 方法清除表格所有的內容,包含表格欄,也就是表頭

  • clearContents() 方法可以清除表格所有的內容,但不包含表格欄


tablewidget.clear()        # 清除表格內所有的內容,包含標題欄
tablewidget.clearContents()        # 清除表格內所有內容,不包含標題欄

  1. 方法:設置列寬、行高、寬度自動縮放
  • 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)

  1. 信號:單元格內容改動
  • 當用戶修改了一個單元格的內容,會發出 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_()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM