Здравствуйте. Такая ситуация. Есть класс Icons(QGraphicsRectItem).
А есть класс Game - QDialog с встроенным в QT Designer графической сценой.
В классе Game есть слот - changeIcons, который должен вызываться при клике по объекту класса Icons (В Icons находится *метод
mousePressEvent(QGraphicsSceneMouseEvent *event); При нажатии по Icon-у qDebug должен выводить сообщение, что все работает. Но этого не происходит.
(Возможно проблема в том, что Game наследуется от QDialog, а не от QObject (ранее я всегда наследовал класс от QObject и все работало (c теми же Icons)(а теперь, если пытаюсь унаследовать еще и от QObject компилятор сильно ругается). Но я вообще ни в чем не уверен).
Заранее спасибо
Icons - заголовочный файл#ifndef ICONS_H
#define ICONS_H
#include <QObject>
#include <QWidget>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
class Icons:public QObject, public QGraphicsRectItem
{
Q_OBJECT
public:
Icons(QGraphicsItem *parent = NULL);
void setIcon(int x, int y, int t);
void addIcon(QGraphicsScene *scene);
void removeIcon(QGraphicsScene *scene);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
int xPos, yPos, type;
private:
signals:
void clicked();
};
#endif // ICONS_H
Icons - Исходник#include "icons.h"
Icons::Icons(QGraphicsItem *parent):QGraphicsRectItem(parent)
{
}
void Icons::setIcon(int x, int y, int t)
{
xPos = x;
yPos = y;
type = t;
setRect(0,0,60,60);
QBrush brush;
brush.setStyle(Qt::SolidPattern);
switch(type)
{
case 1: brush.setColor(Qt::red); break;
case 2: brush.setColor(Qt::green); break;
case 3: brush.setColor(Qt::yellow); break;
case 4: brush.setColor(Qt::blue); break;
case 5: brush.setColor(Qt::gray); break;
}
setBrush(brush);
this->setPos(x,y);
}
void Icons::addIcon(QGraphicsScene *scene)
{
scene->addItem(this);
}
void Icons::removeIcon(QGraphicsScene *scene)
{
scene->removeItem(this);
delete this;
}
void Icons::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
emit clicked();
}
Game - заголовочный#ifndef GAME_H
#define GAME_H
#include <QDialog>
#include <QtCore>
#include <QtGui>
#include <QGraphicsScene>
#include <QGraphicsEllipseItem>
#include <QGraphicsRectItem>
#include "icons.h"
#include <QObject>
namespace Ui {
class Game;
}
class Game : public QDialog
{
Q_OBJECT
public:
explicit Game(QWidget *parent = nullptr);
~Game();
void setField();
void removeField(QGraphicsScene *scene);
void lineUp(int i, int j);
private slots:
void on_MainMenu_clicked();
void changeIcons();
private:
Ui::Game *ui;
QGraphicsScene *scene;
Icons **field;
};
#endif // GAME_H
Game - Исходник#include "game.h"
#include "ui_game.h"
#include <mainmenu.h>
#include <QAbstractScrollArea>
#include <QDebug>
Game::Game(QWidget *parent) :
QDialog(parent),
ui(new Ui::Game)
{
ui->setupUi(this);
ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
this->setField();
}
Game::~Game()
{
delete ui;
}
void Game::setField()
{
qDebug() << "here" << endl;
field = new Icons*[8];
for(int i = 0; i < 8; i++)
field[i] = new Icons[8];
for(int i = 0; i < 8; i++)
for(int j = 0; j < 8; j++)
{
this->lineUp(i,j);
field[i][j].setIcon(i*60, j*60, field[i][j].type);
field[i][j].addIcon(scene);
QObject::connect(&field[i][j], &Icons::clicked, this,&Game::changeIcons);
// QObject::connect(field[i][j], SIGNAL(clicked()), this, SLOT(changeIcons()));
}
}
void Game::removeField(QGraphicsScene *scene)
{
for(int i = 0; i < 8; i++)
for(int j = 0; j < 8; j++)
{
field[i][j].removeIcon(scene);
}
}
void Game::lineUp(int i, int j)
{
bool flag;
do{
flag = true;
field[i][j].type = ((qrand()%5)+1);
if((i < 2 && j >=2) && field[i][j-1].type == field[i][j].type && field[i][j-2].type == field[i][j].type)
{
flag = false;
}
if((i >=2 && j < 2) && field[i-1][j].type == field[i][j].type && field[i-2][j].type == field[i][j].type)
{
flag = false;
}
if((i >= 2 && j >= 2) &&
((field[i-1][j].type == field[i][j].type && field[i-2][j].type == field[i][j].type)
|| (field[i][j-1].type ==field[i][j].type && field[i][j-2].type==field[i][j].type)))
{
flag = false;
}
}while(flag == false);
}
void Game::on_MainMenu_clicked()
{
mainMenu *MMenu = new mainMenu();
MMenu->show();
delete this;
}
void Game::changeIcons()
{
qDebug() << "work" << endl;
QCoreApplication::quit();
}