之前分享过的等待提示框有用QMovie播放gif图片实现的,也有纯代码实现的,今天再次分享另一种实现方式,如题目所示:QLabel进行图片的切换!
进行用户登录的时候,往往都需要后台线程进行用户信息的验证,而前台需要把对应的信息显示给用户,防止无休止的等待。当然,在其他耗时处理的时候也最好有相同的处理。
好了,相信大家都用过QQ吧!QQ、包括360等都存在相同的做法。
效果如下:
中间的等待效果就是利用图标的切换实现的,那么今天咱们也实现类似的效果:
效果如下:
使用图标如下:
代码如下:
#include "loading_widget.h"
LoadingWidget::LoadingWidget(QWidget *parent)
: QWidget(parent)
{
index = 1;
loading_label = new QLabel();
account_label = new QLabel();
waiting_label = new QLabel();
QPixmap pixmap(QString(":/loginDialog/") + QString::number(index, 10));
loading_label->setFixedSize(pixmap.size());
loading_label->setPixmap(pixmap);
loading_label->setScaledContents(true);
QVBoxLayout *v_layout = new QVBoxLayout();
v_layout->addWidget(account_label);
v_layout->addWidget(waiting_label);
v_layout->setSpacing(15);
v_layout->setContentsMargins(0, 0, 0, 0);
QHBoxLayout *h_layout = new QHBoxLayout();
h_layout->addStretch();
h_layout->addWidget(loading_label);
h_layout->addLayout(v_layout);
h_layout->addStretch();
h_layout->setSpacing(20);
h_layout->setContentsMargins(0, 0, 0, 30);
timer = new QTimer(this);
timer->setInterval(100);
connect(timer, &QTimer::timeout, this, &LoadingWidget::updatePixmap);
this->setLayout(h_layout);
this->translateLanguage();
}
LoadingWidget::~LoadingWidget()
{
}
void LoadingWidget::translateLanguage()
{
waiting_label->setText(tr("waiting"));
}
void LoadingWidget::setAccount(QString account)
{
this->account = account;
}
void LoadingWidget::start(bool is_start)
{
if(is_start)
{
//进行账号的转化,防止过长显示不全,过长用...代替
QString elided_text;
bool is_elided = Util::updateText(account, 200, elided_text);
if(!is_elided)
{
elided_text = account;
}
account_label->setText(tr("hi") + elided_text);
timer->start();
}
else
{
timer->stop();
/**
重新设定等待旋转的图标,因为有可能定时器停止时候图标不在起始位置
保证每次从第一个图标开始旋转
*/
index = 1;
loading_label->setPixmap(QPixmap(QString(":/loginDialog/") + QString::number(index, 10)));
}
}
void LoadingWidget::updatePixmap()
{
//若当前图标下标超过8表示到达末尾,则重新计数
index++;
if(index > 8)
{
index = 1;
}
QPixmap pixmap(":/loginDialog/" + QString::number(index, 10));
loading_label->setPixmap(pixmap);
}