QT界面图片插入Table、Tree后变化

QT界面图片颜色叠加导致图片中部分内容颜色变化。

通过svg动态生成一个pixmap对象,将这个对象初始化到QICon中,添加到QTableWidget、QTreeWidget,这些QTableWidget、QTreeWidget设置了png底图,图片中的单像素线条颜色与背景色进行了叠加,导致颜色变化。如何实现颜色不变?
变色效果如下图:

原始图

img


添加后图

img

QGraphicsScene *scene = new QGraphicsScene(this);
QColor color = QColor("red"); // 设置要保持不变的颜色
scene->setBrush(color);



QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap);
item->setBrush(color);
scene->addItem(item);

  图层叠加,显示效果肯定会生发变化。设计时应考虑到颜色叠加的问题,提前“中庸调节”,取舍到“最佳”契合点。(仅是个人观点:对学习和运用色彩的感悟而妄言,可能有失偏颇。😂)


  您贴图的效果,把背景图片色彩饱和降一点,颜色稍浅一些,可能叠加效果会理想一点点。😋


  • 这篇博客: Qt中QTreeWidget根据数据库(QTableWidget)内容动态构建目录中的 三.代码部分 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 新建项目用的是Qt Widget Application, 基类选择的是带ui界面的Widget,首先在ui界面中拖入一个QTreeWidget和一个TableWidget,QtreeWidget改下列名就可以了,然后在tableWidget中把内容信息填好。在这里插入图片描述
    widget.h

    #define WIDGET_H
    
    #include <QWidget>
    #include <QDebug>
    #include <QTreeWidget>
    #include <QTreeWidgetItem>
    #include <QTableWidget>
    #include <QTableWidgetItem>
    #include <QList>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
    private:
        Ui::Widget *ui;
        //枚举类型,表示列号
        enum    tableColNum{colItem0=0, colItem1=1,colItem2=2};
        void initTree();
        void departTree(int row,QTreeWidgetItem* item);
        QList<QTableWidgetItem*> findItem(QString& , int);
    };
    
    #endif // WIDGET_H
    

    widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        //首先要给taleWidget没有内容的Item new一个空间,不然访问它就是非法的(段错误)
        QTableWidgetItem* item = new QTableWidgetItem;
        ui->tableWidget->setItem(0,2,item);
        item = new QTableWidgetItem;
        ui->tableWidget->setItem(1,2,item);
        initTree();
        ui->treeWidget->expandAll();
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::initTree()
    {
        QList<QTableWidgetItem*> list;
        QString str = "";
        list = findItem(str,colItem2);
        int row;
        QString DEPART_NAME;
        if(!list.isEmpty()){
            for(int i = 0; i < list.size(); ++i){
                row = list.at(i)->row();
                DEPART_NAME = ui->tableWidget->item(row,colItem1)->text();
                QTreeWidgetItem* item = new QTreeWidgetItem(ui->treeWidget,QStringList(DEPART_NAME));
                ui->treeWidget->addTopLevelItem(item);
                departTree(row,item);
            }
        }
    }
    
    void Widget::departTree(int fatherRow, QTreeWidgetItem *item)
    {
        //传进来的是treeWidget的父节点,和他的信息所对应的行号
        //根据父节点colItem0行的部门名称(DEPART_NAME),去表中搜索他的小弟:
        //上级部门ID(DEPART_UPPER_DEPT)
        QList<QTableWidgetItem*> list;
        QString DEPART_ID = ui->tableWidget->item(fatherRow,colItem0)->text();
        list = findItem(DEPART_ID,colItem2);
        int sonRow;
        QString DEPART_NAME;
        if(!list.isEmpty()){
            for(int i = 0; i < list.size();++i){
                sonRow = list.at(i)->row();
                DEPART_NAME = ui->tableWidget->item(sonRow,colItem1)->text();
                QTreeWidgetItem* newitem = new QTreeWidgetItem(item,QStringList(DEPART_NAME));
                item->addChild(newitem);
                departTree(sonRow,newitem);
            }
        }
    }
    
    QList<QTableWidgetItem*> Widget::findItem(QString& target,int column)
    {
        QList<QTableWidgetItem*> list;
        QString str;
        int row = ui->tableWidget->rowCount();
        int col = ui->tableWidget->columnCount();
        for(int i = 0; i < row; ++i){
            for(int j = 0; j < col;++j ){
                if(j != column) continue;
                str = ui->tableWidget->item(i,j)->text();
                if(target == str){
                    list.push_back(ui->tableWidget->item(i,j));
                }
            }
        }
        return list;
    }
    
    

改QPainter的混合模式:

QPixmap pixmap(100, 100);
pixmap.fill(Qt::transparent); // 用透明颜色填充图像

QPainter painter(&pixmap);

painter.setCompositionMode(QPainter::CompositionMode_SourceOver); // 改混合模式
painter.setBrush(QColor(255, 0, 0, 128)); // 设置画刷颜色
painter.drawRect(0, 0, 100, 100); // 画红色的矩形

painter.setBrush(QColor(0, 0, 255, 128)); // 更改画刷颜色
painter.drawRect(0, 0, 50, 100); // 画半透明的蓝色矩形

painter.end(); // 结束绘制

QIcon icon(pixmap); // 创建一个
用该图像的图标


因为QIcon的mode属性导致的颜色叠加。可以尝试设置QIcon::Normal模式,或者使用QPixmap::fromImage方法将svg转换为QImage,然后再转换为QPixmap,这样可能可以避免颜色叠加的问题。你试一下
参考 https://blog.csdn.net/u012377293/article/details/108606854

PyQt5 QTable插入图片并动态更新

图片+文字

row = 0  # 行号
col = 1  # 列号
icon = QTableWidgetItem(QIcon("../image/a.png"), "Waiting")  # 图片+文字
self.tblName.setItem(row, col, icon)  # self → Ui_form
 
# 动态刷新,整个方法必须放在主线程内,自启线程无效果
QApplication.processEvents()  


要实现颜色不变,可以:在生成SVG时,可以为图像添加透明度属性,例如Alpha通道。这样,在将SVG转换为PIXMAP对象时,可以保留图像的不透明度信息。然后,将该PIXMAP对象添加到QTableWidget或QTreeWidget时,可以通过设置背景色的透明度来避免颜色叠加。

叠加图片时,设置透明度属性控制

要实现颜色不变,可以采取以下几种方向:
1、如果你使用的是SVG格式的图像,可以在SVG文件中指定图像的颜色,并确保线条颜色与背景色不会叠加。这样,在将SVG文件转换为PIXI对象并添加到QTableWidget或QTreeWidget时,颜色变化的问题就不会出现。
2、如果你的图像不支持SVG格式,可以尝试将PNG底图的背景设置为透明色。这样,当你将PIXI对象添加到QTableWidget或QTreeWidget时,底图的背景将不会与线条颜色叠加,从而保持颜色不变。
3、如果你的图像中的线条颜色与背景色过于相似,可以尝试调整线条颜色的饱和度或亮度,以使其在叠加时更加明显。可以使用图像处理库(如OpenCV)或图形界面工具(如GIMP或Photoshop)来对图像进行这种调整。