用Qt编程绘制线条



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

因此,我从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(),它会弹出一个新窗口。我肯定是漏掉了什么。有人想帮我吗?我想知道如何创建和添加它从其他地方,我的主窗口构造器。

谢谢!

你不应该在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。

我会这样做:

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

最新更新