Пример #1
0
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;
}
Пример #2
0
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());
}