c++ - 使用 Qt 以编程方式绘制线条

标签 c++ qt paintevent

我想以编程方式在 QLabel 中的两点之间添加线条。根据我的发现,唯一的方法似乎是子类化 QWidget 来更改 PaintEvent() protected 方法。

因此,我从 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。

关于c++ - 使用 Qt 以编程方式绘制线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22693138/

相关文章:

c++ - 控制 paintGL 方法 - 如何决定绘制什么?

c++ - 如何在类定义中初始化 vector 成员变量?

c++ - 如何在 C++ 中自动添加和获取 128 位数字?

c++ - 如何使用 C++ 创建 BMP 文件?

c++ - Qt释放内存

c++ - 找到上信封的最大长度

c++ - 我的 C++ 代码无法处理(一点点)快速数据流量

c# - 如何在 Windows 窗体中平滑地重新绘制面板

c++ - Qt paintEvent() 异常触发