문제

나는 사용자 정의 위젯에서 Qprogressbar를 서브 클래스하고 있으며 Paintevent 다음 코드가있는 메소드 :


void myProg::paintEvent(QPaintEvent *pe)
{
    QProgressBar::paintEvent(pe);
    QRect region = pe->rect();
    QPainter *painter = new QPainter(this);
    QPen *pen = new QPen;
    painter->begin(this);
    painter->setBrush(Qt::red);
    int x = this->x();
    int y = this->y();
    pen->setWidth(10);
    painter->setPen(*pen);
    painter->drawLine(x,y,x+100,y);
    painter->end();

}

나는 시작점으로 빨간색 선을 표시하려고 노력하고 있습니다. 위젯에 자체 수정을 추가 할 수 있습니다. 그러나 이것은 작동하지 않습니다. 위젯을 일반 QPROGRESSBAR로 만 본다. 무엇이 잘못 될 수 있는지에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

사용해야하는 좌표계는 위젯의 왼쪽 상단과 관련이 있지만 위젯의 부모와 관련하여 하나를 사용하는 것 같습니다. (위젯의 X 및 Y 코디는 부모와 관련이 있습니다). 그래서 당신의 라인이 잘릴 것입니다.

또한 QPainter :: 시작 및 QPainter :: QPainter :: QWidget * 매개 변수를 사용하여 구성 할 때 불필요합니다. 코드의 화가도 삭제되지 않습니다. 힙에 화가를 만들 필요는 없습니다. new: 스택에 만듭니다.

노력하다:

void myProg::paintEvent(QPaintEvent *pe)
{
    QProgressBar::paintEvent(pe);
    QRect region = pe->rect();
    QPainter painter(this);
    QPen pen(Qt::red); //Note: set line colour like this

    //(Brush line removed; not necessary when drawing a line)
    int x = 0; //Note changed
    int y = height() / 2; //Note changed
    pen.setWidth(10);
    painter.setPen(pen);
    painter.drawLine(x,y,x+100,y);

}

이것은 위젯의 왼쪽 중간에서 시작하여 길이의 빨간 수평 선 100 픽셀을 그려야합니다.

다른 팁

당신이 쓴 내용에 대한 몇 가지 의견 만 있습니다.

  1. 당신이 화가 건설 방식 QPainter(this) 명시 적으로 전화 할 필요가 없음을 의미합니다 begin() 그리고 end(), QT는 당신을 위해 그것을 처리합니다.
  2. 그 점을 염두에두고, 소멸자는 결코 부름을받지 못하며, 이것은 모든 새로운 것 때문에 많은 기억을 새롭게 할 것입니다. QPainter에스.
  3. 나는 확실하다 this->x() 그리고 this->y() 창의 왼쪽 상단 모서리를 반환하지만 여전히 창 위에 5 픽셀의 빨간색 선이 표시되어야합니다.

당신이 설정할 때 QPainters 브러시, 사용해보십시오 QBrush 생성자는 명시 적으로painter->setBrush( QBrush(Qt::red) );

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top