gpt4 book ai didi

c++ - QT 5.7 QPainter 线条对齐

转载 作者:太空狗 更新时间:2023-10-29 22:59:07 27 4
gpt4 key购买 nike

我正在使用 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();
}

线在底部和右边的站点比其他站点大:
problem

在有人告诉我必须删除两个 -1 表达式之前,你应该知道如果我这样做并将笔宽设置为 1,则底部和右侧不再有线条。
problem

我认为这个伪像是由“行对齐”引起的。QT 尝试对矩形定义的逻辑线附近的像素进行着色,但实际上是因为最终所有像素都必须以像素为单位,所以它必须决定。如果我是对的,为什么没有方法set the line aligment of the pen like in GDI+ ?我该如何解决这个问题?

最佳答案

一切都取决于您是否希望整个笔的宽度可见。通过从 0,0 开始绘制矩形,您只显示了笔宽的一半,这使事情变得不必要地复杂 - 不要介意线条看起来太细。在 Qt 中,非修饰笔总是绘制成与线的中间对齐。 Qt 不允许您更改它:您可以改为更改绘制的几何图形。

要使其适合奇数线宽,您必须将矩形的坐标作为浮点值给出,并且它们必须落在线的中间。所以,例如如果笔的宽度为 3.0 个单位,则矩形的几何形状将为 (1.5, 1.5, width()-3.0, width()-3.0)

这是一个完整的例子:

// https://github.com/KubaO/stackoverflown/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 p{this};
p.setPen({Qt::black, m_penWidth, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin});
p.setBrush(Qt::cyan);
qreal d = m_penWidth/2.0;
p.drawRect(QRectF{d, d, width()-m_penWidth, height()-m_penWidth});
}
public:
explicit Widget(QWidget * parent = 0) : QWidget{parent} { }
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 app{argc, argv};
QWidget top;
QVBoxLayout layout{&top};
Widget widget;
QSlider slider{Qt::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"

关于c++ - QT 5.7 QPainter 线条对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38019846/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com