QT界面图片颜色叠加导致图片中部分内容颜色变化。
通过svg动态生成一个pixmap对象,将这个对象初始化到QICon中,添加到QTableWidget、QTreeWidget,这些QTableWidget、QTreeWidget设置了png底图,图片中的单像素线条颜色与背景色进行了叠加,导致颜色变化。如何实现颜色不变?
变色效果如下图:
原始图
QGraphicsScene *scene = new QGraphicsScene(this);
QColor color = QColor("red"); // 设置要保持不变的颜色
scene->setBrush(color);
QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap);
item->setBrush(color);
scene->addItem(item);
图层叠加,显示效果肯定会生发变化。设计时应考虑到颜色叠加的问题,提前“中庸调节”,取舍到“最佳”契合点。(仅是个人观点:对学习和运用色彩的感悟而妄言,可能有失偏颇。😂)
您贴图的效果,把背景图片色彩饱和降一点,颜色稍浅一些,可能叠加效果会理想一点点。😋
新建项目用的是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)来对图像进行这种调整。