在QT C ++中逐渐消失的小部件

马辛

我想制作一个简单的QWidget,它是一个简单的矩形淡出。主要问题是实际上每次在同一位置上进行涂装会产生相反的效果,从而使颜色更浓。有什么方法可以实现此功能?您能否提供一些简单的例子?

我的代码:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    void paintEvent(QPaintEvent*);
    ~Widget();

private:
    Ui::Widget *ui;
    int alfa;
    int i;
    QTimer time;

};

#endif // WIDGET_H

`

和cpp:

#include "widget.h"
#include "ui_widget.h"
#include <QColor>
#include <QPainter>
#include <QBrush>
#include <QTimer>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent,Qt::Popup | Qt::FramelessWindowHint),
    ui(new Ui::Widget),
    time()
{
    ui->setupUi(this);
    setAttribute(Qt::WA_NoSystemBackground, true);
    setAttribute(Qt::WA_TranslucentBackground, true);
    setAttribute(Qt::WA_PaintOnScreen);
    time.setInterval(500);
    time.start();
    connect(&time,SIGNAL(timeout()),this,SLOT(update()));
    alfa=100;
    i=0;

}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

    int rectBase = height();

    QColor c(255,0,255);
    alfa=alfa-(i*10);
    c.setAlpha(alfa);
    qDebug()<<c.alpha();
    i++;

    painter.setBrush(QBrush(c));
    painter.drawRect(0, 0, width(),height());


}

Widget::~Widget()
{
    delete ui;
}
监狱猴子

您不应该依赖于QWidget::paintEvent()更改您的Alpha级别,因为它的update()调用程度可能比您想要的少或多(多次调用可能只会导致一次调用,paintEvent()并且paintEvent()在您不期望的情况下可能会被调用)。

因此,获得结果的一种更可靠的方法是有一个单独的插槽,您可以在其中降低Alpha电平,然后调用update()您的类定义可能如下所示:

class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget( QWidget * inParent );

private:
    void paintEvent(QPaintEvent *);

private slots:
    void animate();

private:
    QTimer * mTimer;
    int mAlpha;
};

和声明:

Widget::Widget( QWidget * inParent )
    :
      QWidget( inParent ),
      mTimer( new QTimer( this ) ),
      mAlpha( 255 )
{
    setAttribute(Qt::WA_NoSystemBackground, true);
    setAttribute(Qt::WA_TranslucentBackground, true);
    setAttribute(Qt::WA_PaintOnScreen);
    mTimer->setInterval( 40 );
    mTimer->setSingleShot( false );
    connect( mTimer, SIGNAL(timeout()), this, SLOT(animate()) );
    mTimer->start();
}

void
Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setBrush( QColor(255,0,255,mAlpha ) );
    painter.drawRect(rect());
}

void
Widget::animate()
{
    if ( mAlpha > 0 )
    {
        mAlpha -= 3;
    }
    else
    {
        mTimer->stop();
    }
    update();
}

请注意,我确实减少了计时器的间隔。您只update()每半秒钟打电话一次。这通常不会产生平滑的动画。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在QT C ++中逐渐消失的小部件

来自分类Dev

Qt:文本中的小部件

来自分类Dev

QT C ++-如何在另一个类中引用窗口小部件

来自分类Dev

如何在Qt / C ++中构建自定义的本机OSX Webkit小部件?

来自分类Dev

使用 Qt GUI 编写 c++ dll,在自定义小部件中显示失败

来自分类Dev

始终对隐藏的小部件具有焦点策略?(Qt C ++)

来自分类Dev

Qt C ++-访问动态创建的小部件(QLineEdit)

来自分类Dev

Qt / C ++-在关闭一个小部件时关闭两个小部件

来自分类Dev

在Qt中获取小部件的HWND

来自分类Dev

Qt在布局中自动排列小部件

来自分类Dev

Qt小部件中的选择区域

来自分类Dev

Qt在resizeEvent中添加子小部件

来自分类Dev

访问在Qt Designer中添加的小部件

来自分类Dev

在Qt中获取小部件的HWND

来自分类Dev

Qt小部件中的选择区域

来自分类Dev

访问在Qt Designer中添加的小部件

来自分类Dev

Qt小部件在布局中重叠

来自分类Dev

在 Qt 中自动调整小部件的大小

来自分类Dev

父母Qt小部件

来自分类Dev

交换Qt小部件

来自分类Dev

标记Qt小部件

来自分类Dev

标记Qt小部件

来自分类Dev

在 QT Creator 中编辑多个 QT 小部件 (GUI)

来自分类Dev

如何从Qt中的布局中删除小部件

来自分类Dev

在Qt中的线程中设置小部件标签文本

来自分类Dev

QT清除小部件内容

来自分类Dev

Qt“直通”或“容器”小部件

来自分类Dev

从Qt Designer调用小部件

来自分类Dev

Qt小部件布局背景