Рисование линий программно с помощью Qt

Я хочу добавить линии программно в 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 (), он открывает новое окно. Я уверен, что просто что-то упустил. Есть ли кто-то, кто хочет мне помочь? Я хотел бы знать, как создать и добавить его откуда-то еще, что мой конструктор главного окна.

Спасибо!

1

Решение

Вы не должны вызывать show в QLineObject. Вместо этого передайте главное окно как родительский элемент вашему конструктору и передайте его унаследованному 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();

Кроме того, вы, вероятно, хотите вызывать QWidget :: paintEvent в переопределенном paintEvent.

4

Другие решения

Я бы сделал следующее:

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

По вопросам рекламы [email protected]