有客自远方来52 2024-04-22 22:28 采纳率: 15.3%
浏览 11
已结题

如何使qt表格中的某一行数据变红?(开发工具-pycharm)

我想实现当检测到有库存量小于5本对应的行变成红色,该如何实现?



def initTable(self):
    """
    根据条件初始化表格
    :return:
    """
    bookName = self.s_bookNameInput.text()
    authorName = self.s_authorInput.text()
    TID = self.s_ComboBox.currentData()
    s_book = Book(bookName, authorName, TID)
    result = bookDao.list(s_book)
    row = 0
    if result:
        row = len(result)
    # 查询库存量小于阈值的图书数量
    low_stock_count = dbModule.check(s_book)
    self.bookListTable.setColumnCount(9)
    self.bookListTable.setRowCount(row)
    self.bookListTable.verticalHeader().setVisible(False)  # 隐藏垂直标题 序号
    self.bookListTable.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)  # 禁止编辑单元格
    self.bookListTable.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
    self.bookListTable.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOn)
    self.bookListTable.setHorizontalHeaderLabels(
        ['图书编号', '图书名称', '图书作者', '作者年龄', '作者性别', '图书价格', '库存量', '图书类别', '图书简介']
    )
    self.bookListTable.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)  # 列头自适应
    self.bookListTable.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)  # 设置选择行为,以行为单位
    # 判断图书库存是否低于阈值,以及将库存量小于阈值的行变红
    for i in range(row):
        for j in range(9):
            data = QTableWidgetItem(str(result[i][j]))
            # 设置单元格内容居中对齐
            data.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
            # 判断库存是否低于阈值,以及将库存量小于阈值的行变红
            if j == 6 and int(result[i][j]) < 5:
                data.setForeground(QtGui.QColor(255, 0, 0))
                QMessageBox.warning(self, '库存不足', '图书库存不足,请及时补货!')
            self.bookListTable.setItem(i, j, data)




  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-22 22:28
    关注

    引自免费微信小程序:皆我百晓生

    为了实现这个功能,你需要在initTable方法中添加一个判断逻辑,检查当前遍历到的图书库存量是否小于5。如果是,则改变这一行(即对应索引i的那一行)的所有单元格的前景色为红色。

    首先,在导入模块时,确保已经导入了QtGuiQtCore模块。接下来,我会提供修改后的代码,包含所需更改的部分:

    from PyQt5.QtWidgets import QApplication, QMessageBox
    from PyQt5.QtCore import Qt, QAbstractItemView, QSizePolicy, QHeaderView
    from PyQt5.QtGui import QColor, QTableWidgetItem
    
    # ... (其他代码保持不变)
    
    def initTable(self):
        """
        根据条件初始化表格
        :return:
        """
        # ... (其他代码保持不变)
    
        # 在for循环之前,定义一个列表用于存储需要变红的行索引
        red_rows = []
    
        for i in range(row):
            for j in range(9):
                data = QTableWidgetItem(str(result[i][j]))
                data.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
    
                # 判断库存是否低于阈值,将需要变红的行索引加入red_rows列表
                if j == 6 and int(result[i][j]) < 5:
                    red_rows.append(i)
                    QMessageBox.warning(self, '库存不足', '图书库存不足,请及时补货!')
    
                self.bookListTable.setItem(i, j, data)
    
        # 在for循环之后,遍历red_rows列表,改变这些行所有单元格的前景色为红色
        for index in red_rows:
            for col in range(9):  # 遍历每一列
                item = self.bookListTable.item(index, col)
                if item is not None:
                    item.setForeground(QColor(255, 0, 0))
    
    # ... (其他代码保持不变)
    

    这段代码首先创建了一个名为red_rows的列表,用于存储需要变红的行索引。然后在遍历过程中,如果发现库存量小于5,就将该行的索引添加到red_rows列表中。遍历结束后,再遍历red_rows列表,并且改变列表中每个索引对应行的所有单元格颜色为红色。这样就能实现实现目标效果。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月23日
  • 创建了问题 4月22日

悬赏问题

  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式
  • ¥15 如果要做一个老年人平板有哪些需求