2015-12-29 3 views
-1

Моя программа имеет QGraphicsView под названием SimulatorGV и имеет QGraphicsScene под названием Simulation. В основной функции я нарисовал несколько прямоугольников и эллипсов. Я хочу иметь возможность рисовать на одной и той же сцене в другой функции.Как вы меняете QGraphicsScene из другой функции?

По существу, как вы добавляете фигуры к сцене из другой функции?(который вызывается при нажатии кнопки на интерфейсе пользователя)


До сих пор я пытался передать QGraphicsView к другой функции? Ниже основная функция щ (не относящиеся к делу заявления вырезают):

{ 
    ui->setupUi(this); 
    Simulation = new QGraphicsScene(this); 


     ui->SimulatorGV->setScene(Simulation); 

     Simulation->addRect(0,415,20,50,noPen,greyBrush); 
     Simulation->addRect(425,230,10,420,noPen,goldBrush); 
     Simulation->addEllipse(80,90,700,700,greyPen,noBrush); 
     Simulation->addRect(72,215,90,450,noPen,blackBrush); 

} 

В заголовочном файле я объявил эту функцию в частных слотами:

void DrawingSimulation(QGraphicsView *SimulationGV); 

Если это будет так, вместо ?

void DrawingSimulation(QGraphicsScene *Simulation); 

Я назвал эту функцию в другую функцию:

DrawingSimulation(ui->SimulatorGV); 

Если это будет так, а?

DrawingSimulation(ui->SimulatorGV->Simulation); 

или?

DrawingSimulation(ui->Simulation); 

Это функция, которую я хочу, чтобы иметь возможность рисовать на сцене из:

void RASP::DrawingSimulation(QGraphicsView *SimulationGV) 
{ 
    for (int i = 0; i < DisplayAlphaParticleNumber; i++) 
    { 
     if (ParticleLocation[i*6+3] != 0 || ParticleLocation[i*6+6] != 0) 
     { 
      ui->SimulatorGV->setScene(Simulation); 
      Simulation->addEllipse(ParticleLocation[i*6+3],ParticleLocation[i*6+4],10,10); 
     } 
    } 
} 

SimulatorGV это имя QGraphicsView в моем виде Ui. RASP - название проекта. ParticleLocation[i*6+3] - координата x, а [i*6+4] - координата y.

Был ли я прав передать QGraphicsView на varibale вместо QGraphicsScene Simulation?

Правильно ли я передал его?

В функции DrawingSimulation я правильно добавил эллипс?

Редактировать: По существу, как вы добавляете фигуры к сцене из другой функции?(который вызывается при нажатии кнопки на интерфейсе пользователя)

Когда кнопка нажата эта функция называется:

void RASP::on_Button1_clicked() 
    { 
    //some values set 
    //some other functions called then the main one that leads to the drawingsimulation 

    mainfunction(); 
    } 

Тогда внутри mainfunction():

void RASP::mainfunction() 
{ 
    DrawingSimulation(); //is called 
} 

сейчас вызывается функция DrawingSimulation(), которую я хотел бы нарисовать на исходной сцене в RASP::RASP() (MyClass :: MyClass).


Моя предыдущая попытка была иметь булеву функцию, которая истинна с помощью кнопки затем addEllipse:

MyClass::MyClass() 
{ 
ui->setupUi(this); 
     Simulation = new QGraphicsScene(this); 


      ui->SimulatorGV->setScene(Simulation); 

      Simulation->addRect(0,415,20,50,noPen,greyBrush); 
      Simulation->addRect(425,230,10,420,noPen,goldBrush); 
      Simulation->addEllipse(80,90,700,700,greyPen,noBrush); 
      Simulation->addRect(72,215,90,450,noPen,blackBrush); 

if (SimulationRun == true) 
{ 
for (int i = 0; i < DisplayAlphaParticleNumber; i++) 
     { 
      if (ParticleLocation[i*6+3] != 0 || ParticleLocation[i*6+6] != 0) 
      { 
       ui->SimulatorGV->setScene(Simulation); 
       Simulation->addEllipse(ParticleLocation[i*6+3],ParticleLocation[i*6+4],10,10); 
      } 
     } 
} 
} 

, а затем на кнопку нажал функцию настройки SimulationRun = ИСТИНА.

+0

Это становится грязным. Я чувствую, что ваша проблема заключается в том, чтобы на самом деле знать, как вызывать функции и передавать параметры в C++ ... нет реальной конкретной проблемы с классом 'QGraphicsScene'. Пожалуйста, изучите некоторые базовые возможности C++, прежде чем пытаться делать сложные вещи, как вы пытаетесь. – jpo38

+0

@ jpo38 Моя основная проблема заключается в том, что я не использовал сигналы и слоты. Я думаю, что я могу решить эту проблему, используя ее благодаря вашему сообщению. Я студент, который был немного амбициозен со школьным проектом, но вы ответ, безусловно, был полезным, большое вам спасибо :). – AlarmingMonkey

ответ

1

Давайте будем простыми.

Если у вас есть:

MyClass::MyClass() : ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    Simulation = new QGraphicsScene(this); 

    ui->SimulatorGV->setScene(Simulation); 

    Simulation->addRect(0,415,20,50,noPen,greyBrush); 
    Simulation->addRect(425,230,10,420,noPen,goldBrush); 
    Simulation->addEllipse(80,90,700,700,greyPen,noBrush); 
    Simulation->addRect(72,215,90,450,noPen,blackBrush); 
} 

Если это работает, то это тоже будет работать:

MyClass::MyClass() : ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    Simulation = new QGraphicsScene(this); // supposing MyClass has a Simulation attribute of type QGraphicsScene 

    ui->SimulatorGV->setScene(Simulation); 

    addItems(); // calling function below 
} 

void MyClass::addItems() 
{ 
    // declared "void addItems();" in header file 
    addItems(Simulation); // calling function below that could be static 
} 

void MyClass::addItems(QGraphicsScene* simu) 
{ 
    // declared "static void addItems(QGraphicsScene* simu);" in header file 
    simu->addRect(0,415,20,50,noPen,greyBrush); 
    simu->addRect(425,230,10,420,noPen,goldBrush); 
    simu->addEllipse(80,90,700,700,greyPen,noBrush); 
    simu->addRect(72,215,90,450,noPen,blackBrush); 
} 

Затем, если это работает, теперь вы знаете, как изменить secene от «другого функция».

Наконец, вы также должны иметь:

void MyClass::DrawingSimulation() 
{ 
    // declared "void DrawingSimulation();" in header file 
    DrawingSimulation(Simulation); 
} 

void MyClass::DrawingSimulation(QGraphicsScene *simu) 
{ 
    // declared "void DrawingSimulation(QGraphicsScene *simu);" in header file 
    for (int i = 0; i < DisplayAlphaParticleNumber; i++) 
    { 
     if (ParticleLocation[i*6+3] != 0 || ParticleLocation[i*6+6] != 0) 
     { 
      simu->addEllipse(ParticleLocation[i*6+3],ParticleLocation[i*6+4],10,10); 
     } 
    } 
} 

Обратите внимание, что DrawingSimulation() также может быть slot (объявлять его с помощью public slots: в файле заголовка Затем, если вы connect его к clicked()signal а. QPushButton вашего графического интерфейса (например), он будет вызываться при нажатии кнопки и добавлении эллипса.

MyClass::MyClass() 
{ 
    ... 

    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(DrawingSimulation())); 
} 
+0

Спасибо за ответ: D Вы - метод больше. это моя ошибка, поскольку не упоминается в вопросе о том, что другая функция вызывается при нажатии кнопки в моем пользовательском интерфейсе (на самом деле она вызывается другой функцией, вызываемой при нажатии кнопки). Я добавил код для нажатия кнопки в главном вопросе в конце. Не могли бы вы объяснить, как я могу назвать функцию «добавить элементы» при нажатии кнопки? Я также включил свою попытку сделать это. – AlarmingMonkey

+0

Обновлено мое сообщение, пожалуйста, посмотрите. – jpo38

+0

Эй, я пытался реализовать ваше предыдущее предложение (второй блок кода) и задать два вопроса: что вы подразумеваете под 'ui = new ....;'? и как вы объявили функцию в файле заголовка?Потому что, когда вы используете 'addItems()' программа выводит ошибку ', функция не принимает 0 аргументов ", когда я объявляю как' void addItems (QGraphicsScene * scene); 'и говорит, что функция функции перегрузки не найдена или объявлена ​​как Функция void addItems(); '" не принимает 1 аргумент ". Я попробовал ваш пример для нового проекта, чтобы проверить его и будет включать полный код в редактирование. Спасибо :) – AlarmingMonkey

Смежные вопросы