【问题标题】:how to change label color when intersecate with an image in qt?与qt中的图像相交时如何更改标签颜色?
【发布时间】:2020-08-27 03:47:41
【问题描述】:

我有一个黑色背景上带有白色文本的 Qlabel。在这个屏幕中,我创建了一个改变尺寸的白色矩形,通过:

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

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

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

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

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

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

#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();
}
}

和标题:

#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 文件中只有一个标签和一个图形视图元素(名称未更改),背景为黑色

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

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

【问题讨论】:

  • 我添加了示例,如果需要其他信息,请询问,我会尽量让事情更清楚
  • 你使用QLabel而不是QGraphicsTextItem有什么原因吗?
  • 不是真的,我是 QT 新手,我可以用 QGraphicsTextItem 解决我的问题吗?
  • 如果您使用QGraphicsScene,最好使用QGraphicsItem,因为它就是为此而设计的。你绝对想要'CCC'完全是白色的吗?因为我有一个解决方案,但文本有点灰色 du to raster op
  • 如果它有点灰也可以,实际上我的用例说它必须是白色或类似的,但它希望它在交叉路口完全可见。如果您将其发布为答案,我可以投票给您作为最佳回复

标签: c++ qt qwidget qlabel


【解决方案1】:

您可以创建自己的实现来更改项目的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);
    }
};

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

// 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);

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

【讨论】:

  • 我试过了,效果很好。我会研究一下你在那里做了什么,但我真的很感谢你的帮助,谢谢=)。祝你有美好的一天
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 2017-07-09
相关资源
最近更新 更多