你如何从另一个函数更改QGraphicsScene



我的程序有一个名为SimulatorGV的QGraphicsView,它有一个名为Simulation的QGraphicsScene。在主函数中,我画了一些矩形和椭圆。我也希望能够在另一个函数中绘制相同的场景。

本质上,如何从另一个函数向场景添加形状? (按下用户界面上的按钮时调用(


到目前为止,我已经尝试将QGraphicsView传递给另一个函数?下面是主要的 ui 函数(不相关的语句被删掉(:

{
    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是我的UI表单中QGraphicsView的名称。 RASP是项目的名称。 ParticleLocation[i*6+3] 是 x 坐标,[i*6+4] 是 y 坐标。

我把QGraphicsView传递给varibale而不是QGraphicsScene Simulation是对的吗?

我通过正确了吗?

在绘图模拟函数中,我是否正确添加了椭圆?

编辑:本质上,如何从另一个函数向场景添加形状?(按下用户界面上的按钮时调用(

按下按钮时,将调用此函数:

    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
}

现在调用了我想在RASP::RASP()中的原始场景(MyClass::MyClass(上绘制的函数DrawingSimulation()


我之前的尝试是拥有一个布尔函数,该函数由按钮然后添加椭圆设置为真:

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);
            }
        }
}
}

然后在按钮单击函数中将模拟运行 = 设置为 true。

让我们保持简单。

如果您有:

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到 GUI 的QPushButton clicked() signal(例如(,则在单击按钮并添加椭圆时将调用它。

喜欢这个:

MyClass::MyClass()
{
    ...
    connect( ui->pushButton, SIGNAL(clicked()), this, SLOT(DrawingSimulation()) );
}

相关内容

  • 没有找到相关文章

最新更新