void printFontMetrics(const QFont& f) { QFontMetrics fm(f); QFont fi(f); fi.setItalic(true); QFontMetrics fm_italic(fi); QFont fb(f); fb.setBold(true); QFontMetrics fm_bold(fb); QFont fbi(fb); fbi.setItalic(true); QFontMetrics fm_boldit(fbi); // Regular char err = (fm.averageCharWidth() != fm.maxWidth() || fm.width("MM") != fm.maxWidth()*2) ? '!' : ' '; qStdOut() << err; qStdOut() << " (Regular) Average char width: " << fm.averageCharWidth(); qStdOut() << " Max char width: " << fm.maxWidth(); qStdOut() << " Width(MM): " << fm.width("MM") << endl; // Italic err = (fm_italic.averageCharWidth() != fm_italic.maxWidth() || fm_italic.width("MM") != fm_italic.maxWidth()*2 || fm_italic.maxWidth() != fm.maxWidth()) ? '!' : ' '; qStdOut() << err; qStdOut() << " (Italic) Average char width: " << fm_italic.averageCharWidth(); qStdOut() << " Max char width: " << fm_italic.maxWidth(); qStdOut() << " Width(MM): " << fm_italic.width("MM") << endl; // Bold err = (fm_bold.averageCharWidth() != fm_bold.maxWidth() || fm_bold.width("MM") != fm_bold.maxWidth()*2 || fm_bold.maxWidth() != fm.maxWidth()) ? '!' : ' '; qStdOut() << err; qStdOut() << " (Bold) Average char width: " << fm_bold.averageCharWidth(); qStdOut() << " Max char width: " << fm_bold.maxWidth(); qStdOut() << " Width(MM): " << fm_bold.width("MM") << endl; // BoldItalic err = (fm_boldit.averageCharWidth() != fm_boldit.maxWidth() || fm_boldit.width("MM") != fm_boldit.maxWidth()*2 || fm_boldit.maxWidth() != fm.maxWidth()) ? '!' : ' '; qStdOut() << err; qStdOut() << " (Bold+It) Average char width: " << fm_boldit.averageCharWidth(); qStdOut() << " Max char width: " << fm_boldit.maxWidth(); qStdOut() << " Width(MM): " << fm_boldit.width("MM") << endl; }
void AATextItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){ if (hasFocus()){ QGraphicsTextItem::paint(painter, option, widget); return; } painter->setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); QPainterPath path; QString s = toPlainText(); QTextDocument *doc = document(); qreal margin = doc->documentMargin(); QStringList lines = s.split("\n", QString::SkipEmptyParts); QFont f = font(); f.setStyleHint(QFont::AnyStyle, QFont::PreferAntialias); QFontMetrics fm(f); QFont f_bold = f; f_bold.setBold(true); QFontMetrics fm_bold(f_bold); int line = 0; for (int i = 0; i < lines.length(); i++){ QString thisline = lines[i]; QStringList s1 = thisline.split(']', QString::SkipEmptyParts); QStringList s_non_bold, s_bold; foreach(QString s, s1){ if (!s.contains('[')){ s_non_bold << s; s_bold << QString(); } else if (!s.startsWith('[')){ QStringList s2 = s.split('[', QString::SkipEmptyParts); s_non_bold << s2.first(); s_bold << s2.last(); } else { s = s.mid(1); s_non_bold << QString(); s_bold << s; } } int width = 0; for (int j = 0; j < s_non_bold.length(); j++){ QString non_bold = s_non_bold[j]; for (int k = 0; k < non_bold.length(); k++){ QChar c = non_bold[k]; QString str = c; int width_c = fm.width(str); if (width + width_c > doc->size().width()){ ++line; width = 0; } path.addText(margin + width, fm.height() * (line + 1), f, str); width += width_c; } QString bold = s_bold[j]; for (int k = 0; k < bold.length(); k++){ QChar c = bold[k]; QString str = c; int width_c = fm_bold.width(str); if (width + width_c > doc->size().width()){ ++line; width = 0; } path.addText(margin + width, fm.height() * (line + 1), f_bold, str); //use fm.height not fm_bold.height, for sometimes the bold characters are not as high as the non-bold ones width += width_c; } } ++line; } painter->fillPath(path, defaultTextColor()); }