首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT5.7 QPainter线扩展

QT5.7 QPainter线扩展
EN

Stack Overflow用户
提问于 2016-06-24 18:23:02
回答 1查看 804关注 0票数 3

我正在使用QT5.7和C++。目前,我试图习惯于用QPainter类来绘制自己的小部件。但我注意到了一个我无法解决的问题。我试图在小部件的边框上绘制边框,但如果这样做的话:

代码语言:javascript
复制
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试图在矩形定义的逻辑线附近调整像素,但实际上是因为最终所有像素都必须以像素为单位来决定。如果我是对的,为什么没有像GDI+(https://msdn.microsoft.com/en-us/library/windows/desktop/ms533854(v=vs.85%29.aspx)? )那样设置笔线的方法,以及我如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-24 19:54:30

这一切取决于你是否希望整支笔的宽度是可见的。通过绘制从0,0开始的矩形,你只显示了钢笔宽度的一半,这使得事情变得不必要的复杂--别管这条线看上去太薄了。在Qt中,非化妆笔总是画在线的中间.Qt不允许您更改它:您可以更改绘制的几何图形。

要正确处理奇数行大小,必须将矩形的坐标作为浮点值,并且它们必须落在线的中间。因此,例如,如果钢笔是3.0单位宽,矩形的几何将是(1.5, 1.5, width()-3.0, width()-3.0)

下面是一个完整的例子:

代码语言:javascript
复制
// 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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38019846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档