Обратите внимание, что Qt уже встроил очень хороший виджет графической сцены.Взгляните на Graphics View Framework .Он оптимизирован для тысяч элементов, поддерживает несколько видов для одной сцены, масштабирование, сдвиг, поворот и т. Д.
Но если вы хотите справиться с этим самостоятельно:
Координаты всобытие рисования всегда относительно корня виджета.Таким образом, (0,0)
- это верхний левый угол виджета, независимо от того, где он находится (см. системы координат ).
Когда вы добавляете вспомогательный виджет (как ваши узлы) непосредственно ввиджет (в отличие от использования макета), вы его размещаете в верхнем левом углу.Его размер определяется как sizeHint
.
Так что теперь, когда вы нажимаете, например, на (200,200)
, вы добавите новый виджет и соответственно установите его элементы положения.Это приводит к наличию виджета Node
в вашем виджете GraphView
с (0,0)
размером (100,30)
.Затем в событии рисования вы рисуете прямоугольник в (200,200)
, который находится за пределами виджета!
Вы должны установить геометрию, чтобы дочерний виджет помещался в систему координат Qt:
void GraphView::mouseDoubleClickEvent (QMouseEvent * event) {
auto ptr = new Node(this);
ptr->setGeometry(event->x(), event->y(), ptr->width, ptr->height);
nodes.push_back(ptr);
ptr->show();
}
А потом сделайте свой рисунок (0,0)
на основе:
void Node::paintEvent (QPaintEvent * event) {
QPainter painter(this);
painter.setBrush(QColor(127,127,127));
painter.drawRect(0, 0, width, height);
}