醋醋百科网

Good Luck To You!

Python+PyQt5基础开发(10)_pycharm pyqt5教程

本篇介绍PyQt5中的QTableWidget,QTableWidget是一个表格控件。表格的第一行是行表头,第一列为列表头,除表头之外既是表格工作区。每一个单元格cell既是一个QTableWidgetItem对象。本篇Demo介绍QTableWidget对表格的操作。

新建一个窗口

窗口左面是表格的设置区域,中间区域是tableWidget控件,右侧是一个textBrowser,用来显示表格内的内容。

QTableWidget

  • 定义一个枚举类型类,来表示每个单元格的类型。
class CellTyp(Enum):
    ctName = 1000
    ctSex = 1001
    ctBirth = 1002
    ctNation = 1003
    ctAge = 1004
    ctIsMarried = 1005
  • 设置表头
  1. setColumnCount:设置列数。
  2. QTableWidgetItem:每一个cell就是一个QTableWidget对象,创建单元格。
  3. setFont:设置字体大小。
  4. setBackground:设置单元格背景颜色。
  5. setHosetrizontalHeaderItem:设置行表头。
def btnSetHeader_clicked(self):
    headerList = ["姓名", "省份", "性别", "出生日期", "民族", "年龄", "是否已婚"]
    self.tableWidget.setColumnCount(len(headerList))
    for i in range(len(headerList)):
        headerItem = QTableWidgetItem(headerList[i])
        font = headerItem.font()
        font.setPointSize(11)
        headerItem.setFont(font)
        headerItem.setBackground(QBrush(Qt.red))
        self.tableWidget.setHorizontalHeaderItem(i, headerItem)
  • 设置行数
  1. 根据spinBox内的数值设置表格的行数。
  2. setRowCount:设置行数。
  3. setAlternatingRowColors:设置是否交替行背景颜色。
def btnSetRows_clicked(self):
    self.tableWidget.setRowCount(self.spinBox.value())
    self.tableWidget.setAlternatingRowColors(self.chkBoxBackground.isChecked())

现在就可以在表格内输入值了

  • tableWidget内常用的信号
  1. currentCellChanged:当前单元格的选择发生改变,传递当前单元格的行号和列号。
  2. currentItemChanged:和currentCellChanged一样。传递的是两个QTableWidgetItem对象。
  3. cellChanged:单元格内的值发生改变。
  4. cellClicked:鼠标点击单元格。
  5. cellDoubleClicked:鼠标双击单元格。

当单元格内发生改变之后,先读取单元格内内容。

item = self.tableWidget.item(currentRow, currentColumn)
cellText = item.text()

如果性别列内是男生,则在设置该单元格的ico为男性标志。如果民族列内不是汉族,则把单元格的背景颜色设置为蓝色。如果出生日期列内值发生改变,则自动计算岁数。

def currentCellChanged(self, currentRow, currentColumn):
    try:
        icoPathMale = os.getcwd() + "\\Icon\男.ico"
        icoPathFemale = os.getcwd() + "\\Icon\女.ico"
        item = self.tableWidget.item(currentRow, currentColumn)
        cellText = item.text()
        if currentColumn == 2:
            if cellText == "男":
                ico = QIcon(icoPathMale)
                item2 = QTableWidgetItem("  男", CellTyp.ctSex.value)
                item2.setIcon(ico)
                self.tableWidget.setItem(currentRow, 2, item2)
            if cellText == "女":
                ico = QIcon(icoPathFemale)
                item2 = QTableWidgetItem("  女", CellTyp.ctSex.value)
                item2.setIcon(ico)
                self.tableWidget.setItem(currentRow, 2, item2)
        if currentColumn == 3:
            birthYear = int(cellText[:4])
            dataTime = int(QDate.currentDate().year())
            age = dataTime - birthYear
            item2 = QTableWidgetItem(str(age), CellTyp.ctAge.value)
            self.tableWidget.setItem(currentRow, 5, item2)
        if currentColumn == 4:
            if cellText != "汉族":
                item2 = QTableWidgetItem(cellText, CellTyp.ctNation.value)
                item2.setBackground(QBrush(Qt.blue))
                self.tableWidget.setItem(currentRow, 4, item2)
    except Exception as e:
        print(e)
  • 插入行、添加行、删除行和清除内容。
    def btnInsertRow_clicked(self):
        currentRow = self.tableWidget.currentRow()
        self.tableWidget.insertRow(currentRow)

    def btnAppendRow_clicked(self):
        currentRow = self.tableWidget.rowCount()
        self.tableWidget.insertRow(currentRow)

    def btnDelCurRow_clicked(self):
        currentRow = self.tableWidget.currentRow()
        self.tableWidget.removeRow(currentRow)

    def btnClear_clicked(self):
        self.tableWidget.clearContents()
  • 自动宽和高
def btnAutoHeight_clicked(self):
    self.tableWidget.resizeRowsToContents()

def btnAutoWidth_clicked(self):
    self.tableWidget.resizeColumnsToContents()
  • 设置表头是否显示
def chkBoxRowHeader_clicked(self, checked):
    self.tableWidget.horizontalHeader().setVisible(checked)

def chkBoxColHeader_clicked(self, checked):
    self.tableWidget.verticalHeader().setVisible(checked)
  • 表格是否使用交替底色显示
def chkBoxBackground_clicked(self, checked):
    self.tableWidget.setAlternatingRowColors(checked)
  • 选择模式,每次点击时选择单元格还是每一行
def radioRowSelect_clicked(self):
    selMode = QAbstractItemView.SelectRows
    self.tableWidget.setSelectionBehavior(selMode)

def radioCellSelect_clicked(self):
    selMode = QAbstractItemView.SelectItems
    self.tableWidget.setSelectionBehavior(selMode)
  • 表格是否可以编辑
def chkBoxEditable_clicked(self, checked):
    if checked:
        trig = (QAbstractItemView.DoubleClicked | QAbstractItemView.SelectedClicked)
    else:
        trig = QAbstractItemView.NoEditTriggers
    self.tableWidget.setEditTriggers(trig)
  • 遍历读取表格内容

注意:表格内的须有内容,不然会报错。

def btnGetText_clicked(self):
    try:
        rowCount = self.tableWidget.rowCount()
        colCount = self.tableWidget.columnCount()
        for i in range(rowCount):
            strText = "第 %d 行: " % (i+1)
            for j in range(colCount):
                cellItem = self.tableWidget.item(i, j)
                strText = strText + cellItem.text() + " "
            self.textBrowser.setText(strText)
    except Exception as e:
        print(e)

一个简单的案例介绍QTableWidget的使用。如果需要源代码可关注私聊,感谢支持!!!!

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言