2012-12-20 26 views
5

Qt4.8で輪郭を描いたテキストを描きたいのですが、フォントの元の形と可視性も保ちたいと思います。 現在、アウトラインはテキスト文字を隠し、オリジナルよりも「薄く」見えるようにします。Qtはフォントを間引かないで輪郭を描いています

Qtは、QPenでテキスト文字(および他の図形)のアウトラインを描画します。 QPenは文字の実際のエッジ上を移動し、外側にペイントし、内のエッジラインのに入ります(QPenリファレンスの「結合スタイル」を参照)。

太いペンを使用すると、テキスト文字は薄くなりますが、アウトラインでは文字の総面積が大きくなります。 つまり、アウトラインはテキスト文字に侵食されます。

アウトラインから「ハロー効果」を持っている間に、テキスト文字を元の形と視認性を保ちたいと思っています。エッジラインの外側だけを塗りたい。

Qtでこのような効果を実現する最も簡単な方法は何ですか? 私はいくつかのアイデアを思いつきましたが、それらのどれかが可能かどうか疑問に思います。

計画A.

は、概説されたものの上にアウトラインせずに同じテキストを描画し、輪郭線でテキストを描画します。

残念ながら、QTextCursorは従来のタイプライターで行うことができる「オーバードロー」や「オーバータイピング」をサポートしていません。 パフォーマンスのペナルティもあります。それは最初QPenとアウトラインを描くように

プランB.

はQBrushで内部を埋める、その後、Qtライブラリを変更します。 QBrushはアウトラインの内側部分をペイントし、外側のみをそのまま残します。

可能であればQtライブラリを変更しないようにしたいと思います。

計画C.

スイッチ一時的にテキストに "QPainterの:: CompositionMode_DestinationOver" を描画するために使用QPainterのの "CompositionMode"。

これを行うには、QtextBrowserのようなQtのテキスト操作ウィジェットによって作成され使用される非公開の一時的なQPainterを制御する必要があると思います。

私はQtプログラミングが初めてで、XウィンドウでQt 4.8.2を使用します。

私の問題は、/usr/lib64/qt4/examples/richtext/calendar/mainwindow.cppに次のコード行(156-164行)を追加し、コンパイルして実行し、フォントサイズを40以上。

QTextCharFormat format = cursor.charFormat(); 
format.setFontPointSize(fontSize); 

QTextCharFormat boldFormat = format; 
boldFormat.setFontWeight(QFont::Bold); 

// Additional code lines for green outline : line 156 
QPen pen; 
pen.setStyle(Qt::SolidLine); 
pen.setWidthF(4); 
pen.setBrush(Qt::green); 
pen.setCapStyle(Qt::RoundCap); 
pen.setJoinStyle(Qt::RoundJoin); 
boldFormat.setTextOutline(pen); 
// The end of the additional code : line 164 

私に最初の手がかりを与える方法を教えていただけたら、私はあなたの助けを非常に感謝します。

+0

Ian Atkinのおかげで、私は "Painter Paths"の例を調べ、私のPlan BとCがQtの基本設計に反していると考え始めました。 「奇数偶数」の塗りつぶしルールでは、QPenでエッジラインの外側だけをペイントし、QBrushで内側を塗りつぶすと、「星型」と「四角形と円形が重なっている」という例では醜い結果になります。 –

+0

@タパ、私はこの質問を長い間開いたままにしており、私はそれを再訪する時間がなかった(私は別のプロジェクトに襲われていた)。遅れて返信して申し訳ありません。そして、はい、私の同僚の一人が、あなたのソリューションと非常によく似た方法で問題を解決しました。私はあなたの答えを私の質問に対する答えとして受け入れます。どうもありがとうございました。 –

答えて

1

QGraphicsViewテキストオブジェクトのアウトラインを行う方法を見つけました。私は、あなたはQTextDocument(例えばQTextEdit)に基づいてどのクラスにも使用できると思います。私はQGraphicsTextItemに基づいて、クラスを作成し、そのpaint機能再実装しました:私は、このソリューションのために気づいた

void paint (QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) 
{ QTextCharFormat format; 
    format.setTextOutline (QPen (Qt::white, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); // Color and width of outline 
    QTextCursor cursor (this->document()); 
    cursor.select (QTextCursor::Document); 
    cursor.mergeCharFormat (format); 
    QGraphicsTextItem::paint (painter, option, widget); 
    format.setTextOutline (QPen (Qt::transparent)); 
    cursor.mergeCharFormat (format); 
    QGraphicsTextItem::paint (painter, option, widget); 
} 

だけバグ - あなたがテキストを編集し、いくつかの文字を選択し起動したときに、クリッピングが発生します。しかし、ほとんど目立たない。編集不可能な項目については、私はバグを見つけることができません。

しかし、あなたは(たとえば)QPushButtonテキストを概説したい場合は、それは簡単ですが(この問題は何度も議論されている) - 、strokePathアウトラインを作成します - 内部paintEventpainter.fillPathが、その後、painter.strokePathを使用し、path.addTextを呼び出し、QPainterPathを作成して再実装しましたfillPathはフォアグラウンドを塗りつぶします。

関連する問題