2016-08-05 3 views
2

안녕하세요, 저는 QT 및 C++의 초보자입니다. QP에서 QPainter 및 이벤트를 사용하는 방법을 알고 싶었지만 실행시 오류 메시지, 내 원래 코드 :"QPainter :: drawRects : Painter not active"오류 C++/QT

MAIN.CPP

#include "customwidget.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QScopedPointer<QWidget> widget(new customWidget()); 
    widget->resize(240, 120); 
    widget->show(); 

    return a.exec(); 
} 

헤더 :

#ifndef CUSTOMWIDGET_H 
#define CUSTOMWIDGET_H 

#include <QWidget> 
#include <QMouseEvent> 
#include <QPoint> 
#include <QPainter> 

class customWidget : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit customWidget(QWidget *parent = 0); 
    void paintEvent(QPaintEvent *); 
    void mouseMoveEvent(QMouseEvent *event); 
    void mousePressEvent(QMouseEvent *event); 

private: 
    QPoint m_mousePos; 
    QRect m_r2; 
signals: 

    void needToRepaint(); 
public slots: 
}; 

#endif // CUSTOMWIDGET_H 

과 .CPP :

#include "customwidget.h" 

customWidget::customWidget(QWidget *parent) : QWidget(parent) 
{ 
    QRect m_r2; 
    QPoint m_mousePos; 

    QObject::connect(this, SIGNAL(needToRepaint()), this, SLOT(repaint())); 
} 

void customWidget::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 

// ############ First Rectangle **************************************** 

    QRect r1 = rect().adjusted(10, 10, -10, -10); 
    painter.setPen(QColor("#FFFFFF")); 
    painter.drawRect(r1); 

// ############ Seconde Rectangle **************************************** 

    QRect r2(QPoint(0, 0), QSize(100, 100)); 


    m_r2.moveCenter(m_mousePos); 

    QPainter painter2; 
    QPen pen; 
    painter2.setPen(QColor("#000000")); 
    pen.setWidth(3); 
    painter2.setPen(pen); 
    painter2.drawRect(m_r2); 
    update(); 



} 

void customWidget::mouseMoveEvent(QMouseEvent *event) 
{ 

    m_mousePos = event->pos(); 

    emit needToRepaint(); 
} 

QPainter가 paintEvent에 없기 때문에 웹에서 검색을 시도했지만 내 코드에는 해당되지 않습니다. 도움을 주셔서 감사합니다.

+0

'painter2.begin (objectWhereToDraw)'및 'painter2.end()'를 호출해야합니다. 아니면 그냥'QPainter painter2 (objectWhereToDraw)'로 생성하십시오. – ilotXXI

답변

1
  1. 화가가 하나만 있으면됩니다. 두 번째 것은 활성화되지 않았으므로 어쨌든 필요하지 않습니다.

  2. 어떻게 든 절대적으로 repaint() 반환되기 전에 수행 할 수있는 그림을 필요로하지 않는 한 어느 repaint()를 호출하지 마십시오 (즉, 무슨 일이야!). 이벤트 루프를 제대로 실행하면 계속 필요하지 않습니다.

  3. paintEvent()에서 update()으로 전화하지 마십시오. 말도 안됩니다.

  4. 위젯을 다시 그리려면 update()으로 전화하십시오. 이벤트 루프에서 업데이트를 예약합니다. 미해결 된 여러 업데이트가 통합되어 이벤트 루프 기능을 유지하고 이벤트 폭풍을 방지합니다.

  5. 컴파일러에서 을 생성하면 더 많은 메모리 관리 코드가 개 있습니다. 스마트 포인터를 사용하여 첫 번째 단계를 완료했습니다. 이제 두 번째 작업을 수행하십시오. CustomWidget의 인스턴스를 값으로 유지하십시오. 명시 적으로 동적으로 할당 할 필요는 없습니다. C++은 C가 아니므로 값을 활용할 수 있습니다.

  6. 간단한 테스트 케이스에서는 세 개의 파일을 원하지 않습니다. 코드는 가능한 한 적은 수의 행에 하나의 main.cpp에 있어야합니다. Q_OBJECT 매크로로 인해 파일을 mock해야하는 경우 끝에 #include "main.moc"을 추가하고 프로젝트에서 qmake를 다시 실행하여주의해야합니다.

문제를 수정 한 후 이러한 테스트 케이스가 어떻게 표시되는지 확인합니다. 100kLOC 프로젝트가 아니라 테스트 케이스임을 기억하십시오. 3 개의 파일에 걸쳐 빈약 한 35 줄의 코드가 필요하지도 않으며 원하는 것도 아닙니다. 또한, 코드를 배포함으로써 자신이 이해하기가 더 어려워집니다.

대용량 프로젝트 인 경우에도 반대의 경우 상당한 빌드 시간 개선을 보여줄 수없는 경우 헤더 파일에 Java 스타일로 구현 된 많은 소규모 클래스를 가질 수 있습니다. C++에 속한 유일한 자바 스타일입니다.

// https://github.com/KubaO/stackoverflown/tree/master/questions/simple-paint-38796140 
#include <QtWidgets> 

class CustomWidget : public QWidget 
{ 
    QPoint m_mousePos; 
public: 
    explicit CustomWidget(QWidget *parent = nullptr) : QWidget{parent} {} 
    void paintEvent(QPaintEvent *) override; 
    void mouseMoveEvent(QMouseEvent *event) override { 
     m_mousePos = event->pos(); 
     update(); 
    } 
}; 

void CustomWidget::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 

    auto r1 = rect().adjusted(10, 10, -10, -10); 
    painter.setPen(Qt::white); 
    painter.drawRect(r1); 

    auto r2 = QRect{QPoint(0, 0), QSize(100, 100)}; 
    r2.moveCenter(m_mousePos); 
    painter.setPen(QPen{Qt::black, 3, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin}); 
    painter.drawRect(r2); 
} 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    CustomWidget w; 
    w.show(); 
    return app.exec(); 
} 
+0

답변과 조언을 해주셔서 감사합니다. 바로 시도해 보겠습니다. D. –