2013-06-19 5 views
0

Я ищу наиболее эффективный способ определения размера QGraphicsItem на основе длины заданного QString, так что текст всегда содержится в границах QGraphicsItem. Идея состоит в том, чтобы держать QGraphicsItem как можно меньшим, сохраняя при этом текст с разборчивым размером. Идеальным было бы объединение на несколько линий с определенным порогом ширины. Например,Размер QGraphicsItem на основе длины строки

TestModule::TestModule(QGraphicsItem *parent, QString name) : QGraphicsPolygonItem(parent) 
{ 
    modName = name; 
    // what would be the best way to set these values? 
    qreal w = 80.0; 
    qreal h = 80.0; 
    QVector<QPointF> points = { QPointF(0.0, 0.0), 
           QPointF(w, 0.0), 
           QPointF(w, h), 
           QPointF(0.0, h) }; 
    baseShape = QPolygonF(points); 
    setPolygon(baseShape); 
} 

void TestModule::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    QBrush *brush = new QBrush(Qt::gray, Qt::SolidPattern); 
    painter->setBrush(*brush); 
    painter->drawPolygon(baseShape); 
    painter->drawText(QPointF(0.0, 40.0), modName); 
} 

Какой код я могу добавить в конструктор, чтобы выполнить мое требование? Установка ширины, основанная на общей длине строки, делает предположения о том, сколько пикселей занимает каждый символ, является наиболее очевидным решением, но я ищу что-то более элегантное. Есть идеи? Спасибо заранее за любую помощь.

ответ

1

Класс QFontMetrics имеет функцию boundingRect, которая берет строку, которую вы хотите распечатать, и возвращает QRect для строки на основе QFont, который использовался для initalise QFontMetrics.

Если вы хотите обернуть, то вам нужно будет исправить максимальное количество слов в вашей строке, что позволит boundingRect возвращать QRect, который подходит для вашего ограниченного ребра QGraphicsItem.

+0

только то, что я искал, спасибо. – c0nn

1

Посмотрите QFontMetrics

Вы можете задать свой виджет для font

И проверить этот фрагмент из QFontMetrics Docs

QFont font("times", 24); 
QFontMetrics fm(font); 
int pixelsWide = fm.width("What's the width of this text?"); 
int pixelsHigh = fm.height(); 

Edit: Как сказал Мерлин в комментарии, используйте

QRect QFontMetrics::boundingRect (const QString & text) const So:

int pixelsWide = fm.boundingRect ("Какова ширина этого текста?"). Width();

+2

width() не возвращает пиксели, занимаемые текстом, но определяется как возвращающее «расстояние до места, где должна быть нарисована следующая строка», что может быть или не быть правильным значением, особенно если оно используется для обертывания текст, по запросу. – TheDarkKnight

+1

отредактировал, спасибо – Trompa

Смежные вопросы