Russian Qt Forum
Ноябрь 23, 2024, 18:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подключение сигнала к QGraphicsItem  (Прочитано 1982 раз)
SibVenn
Гость
« : Ноябрь 06, 2018, 16:03 »

Здравствуйте. Такая ситуация. Есть класс 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();
}

Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Ноябрь 12, 2018, 17:41 »

Наследуйтесь от QGraphicsObject
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 22.