Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) TestGravityWidget

 

ToolTestGravityWidget is a tool to test the GravityWidget class.

 

 

 

 

 

Downloads

 

Technical facts

 

Operating system(s) or programming environment(s)

IDE(s):

Project type:

C++ standard:

Compiler(s):

Libraries used:

 

 

 

 

 

Qt project file: ./ToolTestGravityWidget/ToolTestGravityWidgetDesktop.pro

 

include(../../DesktopApplication.pri)
include(../../Libraries/Boost.pri)
include(../../Libraries/GeneralConsole.pri)
include(../../Libraries/GeneralDesktop.pri)

include(ToolTestGravityWidgetDesktop.pri)

SOURCES += \
  qtmain.cpp

 

 

 

 

 

./ToolTestGravityWidget/ToolTestGravityWidgetConsole.pri

 

INCLUDEPATH += ../../Tools/ToolTestGravityWidget

 

 

 

 

 

./ToolTestGravityWidget/ToolTestGravityWidgetDesktop.pri

 

include(ToolTestGravityWidgetConsole.pri)

SOURCES += \
    ../../Tools/ToolTestGravityWidget/qttestgravitywidgetmaindialog.cpp \
    ../../Tools/ToolTestGravityWidget/qtgravitywidgetitem.cpp \
    ../../Tools/ToolTestGravityWidget/qtgravitywidget.cpp

HEADERS  += \
    ../../Tools/ToolTestGravityWidget/qttestgravitywidgetmaindialog.h \
    ../../Tools/ToolTestGravityWidget/qtgravitywidgetitem.h \
    ../../Tools/ToolTestGravityWidget/qtgravitywidget.h

FORMS    += ../../Tools/ToolTestGravityWidget/qttestgravitywidgetmaindialog.ui

 

 

 

 

 

./ToolTestGravityWidget/qtgravitywidget.h

 

#ifndef QTGRAVITYWIDGET_H
#define QTGRAVITYWIDGET_H

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include <QGraphicsView>
#pragma GCC diagnostic pop

struct QGraphicsScene;

struct QtGravityWidget : public QGraphicsView
{
  QtGravityWidget(QWidget * parent = 0);


  protected:
  void resizeEvent(QResizeEvent *);

  private:
  QGraphicsScene * const m_scene;
};

#endif // QTGRAVITYWIDGET_H

 

 

 

 

 

./ToolTestGravityWidget/qtgravitywidget.cpp

 

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include <QGraphicsView>
#include <QTimer>
#include "qtgravitywidget.h"
#include "qtgravitywidgetitem.h"
#pragma GCC diagnostic pop

QtGravityWidget::QtGravityWidget(QWidget *parent)
  : QGraphicsView(parent),
    m_scene(new QGraphicsScene(this->rect(),this))
{
  this->setScene(m_scene);
  //Create the item
  {
    QtGravityWidgetItem * const item = new QtGravityWidgetItem(0,m_scene);
    item->setPos(static_cast<double>(width()) * 0.5,static_cast<double>(height()) * 0.5);
  }
  //Create the main QTimer
  {
    QTimer * const timer = new QTimer(this);
    timer->setInterval(20);
    QObject::connect(timer,SIGNAL(timeout()),m_scene,SLOT(advance()));
    timer->start();
  }

  //Turn off the scrollbars, as they look ugly
  this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
}


void QtGravityWidget::resizeEvent(QResizeEvent *)
{
  m_scene->setSceneRect(this->rect());
}

 

 

 

 

 

./ToolTestGravityWidget/qtgravitywidgetitem.h

 

#ifndef QTGRAVITYWIDGETITEM_H
#define QTGRAVITYWIDGETITEM_H

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include <QGraphicsItem>
#pragma GCC diagnostic pop

struct QtGravityWidgetItem : public QGraphicsItem
{
  QtGravityWidgetItem(QGraphicsItem * parent, QGraphicsScene * scene);

  ///Must be defined, thanks compiler for telling me!
  QRectF boundingRect() const;

  ///Must be defined, thanks compiler for telling me!
  void paint(QPainter * painter, const QStyleOptionGraphicsItem *, QWidget *);

  ///Can be defined optionally, this will contain the falling motion
  void advance(int);

  private:
  ///The vertical speed
  double m_dy;

  ///The rectangle this QtGravityWidgetItem is in
  const QRectF m_rect;

  ///Read-only pointer to the QGraphicsScene this QtGravityWidgetItem is part of
  QGraphicsScene * const m_scene;

};
#endif // QTGRAVITYWIDGETITEM_H

 

 

 

 

 

./ToolTestGravityWidget/qtgravitywidgetitem.cpp

 

#include <cassert>
#include <cmath>

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include <QGraphicsScene>
#include <QPainter>
#include "qtgravitywidgetitem.h"
#pragma GCC diagnostic pop

QtGravityWidgetItem::QtGravityWidgetItem(
  QGraphicsItem * parent,
  QGraphicsScene * scene)
  : QGraphicsItem(parent),
    m_dy(0.0),
    m_rect(-16.0,-16.0,32.0,32.0),
    m_scene(scene)
{
  assert(m_scene);
  m_scene->addItem(this);
}

void QtGravityWidgetItem::advance(int)
{
  const double acceleration = 0.1;

  //If the new y coordinat (after acceleration) causes the bottom of the QtGravityWidgetItem
  //to be beyond the edge of the QGraphicsScene, turn the vertical speed upwards
  if (y() + m_dy + acceleration + (m_rect.height() * 0.5) > m_scene->height()) m_dy = -std::abs(m_dy + acceleration);

  //Accelerate the QtGravityWidgetItem
  m_dy+=acceleration;

  //Move the QtGravityWidgetItem
  setY(y() + m_dy);

  //Move the QtGravityWidgetItem up when the QGraphicsScene is resized so much
  //that the QtGravityWidgetItem gets out of sight
  if (y() + (m_rect.height() * 0.5) > m_scene->height())
  {
    //Move the QtGravityWidgetItem to the bottom of the QGraphicsScene
    setY(m_scene->height() - (m_rect.height() * 0.5));

    //Set the vertical speed to zero, otherwise there is need to check if the QtGravityWidgetItem
    //leaves the top of the QGraphicsScene
    m_dy = 0.0;
  }
}

QRectF QtGravityWidgetItem::boundingRect() const
{
  return m_rect;
}

void QtGravityWidgetItem::paint(QPainter * painter, const QStyleOptionGraphicsItem *, QWidget *)
{
  painter->drawEllipse(m_rect);
}

 

 

 

 

 

./ToolTestGravityWidget/qtmain.cpp

 

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include <QApplication>
#include "qttestgravitywidgetmaindialog.h"
#pragma GCC diagnostic pop

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  QtTestGravityWidgetMainDialog w;
  w.show();
  return a.exec();
}

 

 

 

 

 

./ToolTestGravityWidget/qttestgravitywidgetmaindialog.h

 

#ifndef TOOLTESTGRAVITYWIDGETMAINDIALOG_H
#define TOOLTESTGRAVITYWIDGETMAINDIALOG_H

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include <QDialog>
#pragma GCC diagnostic pop

namespace Ui {
  class QtTestGravityWidgetMainDialog;
}

class QtTestGravityWidgetMainDialog : public QDialog
{
  Q_OBJECT
    
public:
  explicit QtTestGravityWidgetMainDialog(QWidget *parent = 0);
  QtTestGravityWidgetMainDialog(const QtTestGravityWidgetMainDialog&) = delete;
  QtTestGravityWidgetMainDialog& operator=(const QtTestGravityWidgetMainDialog&) = delete;
  ~QtTestGravityWidgetMainDialog() noexcept;

private:
  Ui::QtTestGravityWidgetMainDialog *ui;
};

#endif // TOOLTESTGRAVITYWIDGETMAINDIALOG_H

 

 

 

 

 

./ToolTestGravityWidget/qttestgravitywidgetmaindialog.cpp

 

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QTimer>
#include "qtgravitywidget.h"
#include "qtgravitywidgetitem.h"
#include "qttestgravitywidgetmaindialog.h"
#include "ui_qttestgravitywidgetmaindialog.h"
#pragma GCC diagnostic pop

QtTestGravityWidgetMainDialog::QtTestGravityWidgetMainDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QtTestGravityWidgetMainDialog)
{
  ui->setupUi(this);
}

QtTestGravityWidgetMainDialog::~QtTestGravityWidgetMainDialog() noexcept
{
  delete ui;
}

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict

This page has been created by the tool CodeToHtml