如何从另一个函数更改 QGraphicsScene?
How do you change a QGraphicsScene from another function?
我的程序有一个名为 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 传递给变量而不是 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
}
现在我想在 RASP::RASP()
(MyClass::MyClass) 中的原始场景上绘制的函数 DrawingSimulation()
被调用。
我之前的尝试是通过按钮将布尔函数设置为 true 然后是 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 = 为真。
让我们保持简单。
如果你有:
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);
}
那么,如果这行得通,您现在就知道如何修改来自 "another function" 的场景了。
最后,你还应该有:
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()) );
}
我的程序有一个名为 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 传递给变量而不是 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
}
现在我想在 RASP::RASP()
(MyClass::MyClass) 中的原始场景上绘制的函数 DrawingSimulation()
被调用。
我之前的尝试是通过按钮将布尔函数设置为 true 然后是 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 = 为真。
让我们保持简单。
如果你有:
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);
}
那么,如果这行得通,您现在就知道如何修改来自 "another function" 的场景了。
最后,你还应该有:
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()) );
}