与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);
现在,通过移动你的矩形,你会得到这样的东西:
我有一个黑底白字的 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);
现在,通过移动你的矩形,你会得到这样的东西: