qt 绘制闪烁波浪文本

该实例为qt 自带的demo 实例程序,搜索Wiggly Example 即可

主要原理是利用定时器定时修改字符的色调和y轴位置

class WigglyWidget : public QWidget
{
    Q_OBJECT

public:
    WigglyWidget(QWidget *parent = 0);

public slots:
    void setText(const QString &newText) { text = newText; }

protected:
    void paintEvent(QPaintEvent *event) override;
    void timerEvent(QTimerEvent *event) override;

private:
    QBasicTimer timer;
    QString text;
    int step;
};
WigglyWidget::WigglyWidget(QWidget *parent)
    : QWidget(parent)
{
    setBackgroundRole(QPalette::Midlight);
    setAutoFillBackground(true);

    QFont newFont = font();
    newFont.setPointSize(newFont.pointSize() + 20);
    setFont(newFont);

    step = 0;
    timer.start(60, this);
}
//! [0]

//! [1]
void WigglyWidget::paintEvent(QPaintEvent * /* event */)
//! [1] //! [2]
{
    static const int sineTable[16] = {
        0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38
    };

    QFontMetrics metrics(font());
    //找到中心,计算绘制文本的起点
    //metrics.horizontalAdvance 返回文本的水平像素宽度
    //metrics.ascent() 返回从基线到最低点字符延伸到的距离 metrics.descent() 返回从基线到字符延伸到的最高位置的距离
    //metrics.ascent() - metrics.descent() 文本的像素高度
    int x = (width() - metrics.horizontalAdvance(text)) / 2;
    int y = (height() + metrics.ascent() - metrics.descent()) / 2;
    QColor color;
//! [2]

//! [3]
    QPainter painter(this);
//! [3] //! [4]
    for (int i = 0; i < text.size(); ++i) {
        int index = (step + i) % 16;
        //设定HSV模式下该颜色组件中对应的色调(hue),饱和度(saturation),明亮(lightness),透明度(alpha)
        //每一个文本都不一样,随着定时器的刷新step改变,色调也在改变
        color.setHsv((15 - index) * 16, 255, 191);
        painter.setPen(color);
        //改变每一个文本的y轴,随着定时器的刷新step改变,每一个字符的y轴也在变化;每次绘制一个字符,然后移动x轴到下一个字符
        painter.drawText(x, y - ((sineTable[index] * metrics.height()) / 400),
                         QString(text[i]));
        x += metrics.horizontalAdvance(text[i]);
    }
}
//! [4]

//! [5]
void WigglyWidget::timerEvent(QTimerEvent *event)
//! [5] //! [6]
{
    if (event->timerId() == timer.timerId()) {
        ++step; //定时修改该值,paintEvent 中利用该值更改文本的色调和字符y轴的位置
        update();
    } else {
        QWidget::timerEvent(event);
    }
//! [6]
}

 

Qt3D是一个用于创建3D图形应用程序的模块,它允许你在C++中利用Qt框架开发丰富的3D内容。要在Qt3D中绘制文本,你需要使用`QQuick3DTextElement`类。这个元素负责渲染3D文本,步骤大致如下: 1. 首先,确保已经包含必要的库和头文件: ```cpp #include <QQmlEngine> #include <QQuickView> #include <QQmlComponent> #include <QQuick3DScene> #include <QQuick3DTextElement> ``` 2. 创建一个`QQuick3DScene`实例,并设置其视口: ```cpp QQuick3DScene *scene = new QQuick3DScene; QQuickView *view = new QQuickView; view->setRootObject(scene); ``` 3. 使用`QQmlComponent`动态加载包含3D文本的`QQml`文件或直接创建一个文本元素: ```cpp QQmlComponent component(QStringLiteral("qrc:/main.qml")); if (!component.isError()) { QQmlObject *textItem = component.create(); if (textItem) { textItem->setProperty("text", "Hello World"); scene->rootObject()->childAt(0)->appendChild(textItem); } } ``` 这里假设你有一个名为"main.qml"的`QQml`文件,其中包含了对`QQuick3DTextElement`的使用。 4. 将`QQuickView`连接到窗口上显示3D场景: ```cpp view->show(); ``` 5. `main.qml`中的基本模板可能像这样: ```qml import QtQuick 3D import QtQuick.Window Window { width: 640 height: 480 visible: true 3DView { anchors.fill: parent cameraPosition: Qt.vector3d(0, 0, 5) // 添加3D文本 Text3DElement { id: textElement text: "Your Text Here" font.family: "Arial" color: Qt.white position: Qt.vector3d(0, 0, -1) } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值