horizon rolling

This commit is contained in:
Krad
2022-01-12 18:04:47 +08:00
parent 5973d38758
commit 78c7005f1c
3 changed files with 51 additions and 27 deletions

View File

@@ -6,27 +6,19 @@
#include <QLabel>
#include <QThread>
#include <QDebug>
#include <QShowEvent>
const int ROLL_DISTANCE = 32;
const int WAIT_TIMES = 30;
const int WAIT_TIMES = 60;
RollingMessageWidget::RollingMessageWidget(QWidget *parent) :QWidget(parent){
this->setFixedHeight(36);
this->setFixedWidth(500);
// this->setMinimumWidth(1000);
this->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred);
label_current = new QLabel(this);
label_next = new QLabel(this);
QPoint p1 = this->mapToGlobal({5,2});
label_current->setFixedSize(400, 30);
label_current->show();
label_current->move(p1);
label_current->setText(tr("Message of warn!"));
QPoint p2 = this->mapToGlobal({5,-30});
label_next->setFixedSize(400, 30);
label_next->show();
label_next->move(p2);
label_next->setText(tr("Message2 of warn!"));
timerId = startTimer(100);
}
void RollingMessageWidget::timerEvent(QTimerEvent *e) {
@@ -35,29 +27,34 @@ void RollingMessageWidget::timerEvent(QTimerEvent *e) {
if (rolling) {
//end rolling, reset next
if (rollStep == ROLL_DISTANCE){
std::swap(label_current,label_next);
waitStep = 0;
rolling = false;
QPoint p3 = this->mapToGlobal({5,-30});
p3.setX(label_next->geometry().x());
label_next->move(p3);
QPoint p3 = {ROLL_DISTANCE+5,2};
// p3.setY(label_next->geometry().y());
label_current->move(p3);
// printf("move last to 505,2\n");
std::swap(label_current,label_next);
return;
}
//rolling
QPoint p1 = label_current->geometry().topLeft();
p1.setY(p1.y()+1);
label_current->move(p1);
QPoint p2 = label_next->geometry().topLeft();
p2.setY(p2.y()+1);
label_next->move(p2);
rollStep++;
rollStep+=2;
QPoint p1 = {ROLL_DISTANCE+5 - rollStep,2};
label_next->move(p1);
if (p1.x()-label_current->geometry().x()<=label_current->width()+20)
{
QPoint p2 = {label_current->geometry().x()-2,2};
label_current->move(p2);
}
return ;
}
else{
//有等待的高优先级消息时,不停顿
if (waitStep == WAIT_TIMES || waitPriorityCount > 0){
if (waitStep == WAIT_TIMES || (waitPriorityCount > 0 && waitStep == WAIT_TIMES/3)){
locker.lock();
label_next->setText(getNextMessage());
label_next->setFixedWidth(label_next->text().length()*16);
locker.unlock();
} else{
waitStep++;
@@ -144,3 +141,26 @@ QString RollingMessageWidget::getNextMessage() {
waitStep = 0;
return ret;
}
void RollingMessageWidget::showEvent(QShowEvent *event) {
QWidget::showEvent(event);
if (!init)
{
ROLL_DISTANCE = this->width();
QPoint p1 = {5,2};
label_current->setFixedHeight(30);
label_current->show();
label_current->move(p1);
label_current->setText(tr("Message of warn!"));
label_current->setFixedWidth(label_current->text().length()*16);
QPoint p2 = {ROLL_DISTANCE+5,2};
label_next->setFixedHeight(30);
label_next->show();
label_next->move(p2);
label_next->setText(tr("Message2 of warn!"));
label_next->setFixedWidth(label_next->text().length()*16);
timerId = startTimer(40);
init = true;
}
}

View File

@@ -27,8 +27,10 @@ public:
explicit RollingMessageWidget(QWidget *parent = nullptr);
void setMessageList(const QStringList& message);
void updateMessagePriority(int innerIndex, int priority);
protected:
void timerEvent(QTimerEvent* event) override ;
void showEvent(QShowEvent *event) override ;
QString getNextMessage();
private:
int timerId = -1;
@@ -41,6 +43,8 @@ private:
QLabel* label_next = nullptr;
QList<WarnMessage> messages;
QMutex locker;
bool init = false;
int ROLL_DISTANCE=2000;
};

File diff suppressed because one or more lines are too long