与qt中的图像相交时如何更改标签颜色?

how to change label color when intersecate with an image in qt?

我有一个黑底白字的 Qlabel。在此屏幕中,我创建了一个白色矩形,它通过以下方式改变尺寸:

QGraphicsRectItem* rect;
rect->setRect(0, START_HEIGHT, 0+variable, HEIGHT);

通过调用修改 "variable" 的值并重新创建矩形的函数,我改变了它的大小。 这个矩形是白色的,当它碰巧到达标签时,最后一个消失(白色对白色)。

我想知道当标签与矩形相交时,如何将标签内的文本颜色变为黑色(只有交叉点,因为如果所有标签都变成黑色,只有超过的部分矩形将是可见的)。

这是我在 google 上找到的一个示例(寻找 PorterDuff,它似乎在 android 上做了类似的事情)。它是不同的,但可以作为一个很好的例子来形象化我想要获得的东西。

如果您有一些解决方案或一些提示,请提前致谢=)

编辑:这是一个最小且可重现的示例

#include "mainwindow.h"
#include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->label->raise();
ui->label->setText("CCC");

//set scene
    scene= new QGraphicsScene();
    ui->graphicsView->setScene(scene);
    ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->graphicsView->setStyleSheet("background: transparent;");
    ui->graphicsView->setFrameShadow(QFrame::Raised);


timers = new QTimer(this);
connect(timers, &QTimer::timeout, this,&MainWindow::grow_my_child);
timers->start(10);
}
void MainWindow::grow_my_child()
{
static int x=0;
rect = new QGraphicsRectItem();

rect->setBrush(Qt::white);
rect->setPen(Qt::NoPen);

scene->addItem(rect);

rect->setVisible(true);
rect->setRect(0,0,0+x,200);
x++;

if(x ==500){
   timers->stop();
}
}

和 header:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <Qlabel>
#include <QGraphicsOpacityEffect>
#include <QPropertyAnimation>
#include <QTimer>
#include <QDebug>
#include <QPen>
#include <QFontDatabase>
#include <QSize>
#include <QDateTime>
#include <QParallelAnimationGroup>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui;
QTimer * timers;
QGraphicsScene* scene;
QGraphicsRectItem* rect;
void grow_my_child();

};
#endif // MAINWINDOW_H

在.ui文件中只有一个label和一个graphicview元素(没有改名字),背景是黑色

矩形到达标签后的结果是:

文字是"CCC",我想想象一下半黑半白

您可以创建自己的实现来更改项目的 QPainter::compositionMode()

class TextItem : public QGraphicsTextItem
{
public:
    TextItem(const QString &text, QGraphicsItem *parent = nullptr)
        : QGraphicsTextItem(text, parent){ setZValue(100); }
    TextItem(QGraphicsItem *parent = nullptr)
        : QGraphicsTextItem(parent){ setZValue(100); }
private:
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) override {
        painter->setCompositionMode(QPainter::CompositionMode_Difference);
        QGraphicsTextItem::paint(painter, option, widget);
    }
};

有了这个class,你只需要写几行:

// Add your rectangle
QGraphicsRectItem *rectitem = scene->addRect(-50, -50, 100, 50, QPen(Qt::white), Qt::white);
// Make your rectangle movable for test with your mouse
rectitem->setFlag(QGraphicsItem::ItemIsMovable, true);

// Add your text
TextItem *txtitem = new TextItem("CCC");
txtitem->setFont(QFont("Ubuntu", 50, 80));
txtitem->setDefaultTextColor(Qt::white);
scene->addItem(txtitem);

现在,通过移动你的矩形,你会得到这样的东西: