QT 5.7 QPainter 线对齐
Posted
技术标签:
【中文标题】QT 5.7 QPainter 线对齐【英文标题】:QT 5.7 QPainter line aligment 【发布时间】:2016-06-24 18:23:02 【问题描述】:我正在使用 QT 5.7 和 C++。 目前,我尝试习惯于使用 QPainter 类绘制我自己的小部件。 但我注意到一个我无法解决的问题。 我尝试在小部件边框处精确绘制边框线,但如果这样做:
void MyWidget::paintEvent(QPaintEvent *event)
QPainter painter;
painter.begin(this);
painter.setBrush(Qt::cyan);
QBrush brush(Qt::black);
QPen pen(brush, 2);
painter.setPen(pen);
painter.drawRect(0, 0, size().width() - 1, size().height() - 1);
painter.end();
这条线位于底部和右侧的站点比其他站点大:
在有人告诉我我必须删除两个 -1 表达式之前, 您应该知道我是否这样做并将笔宽设置为 1,底部和右侧不再有线条。
我认为这个工件是由“行对齐”引起的。 QT 尝试对矩形定义的逻辑线附近的像素进行着色,但实际上是因为最终都必须以像素为单位,它必须决定。 如果我是对的,为什么没有set the line aligment of the pen like in GDI+ 的方法? 我该如何解决这个问题?
【问题讨论】:
【参考方案1】:一切都取决于您是否希望整个笔的宽度可见。通过从 0,0 开始绘制矩形,您只显示了笔宽的一半,这使事情变得不必要地复杂 - 更不用说线条看起来太细了。在 Qt 中,非修饰笔总是与线条的中间对齐。 Qt 不允许您更改它:您可以更改绘制的几何图形。
要使奇数行尺寸正确,您必须将矩形的坐标作为浮点值给出,并且它们必须落在行的中间。所以,例如如果笔的宽度为 3.0 个单位,则矩形的几何形状将为 (1.5, 1.5, width()-3.0, width()-3.0)
。
这是一个完整的例子:
// https://github.com/KubaO/***n/tree/master/questions/widget-pen-wide-38019846
#include <QtWidgets>
class Widget : public QWidget
Q_OBJECT
Q_PROPERTY(qreal penWidth READ penWidth WRITE setPenWidth)
qreal m_penWidth = 1.0;
protected:
void paintEvent(QPaintEvent *) override
QPainter pthis;
p.setPen(Qt::black, m_penWidth, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
p.setBrush(Qt::cyan);
qreal d = m_penWidth/2.0;
p.drawRect(QRectFd, d, width()-m_penWidth, height()-m_penWidth);
public:
explicit Widget(QWidget * parent = 0) : QWidgetparent
qreal penWidth() const return m_penWidth;
void setPenWidth(qreal width)
if (width == m_penWidth) return;
m_penWidth = width;
update();
QSize sizeHint() const override return 100, 100;
;
int main(int argc, char ** argv)
QApplication appargc, argv;
QWidget top;
QVBoxLayout layout⊤
Widget widget;
QSlider sliderQt::Horizontal;
layout.addWidget(&widget);
layout.addWidget(&slider);
slider.setMinimum(100);
slider.setMaximum(1000);
QObject::connect(&slider, &QSlider::valueChanged, [&](int val)
widget.setPenWidth(val/100.0);
);
top.show();
return app.exec();
#include "main.moc"
【讨论】:
以上是关于QT 5.7 QPainter 线对齐的主要内容,如果未能解决你的问题,请参考以下文章
QPaint 到 QGLFramebufferObject 纹理上?
利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)