web-dev-qa-db-ja.com

Qtは境界線で塗りつぶされた角丸長方形を描画します

特定の色で四角形全体を塗りつぶした丸い角(4つの角すべてで同じ境界半径)の四角形と、別の境界線の色(たとえば、境界線の幅が1ピクセル)を描画します。

私の観察から、QtはfillRectdrawRectdrawRoundedRectの3つのメソッドを提供します。私はそれらを試しましたが、彼らは私がしたいように動作しません。 fillRoundedRectのようなメソッドはありません。つまり、丸い長方形を描くことはできますが、希望する色で塗りつぶされません。

どうすればいいのですか?また、エイリアシングの問題により、コーナーが不均等にレンダリングされることがよくあることを読みました。 4つすべてを同等に設定するにはどうすればよいですか? Painter.setRenderHint(QPainter::Antialiasing)で十分ですか?または、他に何かする必要がありますか?

20
SexyBeast

QPainterPathを作成し、それに角丸長方形を追加してから、塗りつぶしとストロークを行うことができます。

_QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
QPainterPath path;
path.addRoundedRect(QRectF(10, 10, 100, 50), 10, 10);
QPen pen(Qt::black, 10);
p.setPen(pen);
p.fillPath(path, Qt::red);
p.drawPath(path);
_

アンチエイリアスを使用しても、特に低DPIデスクトップモニター、高DPIモバイルデバイスでは、1ピクセルの境界線は実際には見栄えがよくないことに注意してください。

enter image description here

長方形をQRectF(9.5, 9.5, 100, 50)として作成すると、1ピクセルのアンチエイリアス処理された境界線で見栄えがよくなります。右のピクセルに「スナップ」するからです。

enter image description here

48
dtech