2015-06-17 2 views
3

1) Как я могу обернуть текст в QGraphicsTextItem, чтобы установить фиксированный прямоугольник с шириной и высотой?Как я могу обернуть текст в QGraphicsItem?

Прямо сейчас я экспериментирую с созданием текста, получением его ограничивающего прямоугольника и изменением размера его в соответствии с полем - но я не могу обернуть его.

class TTT: public QGraphicsTextItem { 
    TTT() { 
    { 
     setPlainText("abcd"); 
     qreal x = m_itemSize.width()/boundingRect().width(); 
     qreal y = m_itemSize.height()/boundingRect().height(); 
     scale(x, y); 
    } 
    void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { 
     // experiment with clip regions 
     // text gets covered by hole in clip 
     QRegion r0(boundingRect().toRect()); 
     QRegion r1(QRect(5, 5, 10, 10), QRegion::Ellipse); 
     QRegion r2 = r0.subtracted(r1); 
     painter->setClipRegion(r2); 
     painter->setBrush(Qt::yellow); 
     painter->drawRect(boundingRect()); 
     QGraphicsTextItem::paint(painter, option, widget); 
    } 
} 

Что делает упаковку, как я могу ее вызвать?

Прямо сейчас, когда я продолжаю печатать, коробка автоматически расширяется.

2) Можно ли обернуть текст в подклассу QGraphicsItem/QGraphicTextItem в форме, которая не является прямоугольником? enter image description here

(Что-то, как в картинке)
Я пытался использовать clipRegion см код выше, но я предполагаю, что это не правильный путь, отсечение режет текст, но не заворачивать.

Возможно, это было бы ... Если бы я мог понять, как обернуть текст в первую очередь?

Qt 4.8

ответ

3

Вы не указали Qt версии, но попробовать:

аннулируются QGraphicsTextItem :: setTextWidth (qreal ширина)

Устанавливает предпочтительную ширину текста элемента. Если фактический текст шире, чем> указанная ширина, он будет разбит на несколько строк.

Если ширина установлена ​​в -1, текст не будет разбит на несколько строк> если только он не будет принудительно введен через явный разрыв строки или новый абзац.

Значение по умолчанию - -1.

+0

(Я также отредактировал вопрос, чтобы показать, Qt версия 4.8, извините за бездействие) – Thalia

+0

Это то, чего я не хватало! Это более легкое и простое исправление - мне, возможно, придется полностью изменить мою реализацию элемента, хотя ... – Thalia

3

В ответ на: 1) я выбрал бы не использовать QGraphicsTextItem, но рисовать текст непосредственно в функции краски вашего QGraphicsItem в использовании drawText перегруженную функцию, которая принимает параметр QTextOption.

Используя это, вы можете установить WrapMode, например, с помощью вызова

QTextOption::setWrapMode(QTextOption:: WordWrap) 

Что касается 2) с непрямоугольной формы, я не думаю, что Qt будет делать это для вас.

Выполняя это самостоятельно, вы можете использовать QFontMetrics, чтобы определить, сколько текста будет вписываться в каждую строку, в зависимости от того, где оно находится в пределах его ограничивающего элемента.

В качестве альтернативы вы можете адаптировать концепцию text-to-path method.

+0

Я рассмотрел этот вариант по ряду причин, но разве не потерять возможности редактирования текста? Я все еще хочу, чтобы текст был доступен для редактирования после размещения на холсте - что я могу сделать теперь, управляя 'setTextInteractionFlags' – Thalia

+0

Кроме того, я видел этот [вопрос] (http: // stackoverflow.com/a/17193721/1217150) об использовании 'QFontMetrics', и это казалось отличной идеей - за исключением того, что я не знаю, как обернуть без добавления' \ n' в текст - что было бы плохо, потому что текст мог измениться позже, либо по содержанию, либо по размеру ... Это сложно! – Thalia

+1

* Я потеряю возможности редактирования текста * - простыми словами, да. Однако я бы создал свой собственный GraphicsTextItem, чтобы сделать чертеж и разрешить редактирование. Или, вы могли бы, когда элемент был выбран, отобразить QGraphicsTextItem, готовый к редактированию, и по завершении передачи информации в ваш собственный класс, который рисует его так, как вы хотите. – TheDarkKnight