Взаимодействие с Qlabel щелчком мыши - PullRequest
1 голос
/ 05 мая 2020

В настоящее время я воспроизводю игру 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);
        }
    }
}
...