【发布时间】:2015-07-06 21:34:05
【问题描述】:
我有一个TextItem 继承QGraphicsTextItem。我正在尝试根据特定要求使其工作(转换中心是边界矩形的中心)。
由于使用QGraphicsTextItem::paint() 给我带来了一些麻烦(参见question),而且我可能需要特殊的换行,所以最好在paint 中绘制文本。
#include <QApplication>
#include <QPainter>
#include <QGraphicsItem>
#include <QGraphicsView>
class TextItem: public QGraphicsTextItem
{
public:
TextItem()
{
QFont f;
f.setPointSize(50);
f.setBold(true);
f.setFamily("Helvetica");
setFont(f);
setHtml("Café Frapé");
setFlags(QGraphicsItem::ItemIsMovable |
QGraphicsItem::ItemIsFocusable |
QGraphicsItem::ItemIsSelectable);
setTextInteractionFlags(Qt::NoTextInteraction);
}
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
qreal w = QGraphicsTextItem::boundingRect().width();
qreal h = QGraphicsTextItem::boundingRect().height();
QRectF r = QRectF(-w/2, -h/2, w, h);
painter->setPen(QPen(m_penColor));
painter->setFont(this->font());
painter->setBrush(Qt::NoBrush);
painter->drawText(r, this->toPlainText(), this->document()->defaultTextOption());
}
QRectF boundingRect() const
{
qreal w = QGraphicsTextItem::boundingRect().width();
qreal h = QGraphicsTextItem::boundingRect().height();
QRectF r = QRectF(-w/2, -h/2, w, h);
return r;
}
protected:
virtual void focusOutEvent (QFocusEvent * event)
{
Q_UNUSED(event);
setTextInteractionFlags(Qt::NoTextInteraction);
}
virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event)
{
Q_UNUSED(event);
setTextInteractionFlags(Qt::TextEditorInteraction);
setFocus();
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TextItem* t = new TextItem();
QGraphicsView view(new QGraphicsScene(-200, -150, 400, 300) );
view.scene()->addItem(t);
view.show();
return a.exec();
}
这适用于使用所需选项绘制文本,但我无法正确编辑 - 文本光标始终位于文本块的开头。
如何移动文本光标?可以贴在油漆上吗?
【问题讨论】:
-
我放弃了,现在回到 QGraphicTextItem::paint()... .