用Qt编程绘制线条

时间:2014-03-27 16:07:39

标签: c++ qt paintevent

我想在两个点之间的QLabel中以编程方式添加行。根据我的发现,似乎唯一的方法是将QWidget子类化以更改受PaintEvent()保护的方法。

所以,我创建了一个新类' QLineObject'来自QWidget。这是我的头文件:

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(),它会弹出一个新窗口。我确定我只是遗漏了一些东西。有人想帮助我吗?我想知道如何从我的主窗口构造函数的其他地方创建和添加它。

谢谢!

2 个答案:

答案 0 :(得分:4)

你不应该在QLineObject上调用show。而是将主窗口作为父窗口传递给构造函数,并将其传递给继承的QWidget。然后在主窗口小部件上调用show,在这种情况下是主窗口...

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。

答案 1 :(得分:0)

我会做以下事情:

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