修复开机没有墨水也进自检的问题;为状态label添加长文本滚动逻辑
This commit is contained in:
+109
-1
@@ -34,6 +34,8 @@
|
||||
#include "scene/PicCounterItem.h"
|
||||
#include <QElapsedTimer>
|
||||
#include <QScroller>
|
||||
#include <QFontMetrics>
|
||||
#include <QPainter>
|
||||
|
||||
extern MyInputMethod *myInputMethod;
|
||||
unsigned char test_flag,open_close;
|
||||
@@ -102,6 +104,15 @@ MainWidget::MainWidget(QWidget* parent)
|
||||
m_reclaimOpenBtnFlashTimer = new QTimer(this);
|
||||
connect(m_reclaimOpenBtnFlashTimer, &QTimer::timeout, this, &MainWidget::onReclaimOpenBtnFlashTimerTimeout);
|
||||
m_reclaimOpenBtnFlashTimer->setInterval(500);
|
||||
|
||||
m_nozzleStateMarqueeTimer = new QTimer(this);
|
||||
m_nozzleStateMarqueeTimer->setInterval(30);
|
||||
connect(m_nozzleStateMarqueeTimer, &QTimer::timeout, this, &MainWidget::onNozzleStateMarqueeTimeout);
|
||||
|
||||
if (ui.lb_nozzleState) {
|
||||
ui.lb_nozzleState->installEventFilter(this);
|
||||
ui.lb_nozzleState->setText(" ");
|
||||
}
|
||||
}
|
||||
|
||||
MainWidget::~MainWidget()
|
||||
@@ -391,7 +402,104 @@ void MainWidget::setRunStatus(QString str)
|
||||
return;
|
||||
}
|
||||
|
||||
ui.lb_nozzleState->setText(str);
|
||||
updateNozzleStateMarquee(str);
|
||||
}
|
||||
|
||||
void MainWidget::stopNozzleStateMarquee()
|
||||
{
|
||||
if (m_nozzleStateMarqueeTimer && m_nozzleStateMarqueeTimer->isActive()) {
|
||||
m_nozzleStateMarqueeTimer->stop();
|
||||
}
|
||||
m_nozzleStateFullText.clear();
|
||||
m_nozzleStateMarqueeOffsetPx = 0;
|
||||
m_nozzleStateMarqueeTextWidth = 0;
|
||||
m_nozzleStateMarqueeGapPx = 0;
|
||||
m_nozzleStateMarqueeEnabled = false;
|
||||
if (ui.lb_nozzleState) {
|
||||
ui.lb_nozzleState->setText(QString());
|
||||
ui.lb_nozzleState->update();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWidget::updateNozzleStateMarquee(const QString& str)
|
||||
{
|
||||
if (!ui.lb_nozzleState)
|
||||
return;
|
||||
|
||||
QString text = str;
|
||||
if (text.isEmpty()) {
|
||||
stopNozzleStateMarquee();
|
||||
ui.lb_nozzleState->setText(text);
|
||||
return;
|
||||
}
|
||||
|
||||
QFontMetrics fm(ui.lb_nozzleState->font());
|
||||
const int labelWidth = ui.lb_nozzleState->contentsRect().width();
|
||||
if (labelWidth <= 0 || fm.horizontalAdvance(text) <= labelWidth) {
|
||||
stopNozzleStateMarquee();
|
||||
ui.lb_nozzleState->setText(text);
|
||||
return;
|
||||
}
|
||||
|
||||
// 长文本循环滚动,按像素偏移绘制
|
||||
m_nozzleStateFullText = text;
|
||||
m_nozzleStateMarqueeTextWidth = fm.horizontalAdvance(text);
|
||||
m_nozzleStateMarqueeGapPx = qMax(20, labelWidth / 2);
|
||||
m_nozzleStateMarqueeOffsetPx = 0;
|
||||
m_nozzleStateMarqueeEnabled = true;
|
||||
ui.lb_nozzleState->setText(QString());
|
||||
ui.lb_nozzleState->update();
|
||||
|
||||
if (!m_nozzleStateMarqueeTimer->isActive()) {
|
||||
m_nozzleStateMarqueeTimer->start();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWidget::onNozzleStateMarqueeTimeout()
|
||||
{
|
||||
if (!m_nozzleStateMarqueeEnabled || !ui.lb_nozzleState) {
|
||||
return;
|
||||
}
|
||||
|
||||
const int labelWidth = ui.lb_nozzleState->contentsRect().width();
|
||||
if (labelWidth <= 0 || m_nozzleStateMarqueeTextWidth <= 0) {
|
||||
stopNozzleStateMarquee();
|
||||
return;
|
||||
}
|
||||
|
||||
const int totalWidth = m_nozzleStateMarqueeTextWidth + m_nozzleStateMarqueeGapPx;
|
||||
m_nozzleStateMarqueeOffsetPx += 1;
|
||||
if (m_nozzleStateMarqueeOffsetPx >= totalWidth) {
|
||||
m_nozzleStateMarqueeOffsetPx = 0;
|
||||
}
|
||||
|
||||
ui.lb_nozzleState->update();
|
||||
}
|
||||
|
||||
bool MainWidget::eventFilter(QObject *watched, QEvent *event)
|
||||
{
|
||||
if (watched == ui.lb_nozzleState && m_nozzleStateMarqueeEnabled) {
|
||||
if (event->type() == QEvent::Paint) {
|
||||
QPainter painter(ui.lb_nozzleState);
|
||||
painter.setRenderHint(QPainter::TextAntialiasing, true);
|
||||
|
||||
const QRect rect = ui.lb_nozzleState->contentsRect();
|
||||
painter.fillRect(rect, ui.lb_nozzleState->palette().window());
|
||||
painter.setPen(ui.lb_nozzleState->palette().color(QPalette::WindowText));
|
||||
painter.setFont(ui.lb_nozzleState->font());
|
||||
|
||||
const QFontMetrics fm(ui.lb_nozzleState->font());
|
||||
const int baseline = (rect.height() + fm.ascent() - fm.descent()) / 2;
|
||||
const int startX = rect.left() - m_nozzleStateMarqueeOffsetPx;
|
||||
const int textY = rect.top() + baseline;
|
||||
|
||||
painter.drawText(startX, textY, m_nozzleStateFullText);
|
||||
painter.drawText(startX + m_nozzleStateMarqueeTextWidth + m_nozzleStateMarqueeGapPx, textY, m_nozzleStateFullText);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return QWidget::eventFilter(watched, event);
|
||||
}
|
||||
|
||||
/* 生成字模数据 */
|
||||
|
||||
Reference in New Issue
Block a user