C++의 Qt5 더 블 버퍼 메커니즘 사례 튜 토리 얼

1.더 블 버퍼 메커니즘
더 블 버퍼 시스템 이란 컨트롤 을 그 릴 때 먼저 그 릴 내용 을 그림 에 그 린 다음 컨트롤 에 그림 을 한꺼번에 그 리 는 것 을 말한다.
초기 QT 버 전에 서 컨트롤 에 직접 그리 기 작업 을 하면 컨트롤 을 다시 그 릴 때 반 짝 이 는 현상 이 발생 하고 컨트롤 을 다시 그 릴 때 반 짝 이 는 현상 이 빈번 할 때 반 짝 임 이 특히 뚜렷 합 니 다.
더 블 버퍼 메커니즘 은 이러한 반 짝 임 현상 을 효과적으로 제거 할 수 있다.Qt 5 버 전 이후 QWidget 컨트롤 은 반 짝 이 는 문 제 를 자동 으로 처리 할 수 있 습 니 다.
따라서 컨트롤 에 직접 그림 을 그 릴 때 반 짝 이 는 문 제 를 신경 쓰 지 않 아 도 되 지만 더 블 버퍼 체 제 는 많은 경우 에 도 사용 할 수 있 습 니 다.필요 한 내용 이 복잡 하고 자주 새로 고침 이 필요 하거나 전체 컨트롤 의 일부분 만 새로 고침 할 때마다 더 블 버퍼 체 제 를 사용 해 야 합 니 다.
2.실례
소개
간단 한 그래 픽 도 구 를 실현 하고 선형,선 너비,색상 등 기본 요 소 를 선택 할 수 있 습 니 다.
효과 도
image-20210718215654198
2.2 부분 핵심 코드 설명
구조 함수

DrawWidget::DrawWidget(QWidget *parent) :
    QWidget(parent)
{
    setAutoFillBackground(true);    //         
    setPalette(QPalette(Qt::red));
    pix =new QPixmap(size());      	// QPixmap               
    pix->fill(Qt::white);           //        
    setMinimumSize(600,400);      	//            
}
autoFillBackground
이 속성 은 작은 위 젯 배경 을 자동 으로 채 울 지 여부 입 니 다.
이 속성 을 사용 하면 Qt 가 paint 이 벤트 를 호출 하기 전에 작은 위 젯 의 배경 을 채 웁 니 다.사용 하 는 색상 은 작은 위 젯 팔레트 의 QPalette::Window 색상 캐릭터 가 정의 합 니 다.
또한 Windows 는 WA 가 설정 되 어 있 지 않 은 한 QPalette::Window 를 항상 채 웁 니 다.OpaquePaintEvent 또는 WANoSystem Background 속성 입 니 다.
작은 위 젯 의 부모 구성 요소 가 정적 배경 변화 가 있 으 면 이 속성 을 닫 을 수 없습니다(즉,false 로 설정 합 니 다).

void DrawWidget::mousePressEvent(QMouseEvent *e)
{
    startPos = e->pos();
}
이벤트 mousePress Event()를 마우스 로 다시 정의 하고 마우스 버튼 을 눌 렀 을 때 현재 마우스 위치 값 startPos 를 기록 합 니 다.
마우스 이동 이벤트 mouseMoveEvent()를 다시 정의 합 니 다.마우스 이동 이 벤트 는 기본적으로 마우스 버튼 이 눌 리 는 동시에 마 우 스 를 드래그 할 때 실 행 됩 니 다.
QWidget 의 mouseTracking 속성 은 창 이 마 우 스 를 추적 할 지 여 부 를 표시 합 니 다.기본 값 은 false(추적 하지 않 음)입 니 다.즉,마우스 버튼 이 하나 이상 눌 린 상태 에서 마 우 스 를 움 직 여야 mouseMoveEvent()이벤트 가 발생 합 니 다.setMouse Tracking(bool enable)방법 으로 이 속성 값 을 설정 할 수 있 습 니 다.추적 으로 설정 하면 마우스 버튼 이 눌 렸 든 안 눌 렸 든 마우스 가 움 직 이면 mouse MoveEvent()이벤트 가 발생 합 니 다.이 이벤트 처리 함수 에서 QPixmap 대상 에 그림 을 그 리 는 작업 을 완료 합 니 다.구체 적 인 코드 는 다음 과 같다.

void DrawWidget::mouseMoveEvent(QMouseEvent *e)
{
    QPainter *painter = new QPainter;

    QPen pen;
    pen.setStyle((Qt::PenStyle)style);
    pen.setWidth(weight);
    pen.setColor(color);

    painter->begin(pix);
    painter->setPen(pen);
    painter->drawLine(startPos,e->pos());
    painter->end();
    startPos =e->pos();
    update();
}
set 세 개 면 말 안 할 게 요.다 들 알 아 요.begin 해 주세요.
bool QPainter::begin(QPaintDevice **device*)
그림 그리 기 장 치 를 시작 합 니 다.true 로 되 돌아 오 면;그렇지 않 으 면 false 로 돌아 갑 니 다.여 기 는 Pixmap 에서 그림 을 그립 니 다.
다음은 펜 을 설정 하고 drawLine 함 수 를 보 겠 습 니 다.
void QPainter::drawLine(const QPoint &p1, const QPoint &p2)
이것 은 과부하 함수 다.p1 부터 p2 까지 선 을 긋다.
그리고 현재 위 치 를 설정 합 니 다.e->pos()
이 함수 봐.

void DrawWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawPixmap(QPoint(0,0),*pix);
}
여 기 는 더 블 버퍼 를 실현 하 는 곳 입 니 다.
이전 함수 에서 우 리 는 직접 면 판 에 그림 을 그 리 는 것 이 아니 라 Pixmap 에 그림 을 그 렸 습 니 다.여기 서 drawPixmap()함 수 를 호출 하여 그래 픽 을 수신 하 는 QPixmap 대상 을 그리 기 영역 창 컨트롤 에 그 려 서 더 블 버퍼 메커니즘 을 실현 합 니 다.

void DrawWidget::resizeEvent(QResizeEvent *event)
{
    if(height()>pix->height()||width()>pix->width())
    {
        QPixmap *newPix = new QPixmap(size());
        newPix->fill(Qt::white);
        QPainter p(newPix);
        p.drawPixmap(QPoint(0,0),*pix);
        pix = newPix;
    }
    QWidget::resizeEvent(event);
}
그리 기 영역 크기 함수 resizeEvent()를 조정 합 니 다.창의 크기 가 바 뀌 었 을 때 효 과 는 그리 기 영역 크기 가 바 뀐 것 처럼 보이 지만 실제 그 릴 수 있 는 영역 은 변 하지 않 았 습 니 다.그림 의 크기 가 바 뀌 지 않 았 기 때문에 원래 그리 기 영역 창의 크기 이기 때문에 창 크기 가 바 뀔 때 그 릴 QPixmap 대상 의 크기 를 제때에 조정 해 야 합 니 다.
마지막 QWidget::resizeEvent(event);나머지 일 을 완성 하기 위해 서다.
다음은 clear 함수 구현,
clear()함 수 는 픽 스 대신 새 롭 고 깨끗 한 QPixmap 대상 을 호출 하고 update()함 수 를 호출 하여 다시 그리 면 됩 니 다.

void DrawWidget::clear()
{
    QPixmap *clearPix =new QPixmap(size());
    clearPix->fill(Qt::white);
    pix = clearPix;
    update();
}
우리 가 무시 하 는 fill()함 수 를 보 세 요.
void QPixmap::fill(const QColor &color = Qt::white)
픽 셀 그림 을 주어진 색상 으로 채 웁 니 다.pixmap 가 그 려 졌 을 때 이 함수 의 효 과 는 정의 되 지 않 았 습 니 다.
지난 번 에 말씀 드 렸 던 update()
작은 위 젯 을 업데이트 하거나 숨 기지 않 는 한 작은 위 젯 을 업데이트 합 니 다.
이 함 수 는 즉시 다시 그리 지 않 습 니 다.반면,Qt 가 메 인 이벤트 로 돌아 갈 때 페인트 이 벤트 를 처리 합 니 다.repaint()를 호출 하 는 것 보다 Qt 를 최적화 시 켜 빠 른 속도 와 적은 반 짝 임 을 얻 을 수 있 습 니 다.
C++의 Qt5 더 블 버퍼 링 메커니즘 사례 튜 토리 얼 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 C++의 Qt5 더 블 버퍼 링 메커니즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 을 바 랍 니 다!

좋은 웹페이지 즐겨찾기