Qt wywołanie funkcji z innej klasy

0

Witam

Mam taki problem mam klasę MainWindow : public QMainWindow i zawiera ona QGraphicsView oraz funkcje które obsługują ten element. Potrzebuję teraz z klasy Pomiar : public QGraphicsScene odwołać się do funkcji która jest w klasie MainWindow i nie wiem za bardzo jak to zrobić możecie mi podpowiedzieć? Jest może jakiś sposób żeby powiązać klasę Pomiar żeby miała możliwość wywołania funkcji w MainWindow ? I mam jeszcze jedno pytanie w jaki inny sposób można odwoływać się do QGrapichsView niż to zrobiłem w funkcji Pow_clicked() i czy można jakoś odwołać się z innej klasy do tego obiektu? Dopiero zaczynam przygodę z Qt i tego typu programami więc proszę o wyrozumiałość:).

Mój kod:

// pomiar.cpp


#include "mainwindow.h"




Pomiar::Pomiar(QObject *parent) : QGraphicsScene(parent)
{}
  Pomiar::~Pomiar()
{}

void Pomiar::mousePressEvent(QGraphicsSceneMouseEvent *e)
{

    if(e->button()==Qt::LeftButton)
    {

     QPointF p=e->buttonDownScenePos(Qt::LeftButton);





///Tutaj chciałbym wywołać funkcje Wycz() z MainWindow.cpp



    }

    QGraphicsScene::mousePressEvent(e);

}


// mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("Obraz") ;
/*
*/
}
MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::WczytajZdjecie_clicked()
{
  QString fileName = QFileDialog::getOpenFileName(this,"","","*.jpg *.png");
   Pomiar *scene = new Pomiar();

   setWindowTitle("Obraz - " + fileName);

   pix.load(fileName);
   wyp =  scene->addPixmap(pix);


    this->ui->graphicsView->setScene(scene);
    this->ui->graphicsView->show();
}



void MainWindow::Zakoncz_clicked()
{
    QApplication::closeAllWindows();
}
void MainWindow::Zmniejsz_clicked()
{

   this->ui->graphicsView->scale(0.8,0.8);

}
void MainWindow::Pow_clicked()
{

   this->ui->graphicsView->scale(1.2,1.2);


}
// Tą funkcję chciałbym wywołać po kliknięciu
void MainWindow::Wycz()
{

   /*

*/
}



}






#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QtCore>
#include<QtGui>


#include "pomiar.h"


namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
Q_OBJECT


public:
 
    Pomiar *scene;
    QGraphicsPixmapItem *wyp;
  

MainWindow(QWidget *parent = 0);
~MainWindow();
protected:



private slots:

 /*
*/
    void Wycz();

private:
    Ui::MainWindow *ui;


};
#endif // MAINWINDOW_H




0

Po cholerę dotykasz QGraphicsScene? Ta klasa jest pojemnikiem na QGraphicsItems, QGraphicsWidgets i w zasadzie dopóki nie robisz nic zaawansowanego, to nie powinieneś dotykać tej klasy.

Zresztą po co ci QGraphicsScene? Zaczynanie Qt od QGraphicsScene, to nie najlepszy pomysł.
Skoro piszesz jakieś oprogramowanie pomiarowe to spokojnie wystarczą ci QWidget'y. Polecam Qwt jako drogę na skróty, bo ma wiele gotowych kontrolek typowych dla zastosowań pomiarowych.
Zresztą QGraphicsScene to tak naprawdę to jest poligon testowy dla QML (bardzo fajne) i najlepiej używać tego tylko w tym kontekście.

W Qt najlepiej jak każda klasa wie o innych klasach jak najmniej, a cała komunikacji powinna odbywać się sygnał->slot.
Napisz dokładnie co chcesz zrobić/osiągnąć, zamiast pytać jak naprawić twój pomysł na rozwiązanie tajemniczego problemu.

0

Potrzebuje otworzyć zdjęcie,zmierzyć odległość 2 punktów w pixelach i postawić X-y gdzie zostały one zaznaczone. Potem zapisać to do pliku.
To jak wysłać sygnał do tej funkcji gdy pobrany jest już punkt który się klikneło?

0

Stwórz sobie jakiegoś boola, a gdy już pobierzesz ten punkt, to zmień go na true. A w tej klasie co masz tę funkcje, sprawdzaj czy bool = true;

0

Dzięki a możesz mi jeszcze podpowiedzieć jak sprawdzać co chwile?:) warunek w tej funkcji ? Ale nie wiem czy to nie zamuli programu.

0
QTimer *zegar;
zegar= new QTimer(this);
zegar->setInterval(1000); //sprawdza co 1sek
connect(zegar, SIGNAL(timeout()), this, SLOT(coTamChesz()));
 
0

Nie zapomnij o:

 
zegar->start();
0

@Fetson czytałeś o Sygnałach i Slotach?

0

Zegar jakoś zawiesza mi program albo dziwne rzeczy się robią jeszcze po kombinuje. No idee sygnałów i slotów rozumiem pytanie jak teraz to zrobić. Mam tak że klasa Pomiar zapisuje gdzieś tam namiary na punkt w jeszcze innej klasie która ma służyć do przechowywania informacji i mam zrobiony przycisk i jak kliknę i wywołam funkcje to robi się to co chce. I teraz właśnie pytanie jak wysłać albo sygnał do tamtej funkcji albo jak ją po prostu wywołać w jakiś inny sposób.

I mam pytanie do tej klasy dlaczego tą klasę mogę sobie odd tak wywowałać w każdym momencie programu ? Pisze normalnie Zmienne().p1 i jest:)

#ifndef BOX_H
#define BOX_H

#include <qstring.h>
#include <QGraphicsScene>
class box {

  public:
    QPointF p1;
    QPointF p2;
    int ope;
   

  private:
    box();
    box(const box&);

    friend box& Zmienne();
};

box& Zmienne();
#endif // BOX_H






#include "box.h"

box::box() {

};

box& Zmienne() {

    static box zmienne;
    return zmienne;

};

1 użytkowników online, w tym zalogowanych: 0, gości: 1