Я хочу добавить линии программно в 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 (), он открывает новое окно. Я уверен, что просто что-то упустил. Есть ли кто-то, кто хочет мне помочь? Я хотел бы знать, как создать и добавить его откуда-то еще, что мой конструктор главного окна.
Спасибо!
Вы не должны вызывать 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.
Я бы сделал следующее:
QMainWindow mw;
QLineObject lo;
mw.setCentralWidget(&lo);
mw.show();