Как правильно использовать виджеты созданные через paintEvent?

У меня есть два виджета, нарисованные с помощью PaintEvent. Покерный стол и Место за столом.

Я не понимаю, почему места не рисуются и QPainter выдает ошибку:

QPainter::begin: Paint device returned engine == 0, type: 1

Как правильно сделать это? Что я хочу, я хочу чтобы мои два виджета рисовались на одном экране но тем не менее были разными классами и каждый обрабатывал свои события в дальнейшем

PokerTable.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QLine>
#include "SitPlace.h"

class PokerTable : public QWidget
{
    Q_OBJECT

public:
    PokerTable(QWidget *parent = nullptr);
    ~PokerTable();
private:
    SitPlace* sitAtTheTableButton;
protected:
    void paintEvent(QPaintEvent *event) override;

};
#endif // WIDGET_H

PokerTable.cpp

#include "PokerTable.h"
#include <QDebug>


PokerTable::PokerTable(QWidget *parent)
    : QWidget(parent),
      sitAtTheTableButton(new SitPlace(this))
{

}

void PokerTable::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    QPainter painter(this);

    int side = qMin(width(), height());
    if((width() - height()) / 2 > 0)
        painter.setViewport((width() - height()) / 2, (height() - side) / 2, side, side);
    else
        painter.setViewport(0, (height() - side) / 2, side, side);
    painter.setWindow(-100, -100, 200, 200);


    QBrush brushPokerTable(QColor(8,115,83));
    QPen penEdgeOfTable(QColor(85,110,107), 10);
    QPen penPokerTableCardArea(QColor(146,170,70), 1);
    QPen penShadows(QColor(63, 63, 63, 200), 2);

    QRect table(QPoint(-100, -50), QPoint(100,50));
    QRect rectCardArea(QPoint(-80, -30), QPoint(80,30));
    QRect rectEdgeOfTable(QPoint(-100, -50), QPoint(100,50));
    QRect rectOfShadows(QPoint(-96, -45), QPoint(96,45));

    painter.setBrush(brushPokerTable);
    painter.drawRoundedRect(table,30,30); //TODO:Calculate Rounder

    painter.setPen(penEdgeOfTable);
    painter.drawRoundedRect(rectEdgeOfTable,30,30);

    painter.setPen(penShadows);
    painter.drawRoundedRect(rectOfShadows,30,30);

    painter.setPen(penPokerTableCardArea);
    painter.drawRoundedRect(rectCardArea,15,15);

    sitAtTheTableButton->move(50,50);
    
}

PokerTable::~PokerTable()
{
}


SitPlace.h

#ifndef SITATTHETABLE_H
#define SITATTHETABLE_H
#include <QWidget>
#include <QPainter>
#include <QDebug>

class SitPlace : public QWidget
{
    Q_OBJECT
public:
    SitPlace(QWidget *parent = nullptr);
    ~SitPlace();
private:


protected:
    void paintEvent(QPaintEvent *event) override;

    void mousePressEvent(QMouseEvent *event) override;
    /*void mouseReleaseEvent(QMouseEvent *event) override;*/

};

#endif // SITATTHETABLE_H

#include "SitPlace.h"

SitPlace::SitPlace(QWidget *parent):QWidget(parent)
{

}

SitPlace::~SitPlace()
{

}


void SitPlace::paintEvent(QPaintEvent* event)
{

    Q_UNUSED(event);
    QObject* p = parent();
    QWidget* parent = qobject_cast<QWidget*>(p);
    QPainter painter(parent);

    //painter.begin(parent);
    /*int side = qMin(width(), height());
    if((width() - height()) / 2 > 0)
        painter.setViewport((width() - height()) / 2, (height() - side) / 2, side, side);
    else
        painter.setViewport(0, (height() - side) / 2, side, side);
    painter.setWindow(-100, -100, 200, 200);*/
    QRect sitButtonRect(QPoint(100,100), QSize(40,20));
    painter.drawText(sitButtonRect, Qt::AlignCenter, QString("Place"));
    painter.fillRect(sitButtonRect,QColor(100,100,100,100));
}


void SitPlace::mousePressEvent(QMouseEvent *event)
{
    qDebug()<<"mousePressEvent\n";
}

Я знаю, что QPainter работает только там, где его объявили, но все же, как мне реализовать этот паттерн, как мне реально разделить обязанности между виджетами, если QT мне не позволяет переопределить и вызывать 2 PaintEvent?

Все что рисует мне программа сейчас, так это PokerTable. SitPlace поверх него не появляется из-за той ошибки о которой написал ранее. Простым языком, не рисуются кресла поверх стола, рисуется только стол.


Ответы (0 шт):