2016-06-24 3 views
3

QT 5.7과 C++로 작업 중입니다. 현재 QPainter 클래스를 사용하여 자신의 위젯을 그리는 데 익숙해졌습니다. 하지만 해결할 수없는 문제를 발견했습니다. 나는 위젯 국경에서 extactly 테두리 라인을 그릴려고하지만 그렇게 할 경우 :
problem
QT 5.7 Q 라인 정렬하기

:

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로 설정하면 하단과 우측에 더 이상 줄이 없음을 알 수 있습니다.
problem

나는이 유물이 "라인 aligment"에 의해 발생합니다 생각합니다. 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/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" 
: 여기

는 완벽한 예입니다
관련 문제