2009-05-08 6 views
1

나는 사용자 정의 위젯에 QProgressBar를 서브 클래 싱하고있어, 나는 다음 코드로 paintEvent 방법 덮어 : 시작으로,Qt는 문제가 오버라이드 (override) 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로만 표시됩니다. 무엇이 잘못 될 수 있는지에 대한 아이디어가 있습니까? 당신이 쓴 한 것에 대해

답변

7

같이 명시 적으로 QBrush 생성자를 사용하려고 왼쪽 상단을 위젯의, 그러나 ' 위젯의 부모에 상대적으로 하나를 사용하는 것 같습니다. (위젯의 x 및 y 좌표는 부모에 상대적입니다.) 그래서 당신의 전화는 잘릴 것입니다.

또한 QWidget * 매개 변수를 사용하여 구성 할 때 QPainter :: begin 및 QPainter :: end를 호출 할 필요가 없습니다. 그리고 코드의 화가도 삭제되지 않습니다. new으로 힙에 화가를 만들 필요가 없습니다. 스택에 만들면됩니다.

시도 :이 위젯의 ​​중간 왼쪽에서 시작하여 100 개 픽셀 긴 빨간색 가로 선을 그어야한다

 

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); 

} 

.

+0

화면에 무엇인가가 표시되는지 여부를 알려주는 디버그 플래그를 설정할 수 있습니까? – Geo

+0

Geo : 디버그 플래그가 있다고 생각하지 않습니다. 미래에 이것이 문제가 될지 모른다면 걱정할 필요가 있습니다. 예를 들어 다음을 시도해 볼 수 있습니다. -10000, -10000에서 10000, 10000까지 위젯 위에 큰 빨간색 상자를 그려보고 더 이상 출력을 볼 수 없을 때까지 코드를 변경하십시오. 또한 QPainter에서 클리핑 영역이나 클리핑 패스를 가져 와서 경계 사각형을 인쇄하여 좌표가 생각한 것과 가까운 지 확인하십시오. – Doug

1

불과 몇 의견 :

  1. 당신이 QPainter(this)이 명시 적으로 begin()end()은, QT는 당신을 위해 처리합니다 호출 할 필요가 없다는 것을 의미 화가를 구축하는 방법.
  2. 이 점을 염두에두고 소멸자가 호출되지는 않습니다. 이는 새로운 모든 QPainter으로 인해 많은 메모리를 누설합니다.
  3. this->x()this->y()은 윈도우의 왼쪽 위 구석을 반환하지만 윈도우 상단에 빨간색 너비 5 픽셀의 선이 표시되어야합니다.

당신이 QPainter의 브러시를 설정하면을 기준으로 사용해야하는 좌표 시스템을 painter->setBrush(QBrush(Qt::red));