2014-03-27 1 views
1

2 점 사이의 QLabel에 프로그램 방식으로 선을 추가하고 싶습니다. 내가 찾은 바에 따르면, PaintEvent() 보호 메소드를 변경하기 위해 QWidget을 서브 클래스 화하는 것이 유일한 방법이다.Qt를 사용하여 프로그래밍 방식으로 선 그리기

그래서 QWidget에서 새로운 클래스 'QLineObject'를 만듭니다.

다음
QLineObject::QLineObject() 
{ 
    Point point; 
    point.x = 0.0; 
    point.y = 0.0; 

    fromPoint = point; 
    toPoint = point; 
} 

QLineObject::QLineObject(Point from, Point to) 
{ 
    fromPoint = from; 
    toPoint = to; 
} 

void QLineObject::paintEvent(QPaintEvent *event) 
{ 
    QPainter painter(this); 
    painter.drawLine(fromPoint.x, fromPoint.y, toPoint.x, toPoint.y); 
} 

이 문제를왔다 :

class QLineObject : public QWidget 
{ 
    Q_OBJECT 

public: 
    QLineObject(); 
    QLineObject(Point from, Point to); 

protected: 
    void paintEvent(QPaintEvent *event); 

private: 
    Point fromPoint; 
    Point toPoint; 
}; 

및 구현 파일이 내 헤더 파일입니다. 주 창에이 위젯을 추가하는 방법을 찾을 수 없습니다. QLineObject의 새 인스턴스를 만들고 show()를 호출하면 새 창이 팝업됩니다. 내가 뭔가를 놓친 것 같아. 나를 도우려는 사람이 있습니까? 나는 그것을 만들고 어딘가 다른 곳에서 그것을 추가하는 방법을 알고 싶습니다 내 메인 윈도우 생성자.

감사합니다.

+0

있다 [또 다른 완전한 답변] (http://stackoverflow.com/a/19367454/1329652) [또 하나 일반적으로 오버레이를 수행하는 방법을 보여줍니다 ] (http://stackoverflow.com/a/11044239/1329652) 오버레이 선을 그리는 방법을 보여줍니다. –

+0

[QDodckWidget의 도킹 된 위젯 위에 페인트/그리기] (http://stackoverflow.com/questions/11034838/paint-draw-on-top-of-docked-widgets-in-qdodckwidget)와 중복됩니다. 다른 질문에 대한 답은 당신이 묻고있는 모든 것을 정확하게 보여줍니다. QDockWidget 자체가 그다지 관련성이 없습니다. –

답변

4

QLineObject에서 show를 호출하면 안됩니다. 대신 주 윈도우를 생성자의 부모로 전달한 다음 상속 된 QWidget으로 전달하십시오. 이 경우 메인 윈도우 인 기본 위젯에서 쇼를 호출하십시오.

class QLineObject : public QWidget 
{ 
    public: 
     QLineObject(QWidget* parent); 
}; 

QLineObject::QLineObject(QWidget* parent) 
    : QWidget(parent) 
{ 

} 

QWidget* pWidget = new QWidget; 
QLineObject* pLineObject = new QLineObject(pWidget); 

pWidget->show(); 

또는 QLabel을 부모로 사용할 수 있습니다.

QLabel* pLabel = new QLabel(pWidget); 
QLineObject* pLineObject = new QLineObject(pLabel); 
pWidget->show(); 

또한 재정의 한 paintEvent에서 QWidget :: paintEvent를 호출하려고합니다.

+0

감사합니다. 모든 것이 지금 작동 중입니다! – Boris88

0

내가 할 것 다음

QMainWindow mw; 
QLineObject lo; 
mw.setCentralWidget(&lo); 
mw.show();