Reputation: 21
I'm new to Qt and C++. I'm trying to create a checker/chess board where each square is an object. What I'm trying to figure out is how to have each square object be a part of the board object I'm declaring and display that on the screen. I can display a widget on the screen by using MyWidget.show() in the main class. But I want to do something like Board.show() and have all of the square objects that are members of that class(that have a height, width, and color) show up. With the code I tried nothing showed up, although I was able to get a square to show up that was NOT in the board class.
main.cpp
#include <qtgui>
#include "square.h"
#include "board.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
//Square square;
//square.show();
Board board;
board.show();
return app.exec();
}
board.h and board.cpp
#ifndef BOARD_H
#define BOARD_H
#include <QWidget>
class Board : public QWidget
{
public:
Board();
};
#endif // BOARD_H
#include "board.h"
#include "square.h"
Board::Board()
{
Square square;
//square.show();
}
square.h and square.cpp*strong text*
#ifndef SQUARE_H
#define SQUARE_H
#include <QWidget>
class Square : public QWidget
{
public:
Square();
protected:
void paintEvent(QPaintEvent *);
};
#endif // SQUARE_H
#include "square.h"
#include <QtGui>
Square::Square()
{
QPalette palette(Square::palette());
palette.setColor(backgroundRole(), Qt::white);
setPalette(palette);
}
void Square::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(QBrush("#c56c00"));
painter.drawRect(10, 15, 90, 60);
}
Upvotes: 1
Views: 1133
Reputation: 9388
Your Square
is created as an automatic variable (ie, its lifetime is the scope of the constructor of Board
).
show()
will make a widget visible, as long as the event loop can handle the widget, which is not the case here (square
will be deleted before the event loop).
Also, you should add the Q_OBJECT
macro in every class derived from QObject
. Board
is derived from QWidget
, which is derived from QObject
.
So, change your class Board
:
class Square;
class Board : public QWidget
{
Q_OBJECT
public:
Board();
private:
Square* square;
};
the constructor:
Board::Board()
{
square = new Square();
square->show();
}
and the destructor:
Board::~ Board()
{
delete square;
}
Note: for me, having a Square
class is useless. You can paint a grid in the paintEvent
of Board
, it will be faster, consume less memory, and be easier to maintain.
EDIT: here is a better method:
void Board::paintEvent(QPaintEvent* pe)
{
// Initialization
unsigned int numCellX = 8, numCellY = 8;
QRect wRect = rect();
unsigned int cellSizeX = wRect.width() / numCellX;
unsigned int cellSizeY = wRect.height() / numCellY;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// Draw the background. The whole widget is drawed.
painter.setBrush(QColor(0,0,0)); //black
painter.drawRect(wRect);
// Draw the cells which are of the other color
// Note: the grid may not fit in the whole rect, because the size of the widget
// should be a multiple of the size of the cells. If not, a black line at the right
// and at the bottom may appear.
painter.setBrush(QColor(255,255,255)); //white
for(unsigned int j = 0; j < numCellY; j++)
for(unsigned int i = j % 2; i < numCellX; i+=2)
painter.drawRect(i * cellSizeX, j * cellSizeY, cellSizeX, cellSizeY);
}
Upvotes: 2