QGraphicsScene QPainterPath::arcTo: Adding arc where a parameter is NaN, results are undefined
-
Hello,
I just started out with QT and have a problem that I can't seem to solve.
I'm working on Nine Men's Morris and the everything works great, except for a strange bug that creeps up.Sometimes, when I click on a Item the GraphicsView turns white and the following error is shown several times in the debug window:
QPainterPath::arcTo: Adding arc where a parameter is NaN, results are undefined
The GraphicsView cannot be recovered by resizing, etc., only by restarting the game.
I've created a MainWindow and with a QGraphicsView and a QGraphicsScene.
I created 3 seperate QGraphicsItems
- A boardLayout which renders the background and does not handle click events.
- A Token Item that handles click events, the color of the token, if it's selected, etc.
- A BoardPosition Item that is invisible and handles the events when you click on an empty position on the board. Clicking this item causes the error described above.
MainWindow Code:
@
ui->setupUi(this);
this->setWindowIcon(QPixmap(QString(":/Images/icon2.jpeg")));showWin = new WinDialog(this); startWindow = new StartDialog(this); view = new QGraphicsView(this); this->setCentralWidget (view); view->setVerticalScrollBarPolicy (Qt::ScrollBarAlwaysOff); view->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff); view->setMinimumSize (1000, 800); view->setViewportUpdateMode (QGraphicsView::FullViewportUpdate); view->setCacheMode (QGraphicsView::CacheNone); view->setRenderHints (QPainter::Antialiasing | QPainter::TextAntialiasing); scene = NULL; //this->debugWidget = new DebugWidget(this); //this->debugWidget->setMinimumWidth (200); this->layout = NULL; this->controller = NULL; this->whiteTokensSet = 0; this->blackTokensSet = 0;
}
void MainWindow::Initalize()
{
scene = new QGraphicsScene();
scene->setBackgroundBrush (QBrush(Qt::gray));
view->setScene (scene);
this->layout = new BoardLayout();
scene->addItem(layout);float x = 0.081f; float y = 0.025f; for(int i = 0; i < 7; i++) { text.append(scene->addText(QString('A'+i))); text.at(i)->setX(x+(i*0.13)); text.at(i)->setY(y - 0.008); text.at(i)->setScale(0.003); } x = 0.072f; for(int i = 7; i < 14; i++) { text.append(scene->addText(QString('1'+(i-7)))); text.at(i)->setX(y); text.at(i)->setY(x+((i-7)*0.13)); text.at(i)->setScale(0.003); } this->controller = new GameController(this); view->fitInView (layout, Qt::KeepAspectRatio); points[0] = QPointF(0.085f, 0.085f); points[1] = QPointF(0.475f, 0.085f); points[2] = QPointF(0.865f, 0.085f); points[3] = QPointF(0.215f, 0.215f); points[4] = QPointF(0.475f, 0.215f); points[5] = QPointF(0.735f, 0.215f); points[6] = QPointF(0.345f, 0.345f); points[7] = QPointF(0.475f, 0.345f); points[8] = QPointF(0.605f, 0.345f); points[9] = QPointF(0.085f, 0.475f); points[10] = QPointF(0.215f, 0.475f); points[11] = QPointF(0.345f, 0.475f); points[12] = QPointF(0.605f, 0.475f); points[13] = QPointF(0.735f, 0.475f); points[14] = QPointF(0.865f, 0.475f); points[15] = QPointF(0.345f, 0.605f); points[16] = QPointF(0.475f, 0.605f); points[17] = QPointF(0.605f, 0.605f); points[18] = QPointF(0.215f, 0.735f); points[19] = QPointF(0.475f, 0.735f); points[20] = QPointF(0.735f, 0.735f); points[21] = QPointF(0.085f, 0.865f); points[22] = QPointF(0.475f, 0.865f); points[23] = QPointF(0.865f, 0.865f); for(int i = 0; i < 24; i++) { boardPositions.append (new BoardPosition(i, points[i].x(), points[i].y(), this->controller)); this->scene->addItem(boardPositions.at (i)); } whiteTokensSet = 0; blackTokensSet = 0; for(int i = 0; i < 9; i++) { whiteTokens.append(new GameToken(WHITE, this->controller)); whiteTokens.at(i)->setVisible(false); this->scene->addItem(whiteTokens.at(i)); blackTokens.append(new GameToken(BLACK, this->controller)); blackTokens.at(i)->setVisible(false); this->scene->addItem(blackTokens.at(i)); } this->startWindow->close (); //this->debugWidget->appendText(QString("Welcome to Nine Men's Morris!")); //this->addDockWidget(Qt::LeftDockWidgetArea, this->debugWidget); this->show(); this->resize(QSize(1001, 801));
}
@
BoardPositions Code:
@
#include "boardposition.h"
#include "gamecontroller.h"BoardPosition::BoardPosition(int pos, float coordx, float coordy, GameController *controller) :
QGraphicsItem()
{
boardPos = pos;
posx = coordx;
posy = coordy;
this->controller = controller;
}QRectF BoardPosition::boundingRect() const
{
return QRectF(posx, posy, 0.05, 0.05);
}void BoardPosition::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
painter->setPen(Qt::NoPen);
painter->setBrush(Qt::transparent);painter->drawRect(QRectF(posx, posy, 0.05, 0.05));
}
void BoardPosition::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
controller->boardClicked(boardPos);}
@How could I debug this error, or did I do something entirely wrong?
Please let me know if you need any other information. (You can cownload the whole code here: https://www.dropbox.com/s/osc7l2tyxf63qp6/nine-mens-morris-ff306f393749.zip )