满足条件时更改PyQt5 QTableWidget行样式表

阿玛格·艾尔赛格(Amgad Elsaiegh)

在下面的图片中,我有一个QTableWidget可以查看从一个到多个关系的sqlite数据库中的数据,我设法使用setpan功能合并了一些列输出以正确显示数据,并通过@eyllanesc帮助了此答案

我现在想要实现的是使用背景色(交替颜色)给每个订单上色以提高可读性,尝试使用table.setAlternatingRowColors(True),但是当一个订单包含多个项目时,它会失败!有条件的行样式如何完成?

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *

query_result = [(683, 18, 765, 1.73, '1 ring ruby ring', 685.71, 'vincent percy', 'john joseph croft'), (684, 14, 900, 4.48, '1 earring ear drop', 534.86, 'Ben Otten', 'Anne Cooksley Beltrame'), (684, 14, 900, 2.1, '1 ring cluster ring', 534.86, 'Ben Otten', 'Anne Cooksley Beltrame'), (684, 18, 900, 1.3, '1 ring eternity band', 685.71, 'Ben Otten', 'Anne Cooksley Beltrame'), (685, 14, 200, 3.26, '1 ring promise ring', 534.86, 'raymond bob', 'owen george taylor'), (686, 24, 450, 10.0, '1 bullion Gold bar', 914.28, 'vincent percy', 'owen george taylor'), (687, 14, 345, 4.75, '1 earring Dangles Earring', 534.86, 'Ben Otten', 'dan justin balmers'), (688, 18, 810, 3.1, '1 earring fish hookEarring', 677.14, 'raymond bob', 'jeff david steve'), (688, 21, 810, 2.6, '1 ring ANTIQUE RING', 790, 'raymond bob', 'jeff david steve')]


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("mini_ui")
        self.setGeometry(300, 150, 800, 600)
        self.Ui()

    def Ui(self):
        vbox = QVBoxLayout()
        btn_show_table = QPushButton("view sample data")
        btn_show_table.clicked.connect(self.today_sales_table)
        self.viewTodayTable = QTableWidget()
        self.viewTodayTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.viewTodayTable.setObjectName("viewTodayTable")
        self.viewTodayTable.setColumnCount(8)
        self.viewTodayTable.setRowCount(0)
        self.viewTodayTable.setHorizontalHeaderItem(0, QtWidgets.QTableWidgetItem("Order ID"))
        self.viewTodayTable.setHorizontalHeaderItem(1, QtWidgets.QTableWidgetItem("Karat"))
        self.viewTodayTable.setHorizontalHeaderItem(2, QtWidgets.QTableWidgetItem("Price"))
        self.viewTodayTable.setHorizontalHeaderItem(3, QtWidgets.QTableWidgetItem("Weight"))
        self.viewTodayTable.setHorizontalHeaderItem(4, QtWidgets.QTableWidgetItem("Description"))
        self.viewTodayTable.setHorizontalHeaderItem(5, QtWidgets.QTableWidgetItem("Gram price"))
        self.viewTodayTable.setHorizontalHeaderItem(6, QtWidgets.QTableWidgetItem("Employee"))
        self.viewTodayTable.setHorizontalHeaderItem(7, QtWidgets.QTableWidgetItem("Client"))
        self.viewTodayTable.horizontalHeader().setDefaultSectionSize(130)
        self.viewTodayTable.horizontalHeader().setSortIndicatorShown(True)
        self.viewTodayTable.horizontalHeader().setStretchLastSection(True)
        vbox.addWidget(btn_show_table)
        vbox.addWidget(self.viewTodayTable)
        self.setLayout(vbox)
        self.show()

    def apply_span_to_sales_table(self, row, nrow):
        if nrow <= 1:
            return
        for c in (0, 2, 6, 7):
            self.viewTodayTable.setSpan(row, c, nrow, 1)
            for r in range(row + 1, row + nrow):
                t = self.viewTodayTable.takeItem(r, c)
                del t

    def today_sales_table(self):
        today_result = query_result
        self.viewTodayTable.setRowCount(0)

        last_id = -1
        start_row = 0
        for row_number, row_data in enumerate(today_result):
            self.viewTodayTable.insertRow(row_number)
            current_id, *other_values = row_data
            for column_number, data in enumerate(row_data):
                it = QtWidgets.QTableWidgetItem(str(data))
                self.viewTodayTable.setItem(row_number, column_number, it)
            if last_id != current_id and last_id != -1:
                self.apply_span_to_sales_table(start_row, row_number - start_row)
                start_row = row_number
            last_id = current_id
            if start_row != row_number:
                self.apply_span_to_sales_table(start_row, self.viewTodayTable.rowCount() - start_row)


def main():
    App = QApplication(sys.argv)
    window = Window()
    sys.exit(App.exec())


if __name__ == '__main__':
    main()

我的样品表,我希望每个订单都具有背景色

阿玛格·艾尔赛格(Amgad Elsaiegh)

经过一番搜索,设法以这种方式解决了问题:

  • 如果订单号是奇数,则用color1为行着色,如果偶数则用color 2着色。

我的结果样本

这是工作代码

import sys
from PyQt5 import QtWidgets, QtGui, Qt
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import *


prev_day = "2020-10-15"
query_result = [(683, 18, 765, 1.73, '1 ring ruby ring', 685.71, 'vincent percy', 'john joseph croft'), (684, 14, 900, 4.48, '1 earring ear drop', 534.86, 'Ben Otten', 'Anne Cooksley Beltrame'), (684, 14, 900, 2.1, '1 ring cluster ring', 534.86, 'Ben Otten', 'Anne Cooksley Beltrame'), (684, 18, 900, 1.3, '1 ring eternity band', 685.71, 'Ben Otten', 'Anne Cooksley Beltrame'), (685, 14, 200, 3.26, '1 ring promise ring', 534.86, 'raymond bob', 'owen george taylor'), (686, 24, 450, 10.0, '1 bullion Gold bar', 914.28, 'vincent percy', 'owen george taylor'), (687, 14, 345, 4.75, '1 earring Dangles Earring', 534.86, 'Ben Otten', 'dan justin balmers'), (688, 18, 810, 3.1, '1 earring fish hookEarring', 677.14, 'raymond bob', 'jeff david steve'), (688, 21, 810, 2.6, '1 ring ANTIQUE RING', 790, 'raymond bob', 'jeff david steve')]


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("mini_ui")
        self.setGeometry(300, 150, 800, 600)
        self.Ui()

    def Ui(self):
        vbox = QVBoxLayout()
        btn_show_table = QPushButton("view sample data")
        btn_show_table.clicked.connect(self.today_sales_table)
        self.viewTodayTable = QTableWidget()
        self.viewTodayTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.viewTodayTable.setObjectName("viewTodayTable")
        self.viewTodayTable.setColumnCount(8)
        self.viewTodayTable.setRowCount(0)
        self.viewTodayTable.setHorizontalHeaderItem(0, QtWidgets.QTableWidgetItem("Order ID"))
        self.viewTodayTable.setHorizontalHeaderItem(1, QtWidgets.QTableWidgetItem("Karat"))
        self.viewTodayTable.setHorizontalHeaderItem(2, QtWidgets.QTableWidgetItem("Price"))
        self.viewTodayTable.setHorizontalHeaderItem(3, QtWidgets.QTableWidgetItem("Weight"))
        self.viewTodayTable.setHorizontalHeaderItem(4, QtWidgets.QTableWidgetItem("Description"))
        self.viewTodayTable.setHorizontalHeaderItem(5, QtWidgets.QTableWidgetItem("Gram price"))
        self.viewTodayTable.setHorizontalHeaderItem(6, QtWidgets.QTableWidgetItem("Employee"))
        self.viewTodayTable.setHorizontalHeaderItem(7, QtWidgets.QTableWidgetItem("Client"))
        self.viewTodayTable.horizontalHeader().setDefaultSectionSize(130)
        self.viewTodayTable.horizontalHeader().setSortIndicatorShown(True)
        self.viewTodayTable.horizontalHeader().setStretchLastSection(True)

        vbox.addWidget(btn_show_table)
        vbox.addWidget(self.viewTodayTable)
        self.setLayout(vbox)

        self.show()

    def apply_span_to_sales_table(self, row, nrow):
        if nrow <= 1:
            return
        for c in (0, 2, 6, 7):
            self.viewTodayTable.setSpan(row, c, nrow, 1)
            for r in range(row + 1, row + nrow):
                t = self.viewTodayTable.takeItem(r, c)
                del t

    def today_sales_table(self):
        today_result = query_result
        self.viewTodayTable.setRowCount(0)

        last_id = -1
        start_row = 0
        for row_number, row_data in enumerate(today_result):
            self.viewTodayTable.insertRow(row_number)
            current_id, *other_values = row_data

            for column_number, data in enumerate(row_data):
                it = QtWidgets.QTableWidgetItem(str(data))

                self.viewTodayTable.setItem(row_number, column_number, it)

                if current_id % 2 == 1:
                    self.viewTodayTable.item(row_number, column_number).setBackground(QColor(185, 206, 172))
                    print("whats up")
                elif current_id % 2 == 0:
                    self.viewTodayTable.item(row_number, column_number).setBackground(QColor(193, 171, 206))
                    print("whats up 2")

                if last_id != current_id and last_id != -1:
                    self.apply_span_to_sales_table(start_row, row_number - start_row)
                    start_row = row_number

                last_id = current_id
                if start_row != row_number:
                    self.apply_span_to_sales_table(start_row, self.viewTodayTable.rowCount() - start_row)


def main():
    App = QApplication(sys.argv)
    window = Window()
    sys.exit(App.exec())


if __name__ == '__main__':
    main()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更改Primefaces样式表

来自分类Dev

用户代理的条件样式表

来自分类Dev

更改样式表的paintEvent颜色?

来自分类Dev

PHP XPath更改样式表

来自分类Dev

如何更改QMessageBox按钮的样式表?

来自分类Dev

更改AJAX聊天样式表

来自分类Dev

如何更改链接的样式表?

来自分类Dev

如何使用样式表更改PyQt按钮的位置?

来自分类Dev

选择不同语言时更改样式表。

来自分类Dev

在鼠标悬停时更改QTableWidget行样式

来自分类Dev

样式表在PyQt中无法正常工作

来自分类Dev

在PyQt中获取当前应用样式表的名称

来自分类Dev

样式表更改字体大小但不更改颜色?

来自分类Dev

以正确的方式在WordPress中排队IE条件样式表

来自分类Dev

有条件地使用 .less 样式表

来自分类Dev

QComboBox文本颜色不会随样式表更改

来自分类Dev

Sass:如何使用变量更改导入样式表的路径?

来自分类Dev

sphinx-如何更改文档样式表

来自分类Dev

ASP.NET-动态更改样式表

来自分类Dev

如何使用Dart更改CSS样式表?

来自分类Dev

如何使用JavaScript动态更改级联样式表

来自分类Dev

设置cookie以显示新样式表,但url域名更改

来自分类Dev

动态更改样式表规则选择器

来自分类Dev

使用Ionic Framework单击更改CSS样式表

来自分类Dev

htaccess更改后,css停止用作样式表

来自分类Dev

Laravel Elixir在更改时不合并样式表

来自分类Dev

如何更改样式表的src属性

来自分类Dev

如何使用下拉框更改样式表?

来自分类Dev

Wordpress 主题更改样式表的顺序