как использовать объект сцены основного файла в другом файле?

Я пытался создать игру tictactoe, используя Qt и Qgraphicsview, но когда я рисую x на доске с помощью Graphicstextitem в mousePressEvent, X не появляется. как это исправить?

Я думаю, проблема в том, что сцена текстового элемента отличается от сцены основного файла, но я не знаю, как это исправить.

основной.cpp:

int main(int argc, char *argv[])
 {
   QApplication a(argc, argv);
      Game *gm = new Game;

     Game *rect1=new Game;
  gm->scenc->setSceneRect(0,0,800,600);
  rect1->setRect(160,100,150,150);
  gm->scenc->addItem(rect1);
  gm->view->setScene(gm->scenc);
  gm->view->show();
  return a.exec();
 }

в игре.cpp:

#include <game.h>

 Game::Game()
 {
  scenc= new QGraphicsScene;
  view = new QGraphicsView;
  text= new QGraphicsTextItem;
}

 void Game::mousePressEvent(QGraphicsSceneMouseEvent *event)
 {
    if (event->buttons() == Qt::LeftButton )
     { 
                 text->setPlainText("X");
                 text->setFont(QFont("Tahoma",24));
                 text->setPos((160+160+120)/2,140);
                 scenc->addItem(text);


     } 

   }

в игре.ч:

 class Game : public QObject , public QGraphicsRectItem
{
    Q_OBJECT
    public:

     Game();

     QGraphicsScene *scenc;
     QGraphicsView *view;
     QGraphicsTextItem *text;
     void mousePressEvent(QGraphicsSceneMouseEvent *event);




       };

person J.Poniso    schedule 26.07.2019    source источник
comment
Game::mousePressEvent никогда не вызывается, потому что Game никогда не отображается. Ваш подход не очень хорош: Game должен наследоваться от QGraphicsView. См. примеры в документации Qt.   -  person Dimitry Ernot    schedule 26.07.2019


Ответы (1)


Следующий пример иллюстрирует, как это сделать правильно. Во-первых, вы должны заметить, что Game::mousePressEvent не переопределяет никакую виртуальную функцию. Это хорошая привычка использовать ключевое слово override и отбрасывать ключевое слово virtual, чтобы быть уверенным, что виртуальная функция перезаписывается.

Игра не является производной от QGraphicsScene и поэтому не имеет члена mousePressEvent.

Попробуйте следующий пример приложения.

MyScene.h

#pragma once
#include <QWidget>
#include <QDebug>
#include <QHBoxLayout>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsTextItem>
#include <QGraphicsSceneMouseEvent>

class MyScene : public QGraphicsScene {
    Q_OBJECT
public:
    MyScene(QWidget* parent = nullptr) : QGraphicsScene(parent) {
        setSceneRect(0, 0, 800, 600);       
    }
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mouseEvent) override {
        if (mouseEvent->buttons() == Qt::LeftButton)
        {
            auto text = new QGraphicsTextItem;
            addItem(text);
            text->setPlainText("X");
            text->setPos(mouseEvent->scenePos());
        }
    }
private:
    QGraphicsView* mView;
    QGraphicsTextItem* mText;
};

main.cpp

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsTextItem>
#include "MyScene.h"

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    auto scene = new MyScene;
    auto view = new QGraphicsView;
    view->setScene(scene);
    view->show();
    return a.exec();
}
person Aleph0    schedule 26.07.2019