Как правильно использовать виджеты созданные через 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 поверх него не появляется из-за той ошибки о которой написал ранее. Простым языком, не рисуются кресла поверх стола, рисуется только стол.