#include "PicCounterItem.h" #include #include #include #include #include QHash defCharWidthMap; int charWidth(QFont font, int height) { font.setLetterSpacing(QFont::AbsoluteSpacing, 0); font.setPixelSize(height); QFontMetrics fm(font); return fm.horizontalAdvance("0123456789") / 10; } PicCounterItem::PicCounterItem(QGraphicsItem *parent, QGraphicsScene *scene, const SourceType type) :PicTextItem(parent, scene, type) { } QVariant PicCounterItem::source() { return PicTextItem::source(); } void PicCounterItem::setSource(QVariant var) { PicTextItem::setSource(var); setCounter(counterType(), digitalNum()); } void PicCounterItem::setCounter(COUNTER_TYPE type, int digitalNum) { // 直接修改字体,生成新的HTML占位图 auto font = this->font(); QString fontname = font.family(); int pixelSize = 9; QString numStr = ""; for(int i = fontname.length() - 1; i >= 0; --i) { if(fontname[i].isDigit()) { numStr.prepend(fontname[i]); } else { break; } } if(!numStr.isEmpty()) { pixelSize = numStr.toInt(); } font.setFamily(fontname); font.setPixelSize(pixelSize); font.setWeight(false && (pixelSize<=16) ? QFont::Bold : QFont::Normal); font.setLetterSpacing(QFont::AbsoluteSpacing, 0); QFontMetrics fontMetrics(font); int width = (fontMetrics.horizontalAdvance("0123456789")) / 10; int height = font.pixelSize(); width += letterSpace(); setHtml(QString("") .arg(type).arg(digitalNum).arg(height + 1).arg(width*digitalNum).arg(type)); m_counterType = type; m_digitalNum = digitalNum; m_digitalImg = QImage(QString(":/%1/image/digitalWidth%2.bmp").arg(type).arg(digitalNum)); m_digitalImg = m_digitalImg.scaled(width*digitalNum, height + 1, Qt::IgnoreAspectRatio, Qt::FastTransformation); applyModify(); qInfo() << "Counter item set to " << type ; qInfo() << ">\tdigitalNum: " << digitalNum << ", font name: " << fontname << ", pixel size: " << pixelSize; qInfo() << ">\tletterSpace: " << letterSpace() << "charRom width: " << digitalNum * width << " width: " << width; } int PicCounterItem::charWidth() { if(!m_charWidthMap.contains(font().family())) return 0; return m_charWidthMap[font().family()]; } void PicCounterItem::setCharWidth(int width) { m_charWidthMap[font().family()] = width; setCounter(counterType(), digitalNum()); } QImage PicCounterItem::itemImage() { return m_digitalImg; } void PicCounterItem::setCustomAttrs(const QXmlStreamAttributes &attrs) { auto typeRef = attrs.value("counter_type"); auto digitalNumRef = attrs.value("digital_num"); bool ok = false; int counterType = typeRef.toInt(&ok); if(!ok || (counterType != COUNTER_TYPE_1 && COUNTER_TYPE_2 != counterType)) { qWarning() << "Invalied counter type: " << counterType; return; } ok = false; int digitalNum = digitalNumRef.toInt(&ok); if(!ok || digitalNum <= 0) { qWarning() << "Invalied counter digital number: " << digitalNum; return; } setCounter(static_cast(counterType), digitalNum); qInfo() << "Loaded attrs from xml: " << " counter type: " << counterType << ", digitalNum: " << digitalNum; } void PicCounterItem::saveCustomAttrs(QXmlStreamAttributes &attrs) { attrs.append("counter_type", QString::number(counterType())); attrs.append("digital_num", QString::number(digitalNum())); qInfo() << "Set attrs to xml: " << " counter type: " << counterType() << ", digitalNum: " << digitalNum(); } void PicCounterItem::letterSpaceChanged() { setSource(source()); }