В настоящее время я воспроизводю игру Diaballik на qwidget с помощью qtcreator.
Я решил сделать страницу входа, а также страницу игры.
Проблема в том, что мне нужен qgridlayout, в котором я добавляю кнопки или метки, с которыми мне нужно взаимодействовать с помощью щелчка мыши.
Итак, я создал qgridlayout, помещенный внутри некоторого qlabel, который я изменяю значение на qpixmap, чтобы показать фон случая
Но я не знаю, как взаимодействовать с моим щелчком мыши, например, чтобы изменить растровое изображение метки или добавить изображение поверх уже добавленного фонового изображения?
Основной класс приложения : MainWindow. cpp
#include "mainwindow.h"
#include <QApplication>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget * parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("Diaballik - Acceuil");
gameWindow = new GameWindow(this);
//std::vector<std::vector<tile>>_tiles;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
if (!ui->BluePlayerName->text().isEmpty() &&
!ui->RedPlayerName->text().isEmpty())
{
gameWindow = new GameWindow(this);
hide();
gameWindow->setBlueName(ui->BluePlayerName->text());
gameWindow->setRedName(ui->RedPlayerName->text());
if (ui->Five->isChecked())
{
_size = 5;
}
if (ui->Seven->isChecked())
{
_size = 7;
}
if (ui->Nine->isChecked())
{
_size = 9;
}
//generateTiles();
gameWindow->createBoard(_size);
gameWindow->show();
}
}
void MainWindow::on_actionQuit_triggered()
{
QApplication::quit();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "gamewindow.h"
#include <string>
QT_BEGIN_NAMESPACE
namespace Ui
{
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget * parent = nullptr);
~MainWindow();
QString getBlueName();
QString getRedName();
//std::vector<std::vector<tile>> getTiles();
private slots:
void on_pushButton_clicked();
void on_actionQuit_triggered();
void generateTiles();
private:
Ui::MainWindow * ui;
GameWindow * gameWindow;
int _size;
//std::vector<std::vector<tile>> _tiles;
};
#endif // MAINWINDOW_H
Класс страницы игры: gameWindow. cpp
#include "gamewindow.h"
#include "ui_gamewindow.h"
#include <QMessageBox>
#include <QPixmap>
GameWindow::GameWindow(QWidget * parent) :
QMainWindow(parent),
ui(new Ui::GameWindow)
{
ui->setupUi(this);
QPixmap blueCircle("Img/BlueCircle.jpg");
QPixmap redCircle("Img/RedCircle.png");
ui->BluePieceImg->setPixmap(blueCircle.scaled(20, 20,
Qt::KeepAspectRatio));
ui->RedPieceImg->setPixmap(redCircle.scaled(19, 19,
Qt::KeepAspectRatio));
this->setWindowTitle("Diaballik - Jeu");
}
GameWindow::~GameWindow()
{
delete ui;
}
void GameWindow::on_pushButton_clicked()
{
//endTurn()
}
void GameWindow::on_pushButton_2_clicked()
{
//endTurn()
//changer pour mettre le bon gagnant (d'ou le endTurn() )
QMessageBox::StandardButton reply = QMessageBox::question(this,
"Fin de partie",
"Le Joueur Bleu gagne la partie \n Voulez vous quitter ?",
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes)
{
QApplication::quit();
}
else
{
//recommencer la partie avec wins+1 au gagnant sur l affichage en haut a droite
}
}
void GameWindow::on_actionQuit_triggered()
{
QApplication::quit();
}
void GameWindow::on_actionAcceuil_triggered()
{
hide();
this->parentWidget()->show();
}
void GameWindow::setBlueName(QString name)
{
ui->BluePlayerNameInfo->setText(name);
}
void GameWindow::setRedName(QString name)
{
ui->RedPlayerNameInfo->setText(name);
}
void GameWindow::createBoard(int size)
{
QPixmap blueCircle("Img/tile.png");
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
QLabel *piece = new QLabel;
//en attendant d emplementer l autre version de Diaballik, toutes les pieces seront représentées de la meme facon
if (size==5) {
piece->setPixmap(blueCircle.scaled(75, 75,
Qt::KeepAspectRatio));
//piece->setText("salut");
}else if (size==7) {
piece->setPixmap(blueCircle.scaled(50, 50,
Qt::KeepAspectRatio));
}else if (size==9) {
piece->setPixmap(blueCircle.scaled(40, 40,
Qt::KeepAspectRatio));
}
ui->board->addWidget(piece, i, j);
}
}
}
gamewindow.h
#ifndef GAMEWINDOW_H
#define GAMEWINDOW_H
#include <QMainWindow>
#include "tile.h"
namespace Ui
{
class GameWindow;
}
class GameWindow : public QMainWindow
{
Q_OBJECT
public:
explicit GameWindow(QWidget * parent = nullptr);
~GameWindow();
void setBlueName(QString name);
void setRedName(QString name);
void createBoard(int size);
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_actionQuit_triggered();
void on_actionAcceuil_triggered();
void Mouse_pressed();
private:
Ui::GameWindow * ui;
};
#endif // GAMEWINDOW_H
Я добавляю Qlabel на доску здесь:
void GameWindow::createBoard(int size)
{
QPixmap blueCircle("Img/tile.png");
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
QLabel *piece = new QLabel;
//en attendant d emplementer l autre version de Diaballik, toutes les pieces seront représentées de la meme facon
if (size==5) {
piece->setPixmap(blueCircle.scaled(75, 75,
Qt::KeepAspectRatio));
//piece->setText("salut");
}else if (size==7) {
piece->setPixmap(blueCircle.scaled(50, 50,
Qt::KeepAspectRatio));
}else if (size==9) {
piece->setPixmap(blueCircle.scaled(40, 40,
Qt::KeepAspectRatio));
}
ui->board->addWidget(piece, i, j);
}
}
}