2011-08-02 6 views
1

내 코드에서 내 앱이 GPS 좌표를 가져올 때마다 점을 그려 봅니다. 점은 "i"픽셀만큼 오른쪽과 아래로 이동합니다. 나는 그 (것)들에 그려지기를 바랄 것이다 그러나 전체 스크린이 항상 새롭게해야 한 ㄴ다는 것을 비록 Im가 새롭게해야하는 스크린에 지역을 지정하기 위하여 의미되는 QRegion 매개 변수를 사용해 비록, 보인다. 도울 수있는 사람이 있습니까? 정말로 이것에 새로운 Im와 haveno 생각은 무엇이 잘못입니다.QPaintEvent - 화면 영역 만 업데이트

귀하의 paintEvent
GameField::GameField(QWidget *parent) 
    : QWidget(parent) 
{ 
    i=5; 
    j=0; 
    pen=new QPen(Qt::black, 1, Qt::SolidLine); 
    painter= new QPainter(this); 
} 

void GameField::paintEvent(QPaintEvent *event) 
{ 

painter.setPen(pen); 
painter.drawPoint(i,i,1,1); 


    } 

void GameField::positionUpdated(QGeoPositionInfo position) { 
    QGeoCoordinate coordinates; 
    if (position.isValid()) { 
    coordinates = position.coordinate(); 
    } 
i=i+5; 
QRegion region(QRect(i,i,5,5)); 
this->update(region); 
    } 

답변

3

전체 위젯을 다시 칠 수 있어야합니다 : 여기

이 작업을 처리하는 클래스입니다. 예를 들어 사용자가 응용 프로그램을 최소화 한 다음 최대화하면 전체 위젯을 다시 그려야합니다. QPaintEvent::region은 페인트 작업이 많은 경우 해당 페인팅 중 일부를 억제하는 데 사용할 수 있습니다. 다음은 샘플입니다. (이것은 단지 개념의 증거 일 뿐이며, 아래의 코드에 많은 "나쁜 아이디어"가 있습니다.이 경우 최소한이 지역을 테스트하는 데 드는 비용은 가치가 없다는 것입니다. 논리.)

#include <QtGui> 

class PaintWidget : public QWidget { 
    Q_OBJECT 
public slots: 
    void AddPoint() { 
    QPoint point(rand() % width(), rand() % height()); 
    points_ << point; 
    update(point.x() - 3, point.y() - 3, 6, 6); 
    } 
protected: 
    void paintEvent(QPaintEvent *event) { 
    qDebug() << Q_FUNC_INFO; 
    QPainter painter(this); 
    painter.setPen(Qt::SolidLine); 
    foreach (QPoint point, points_) { 
     if (event->region().contains(point)) { 
     qDebug() << "drawing point:" << point; 
     painter.drawEllipse(point, 2, 2); 
     } 
    } 
    } 
private: 
    QVector<QPoint> points_; 
}; 

int main(int argc, char** argv) { 
    QApplication app(argc, argv); 

    PaintWidget w; 
    w.show(); 

    QTimer timer; 
    timer.connect(&timer, SIGNAL(timeout()), &w, SLOT(AddPoint())); 
    timer.start(1000); 

    return app.exec(); 
} 

#include "main.moc" 

프로그램을 표시 한 채로두면 각 페인트 이벤트와 함께 개별 점을 칠하는 방법에 유의하십시오. 그러나 자신의 앞에 다른 창을 건네거나 응용 프로그램을 최소화/최대화하면 하나의 페인트 이벤트에 많은 점이 그려집니다.

드로잉 포인트의 경우 영역이 많은 이익을 가져올 수 있다고 생각하는 것이 어렵습니다. 그러나 귀하의 지리적 위치가 QPainterPath 또는 그와 비슷한 것을 구성하면 성능 이점을 얻을 수 있습니다.

희망 하시겠습니까?

관련 문제