2014-03-27 99 views
1

我想在QLabel兩點之間編程方式添加行。從我發現的看來,唯一的辦法就是創建一個QWidget的子類來改變PaintEvent()保護的方法。繪製線條編程使用Qt

所以,我創建QWidget的一類新的 'QLineObject'。這是我的頭文件:

class QLineObject : public QWidget 
{ 
    Q_OBJECT 

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

protected: 
    void paintEvent(QPaintEvent *event); 

private: 
    Point fromPoint; 
    Point toPoint; 
}; 

和實現文件:

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

這裏的來的問題。我找不到如何在我的主窗口中添加這個小部件。如果我創建一個新的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表演。相反,將主窗口作爲父窗口傳遞給您的構造函數,並將其傳遞給繼承的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();