簡體   English   中英

QT 5.7 QPainter線對齊

[英]QT 5.7 QPainter line aligment

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

Line的底部和右側站點比其他站點更大:
問題

在有人告訴我之前我必須刪除兩個-1表達式,你應該知道我是否這樣做並且還將筆寬設置為1,在底部和右側不再有線。
問題

我認為這個神器是由“ 線對齊 ”引起的。 QT試圖對矩形定義的邏輯線附近的像素進行着色,但實際上因為最終所有必須以像素為單位決定。 如果我是對的,為什么沒有方法像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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM