Zarządzanie UI w MainWindow z poziomu klasy zewnętrznej
-
Witam,
chcę przerobić swój kod.
Poprzedni działał tak, że wszystkie metody zmieniające były w Main Window.
Teraz chcę aby różne klasy były odpowiedzialne za zarządzanie osobnym elementem UI. Koniec końców, chciałbym aby 1 z klas po nacisnieciu przycisku aktualizowała wyswietlony obrazek dopóki przestanie iterować w jednej z metod wewnętrznych.
Gdy wszystko było napisane w main window korzystałem z :
QImage symulacja = QImage(sizeX,sizeY,QImage::Format_RGB32); QGraphicsPixmapItem * ptrToImage; graphic = new QGraphicsScene(this); <pętla> symulacja.setPixel(m,o,qRgb(0,0,0)); <> ptrToImage = graphic->addPixmap(QPixmap::fromImage(symulacja)); ui->graphic->setScene(graphic);
teraz rodzi mi to sporo problemów gdy rozbiłem to na kilka klas - kontrolerów.
Teraz to wygląda tak:
w main window mam metodę:
void MainWindow::activeSimulation(){this->simulation = QImage(0,0,QImage::Format_RGB32); this->graphic = new QGraphicsScene(this); this->ptrToImage = this->graphic->addPixmap(QPixmap::fromImage(this->simulation)); ui->graphicsView->setScene(graphic); simulationGrid.simulationptr = this->simulationptr; simulationGrid.ptrToImage = this->ptrToImage; simulationGrid.graphic = this->graphic;
}
w klasie mam:
void SimulationGrid::CreateGrid(){
simulation = QImage(this->xSize,this->ySize,QImage::Format_RGB32); this->vector2D_Of_Tiles.resize(this->xSize,std::vector<StructureTile>(this->ySize,StructureTile())); for (uint i = 0; i<vector2D_Of_Tiles.size();i++ ){ for (uint j = 0; j<vector2D_Of_Tiles[i].size(); j++){ vector2D_Of_Tiles[i][j].setPosition(i,j); simulation.setPixel(i,j,qRgb(0,0,0)); } } *simulationptr=simulation; ptrToImage->setPixmap(QPixmap::fromImage(*simulationptr)); qDebug() << "Grid Created";
Chciałbym żeby wszystko odbywało się po stronie klasy (oczywiście może dostać jakiś wskaźnik czy coś). Pytanie teraz jak to ugryźć i jak przenieść zarządzanie graphicsView od MainWindow do własnej klasy.
-
Możesz stworzyć własny QWidget, dajmy na to SimulationWidget, który będzie miał w sobie QGraphicsView. Następnie ten widget dodać do swojego głównego UI. Wtedy masz w swojej klasie pełną kontrolę nad QGraphicsView, a twój main window pozostaje "czysty".
Jeśli symulacja musi też przekazywać jakieś info do innych klas podpiętych do MainWindow, możesz dodać sygnał i podpiąć do slotów w tych innych klasach.