qt 实现一个好看的等待动画
时间: 2023-07-13 19:09:41 浏览: 136
Qt提供了多种方式实现等待动画,其中最常用的是使用QMovie类和QProgressBar类。
1. 使用QMovie类
QMovie类可以加载GIF图像,并且可以循环播放,非常适合用来实现等待动画。以下是一个使用QMovie来实现等待动画的示例代码:
```cpp
QMovie *movie = new QMovie(":/loading.gif");
QLabel *label = new QLabel(this);
label->setMovie(movie);
movie->start();
```
其中,`:/loading.gif`是指在Qt资源文件中的GIF图像路径。
2. 使用QProgressBar类
QProgressBar类是一个进度条控件,可以用来展示任务完成的进度。当我们需要实现等待动画时,可以将进度条设置为不确定模式,即不显示具体的进度值,而是一直滚动,示例代码如下:
```cpp
QProgressBar *progressBar = new QProgressBar(this);
progressBar->setRange(0, 0);
```
其中,`setRange(0, 0)`表示设置进度条的范围为0到0,即不确定模式。
除了上面两种方式,还可以使用QLabel、QPixmap等控件结合定时器等方式实现等待动画,具体实现方式可以根据需求进行选择。
相关问题
qt 实现一个好看的等待动画,不用qmovie. 用动画类和状态机
好的,以下是一个使用 Qt 动画类和状态机实现的等待动画示例:
首先,创建一个新的 Qt Widgets 应用程序项目,然后在主窗口的 UI 界面中添加一个 QLabel 控件,用于显示等待动画。
在头文件中,包含如下的 Qt 类:
```cpp
#include <QWidget>
#include <QStateMachine>
#include <QState>
#include <QPropertyAnimation>
```
接着,在主窗口的构造函数中初始化状态机和动画,并将它们连接起来。示例代码如下:
```cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化状态机
QStateMachine *stateMachine = new QStateMachine(this);
// 创建两个状态
QState *state1 = new QState();
QState *state2 = new QState();
// 添加状态到状态机
stateMachine->addState(state1);
stateMachine->addState(state2);
// 设置初始状态
stateMachine->setInitialState(state1);
// 创建动画对象
QPropertyAnimation *animation = new QPropertyAnimation(ui->label, "text");
animation->setDuration(2000); // 动画持续时间 2 秒钟
animation->setStartValue("");
animation->setEndValue("Loading...");
// 将动画对象添加到状态机的状态转换中
state1->addTransition(ui->startButton, &QPushButton::clicked, state2);
state2->addTransition(ui->stopButton, &QPushButton::clicked, state1);
state1->addAnimation(animation);
state2->addAnimation(animation);
// 启动状态机
stateMachine->start();
}
```
在上面的代码中,我们创建了一个 QStateMachine 类型的状态机对象,并创建了两个状态 state1 和 state2。我们将 QLabel 控件的文本属性与 QPropertyAnimation 类型的动画对象的属性 text 相关联,并设置了动画的持续时间为 2 秒钟。然后,我们将动画对象添加到状态机的状态转换中,并启动状态机。
最后,在主窗口的析构函数中,删除状态机和动画对象,示例代码如下:
```cpp
MainWindow::~MainWindow()
{
delete ui;
delete stateMachine;
delete animation;
}
```
运行程序,点击 Start 按钮,即可看到等待动画效果。点击 Stop 按钮,动画会停止。
用qt代码实现遮罩层实现等待加载效果
好的,下面是使用Qt代码实现遮罩层实现等待加载效果的示例代码:
```python
from PyQt5.QtCore import QSize, Qt, QThread, pyqtSignal
from PyQt5.QtGui import QMovie
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
class LoadingMask(QWidget):
def __init__(self, parent):
super().__init__(parent)
self.setFixedSize(parent.size())
self.setStyleSheet('background-color: rgba(0, 0, 0, 128);')
self.movie = QMovie('loading.gif')
self.movie.setScaledSize(QSize(100, 100))
label = QLabel(self)
label.setMovie(self.movie)
label.move(self.width() // 2 - 50, self.height() // 2 - 50)
def start(self):
self.movie.start()
def stop(self):
self.movie.stop()
self.hide()
class WorkerThread(QThread):
finished = pyqtSignal()
def run(self):
# 模拟耗时操作
import time
time.sleep(5)
self.finished.emit()
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('遮罩层实现等待加载效果')
self.resize(500, 500)
self.loading_mask = LoadingMask(self)
self.worker_thread = WorkerThread(self)
self.worker_thread.finished.connect(self.on_finished)
def on_finished(self):
self.loading_mask.stop()
def do_something(self):
self.loading_mask.start()
self.worker_thread.start()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
window.do_something()
sys.exit(app.exec_())
```
这个示例代码中,首先定义了一个LoadingMask类,它继承自QWidget,用于实现遮罩层和等待加载动画的显示和隐藏。在LoadingMask的构造函数中,设置其大小和背景颜色,并创建一个QMovie用于加载动画gif,然后将QMovie放置在遮罩层中央。start和stop方法用于启动和停止动画和遮罩层的显示。
MainWindow继承自QWidget,是主窗口类。它包含了一个LoadingMask实例和一个WorkerThread实例。do_something方法用于启动等待加载的操作,它首先调用LoadingMask的start方法显示遮罩层和加载动画,然后启动WorkerThread执行耗时操作。WorkerThread是QThread的子类,用于模拟耗时操作,它执行完成后会发送一个finished信号。MainWindow的on_finished方法用于接收WorkerThread发送的finished信号,并调用LoadingMask的stop方法隐藏遮罩层和动画。
在主函数中,创建一个QApplication实例和MainWindow实例,然后调用MainWindow的show方法显示主窗口,并调用do_something方法启动等待加载的操作。最后调用QApplication的exec_方法进入Qt事件循环。