Russian Qt Forum
Май 17, 2024, 11:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: drawText (QT/E 2.3.10)  (Прочитано 5789 раз)
agaf
Гость
« : Январь 25, 2006, 12:56 »

Пытаюсь акселлерировать метод отрисовку текста (QGfxMy::drawText). Выводимый текст не обрезается (например, заголовок окна может вылезти за пределы самого окна). При этом стандартный QGfxRasterBase::drawText делает все правильно, хотя в нем я не нашел ничего, что могло бы контроллировать длину выводимой строки. Вопрос: каким образом Qt производит обрезку строки до нужной длины?

Qt/Embedded 2.3.10, Linux
Записан
Dendy
Гость
« Ответ #1 : Январь 25, 2006, 13:58 »

Наверное с помощью QFontMetrics::width QFontMetrics::size QFontMetrics::boundingRect.
Записан
agaf
Гость
« Ответ #2 : Январь 25, 2006, 14:58 »

QFontMetrics::width - это ширина полной строки. А вот с чем (и где) сравнивается эта ширина для определения длины обрезанной строки (если полная не помещается в компонент)?
Записан
Steven_Orko
Гость
« Ответ #3 : Январь 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();
}


Как я понял в процессе трассировки проги, эта функция делает то, что тебе надо. Возможно ошибаюсь.
Записан
agaf
Гость
« Ответ #4 : Январь 26, 2006, 17:51 »

Разобрался. Дело в том, что глифы букв копируются функцией blt. Если приемник находится вне cliprects, копирование просто не производится.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.103 секунд. Запросов: 17.