Time for action – making the chess game interactive
We have managed to display the chess board but to actually play a game, we have to tell the program what moves we want to play. We could do that by adding the QLineEdit
widget where we would input the move in algebraic form (for example, Nf3
to move a knight to f3
), but a more natural way is to click a piece with the mouse cursor (or tap it with a finger) and then click again on the destination field. To obtain such functionality, the first thing to do is to teach ChessView
to detect mouse clicks. Therefore, add the following method:
QPoint ChessView::fieldAt(const QPoint &pt) const { if(!m_board) return QPoint(); const QSize fs = fieldSize(); int offset = fontMetrics().width('M')+4; // 'M' is the widest letter if(pt.x() < offset) return QPoint(); int c = (pt.x()-offset) / fs.width(); int r = pt.y()/fs.height(); if(c < 0 || c >= m_board->columns() || r<0 || r >= m_board->ranks()) ...