Russian Qt Forum

Qt => Qt Embedded => Тема начата: agaf от Январь 25, 2006, 12:56



Название: drawText (QT/E 2.3.10)
Отправлено: agaf от Январь 25, 2006, 12:56
Пытаюсь акселлерировать метод отрисовку текста (QGfxMy::drawText). Выводимый текст не обрезается (например, заголовок окна может вылезти за пределы самого окна). При этом стандартный QGfxRasterBase::drawText делает все правильно, хотя в нем я не нашел ничего, что могло бы контроллировать длину выводимой строки. Вопрос: каким образом Qt производит обрезку строки до нужной длины?

Qt/Embedded 2.3.10, Linux


Название: drawText (QT/E 2.3.10)
Отправлено: Dendy от Январь 25, 2006, 13:58
Наверное с помощью QFontMetrics::width QFontMetrics::size QFontMetrics::boundingRect.


Название: drawText (QT/E 2.3.10)
Отправлено: agaf от Январь 25, 2006, 14:58
QFontMetrics::width - это ширина полной строки. А вот с чем (и где) сравнивается эта ширина для определения длины обрезанной строки (если полная не помещается в компонент)?


Название: drawText (QT/E 2.3.10)
Отправлено: Steven_Orko от Январь 25, 2006, 16:54
Эта функция называется qt_format_text(). Используется для внутренних нужд Qt, как я понял. Можешь посмотреть, например, исходник
QSize QItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;

Код:
QSize QItemDelegate::sizeHint(const QStyleOptionViewItem &option,
                              const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());
    const QAbstractItemModel *model = index.model();
    Q_ASSERT(model);

    QVariant value = model->data(index, Qt::SizeHintRole);
    if (value.isValid())
        return qvariant_cast<QSize>(value);

    // display
    value = model->data(index, Qt::FontRole);
    QString text = model->data(index, Qt::DisplayRole).toString();
    QRect textRect;
    QFont fnt = value.isValid() ? qvariant_cast<QFont>(value) : option.font;
    if (!text.contains(QLatin1Char('\n'))) {
        QFontMetrics fontMetrics(fnt);
        textRect = QRect(0, 0, fontMetrics.width(text), fontMetrics.lineSpacing());
    } else {
        QRectF result;
        qt_format_text(fnt, option.rect, Qt::TextDontPrint|Qt::TextDontClip,
                   text, &result, 0, 0, 0, 0);
        textRect = result.toRect();
    }

    // decoration
    QRect pixmapRect;
    if (model->data(index, Qt::DecorationRole).isValid())
        pixmapRect = QRect(0, 0, option.decorationSize.width(),
                           option.decorationSize.height());

    // checkbox
    QRect checkRect = check(option, textRect, model->data(index, Qt::CheckStateRole));

    doLayout(option, &checkRect, &pixmapRect, &textRect, true);

    return (pixmapRect|textRect|checkRect).size();
}


Как я понял в процессе трассировки проги, эта функция делает то, что тебе надо. Возможно ошибаюсь.


Название: drawText (QT/E 2.3.10)
Отправлено: agaf от Январь 26, 2006, 17:51
Разобрался. Дело в том, что глифы букв копируются функцией blt. Если приемник находится вне cliprects, копирование просто не производится.