要在Qt Widget中绘制动态图标,您需要使用QPainter和QWidget的paintEvent()函数。以下是一个简单的示例:
首先,在你的QWidget子类中定义一个QPixmap成员变量,用于保存动态图像序列:
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *event) override;
private:
QPixmap m_animation;
};
接下来,实现MyWidget类的构造函数,加载动画帧并将它们存储到m_animation中:
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
// Load animation frames
QList<QPixmap> frames;
for (int i = 1; i <= 10; ++i) {
QString filename = QString(":/frames/frame%1.png").arg(i);
QPixmap frame(filename);
if (!frame.isNull()) {
frames.append(frame);
}
}
// Create animation pixmap
int width = frames.first().width();
int height = frames.first().height();
m_animation = QPixmap(width, height * frames.count());
QPainter painter(&m_animation);
for (int i = 0; i < frames.count(); ++i) {
painter.drawPixmap(0, i * height, frames.at(i));
}
}
最后,在paintEvent()函数中使用QPainter绘制动画帧。可以使用QTimer定期刷新屏幕以显示不同的帧:
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
// Draw animation frame
static int frameIndex = 0;
QRect source(0, frameIndex * m_animation.height() / 10,
m_animation.width(), m_animation.height() / 10);
painter.drawPixmap(rect(), m_animation, source);
// Advance animation frame
frameIndex = (frameIndex + 1) % 10;
// Schedule next repaint
QTimer::singleShot(50, this, SLOT(update()));
}
在上述代码中,paintEvent()函数使用m_animation的不同部分来绘制动画帧。每次调用时,它都会绘制下一个帧并更新frameIndex变量以指向下一个帧。最后,它使用QTimer计划下一次repaint()调用,并将其连接到update()槽。这确保了widget定期刷新以显示动态图标。
注意:此示例假设您有一组PNG文件作为动画的帧,并且已经将它们存储在Qt资源文件中。如果您需要使用其他类型的图像或从其他位置加载图像,请相应地修改构造函数中的代码。