PROBLEM: Wykorzystanie zmiennej(QStringa) z jednej klasy w drugiej



  • Tak jak w temacie zmienna o która mi chodzi wygrubie w kodzie
    glowne.h:
    @public:
    explicit Glowne(QWidget *parent = 0);
    ~Glowne();
    QString dir;
    @
    Tworze QString dir jako publica
    glowne.cpp
    @
    void Glowne::on_pushButton_2_clicked()
    {
    dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
    "/home",
    QFileDialog::ShowDirsOnly
    | QFileDialog::DontResolveSymlinks);
    this->close();
    mainwindow2=new MainWindow2(this);
    mainwindow2->show();
    qDebug()<<"directory"<<dir<<endl;
    }@
    Jak naciskam przycisk wybieram lokalizacje i zapisuje do QString dir ta lokalizacje
    I teraz pojawia się problem otwieram nowe okno (klase) i w tym oknie chce wykorzystać zapisaną wcześniej lokalizacje QString dir ...
    Korzystam z przycisku by wyświetlić QString dir w nowej klasie czyt. oknie
    MainWindow2.cpp
    @void MainWindow2::on_pushButton_4_clicked()
    {
    Glowne g;
    qDebug()<<"directory"<<g.dir<<endl;
    }@
    I puste pole mi wyświetla ...
    Każda pomoc mile widziana POMOCY



  • Jeżeli chcesz użyć pola z tej klasy to musisz mieć referencje, bądź wskaźnik do tej instancji klasy 'Glowne". Inną opcją jest Singleton.
    Lub też przekazanie między klasami wartości tego pola :)

    Jak możesz to pokaż w jaki sposób wywołujesz to drugie okno bo domniemam, że tworzysz je w pierwszym?



  • Glowne to okno w którym wybieram czy chce otworzyc MainWindow1 czy MainWindow2 przy otwieraniu okna wybieram katalog który zapisuje sie do QStringa
    Glowne.h
    @
    includy~~~

    namespace Ui {
    class Glowne;
    }

    class Glowne : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit Glowne(QWidget *parent = 0);
    ~Glowne();
    QString dir;

    private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();
    

    private:
    Ui::Glowne *ui;
    MainWindow2 *mainwindow2;
    MainWindow *mainwindow;
    };

    #endif // GLOWNE_H
    @
    Glowne.cpp
    @

    Glowne::Glowne(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Glowne)
    {
    ui->setupUi(this);
    }

    Glowne::~Glowne()
    {
    delete ui;
    }

    void Glowne::on_pushButton_clicked()
    {
    dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
    "/home",
    QFileDialog::ShowDirsOnly
    | QFileDialog::DontResolveSymlinks);
    qDebug()<<"directory"<<dir<<endl;
    this->close();
    mainwindow=new MainWindow(this);
    mainwindow->show();
    }
    // tablica asocjacyjna(dictionary) ewentualnie wektory
    void Glowne::on_pushButton_2_clicked()
    {
    dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
    "/home",
    QFileDialog::ShowDirsOnly
    | QFileDialog::DontResolveSymlinks);
    this->close();
    mainwindow2=new MainWindow2(this);
    mainwindow2->show();
    qDebug()<<"directory"<<dir<<endl;
    }
    @

    Jestem laikem więc prośba czy mogłbyś mi napisać mniejwiecej gotowy albo przynajmniej przykład(na którym mogłbym sie wzorowac) przekazywania miedzy klasami tych informacji ?



  • najprostszym sposobem będzie utworzenie w każdej z klas MainWindow pola prywatnego QString (przetrzymującego wartość 'dir') i ustawienie go w momencie tworzenia np:
    @
    mainWindow = new MainWindow(this);
    mainWindow->set_dir(dir);
    mainWindow->show();@
    gdzie:
    @ void set_dir(const QString &dir) { _dir = dir; }@

    Innym z sposobem możesz na przykład przekazać tą wartość w konstruktorze:
    @
    MainWindow::MainWindow(const QString &dir, QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    _dir = dir;
    }
    @
    wtedy inicjalizacja wyglądała by tak:
    @
    mainwindow=new MainWindow(dir, this);
    mainwindow->show();
    @

    Innym z sposobów jest przekazanie wskaźnika do klasy 'Glowne' lub referencji.

    Poczytaj troszkę o programowaniu obiektowym w C++. Myślę, że troszkę pomogłem, w razie problemów pytaj :)
    Pozdrawiam.



  • Tworze w kazdej klasie pole prywatne qstring dir;
    I robie tak dokladnie jak napisales tworze funkcje void set_dir w headerze glowne.h oraz w cpp
    I wyskakuja mi bledy ze _dir was not declared in this scope oraz
    Class mainwindow2 has no member named "set_dir" w linijcie
    mainwindow2->set_dir(dir);
    Wybacz ze tak pisze ale internet mi padl w akademiku i pisze z komorki ...
    Drugim sposobem tez probowalem ale jesCze wiecej bledow sie pokazuje, jak mozesz to pomoz :////



  • Wyskakuje Ci, że zmienna '_dir' nie występuje bo sam napisałeś, że stworzyłeś pole prywatne "dir' :)
    Proszę, musi działać :) (oczywiście ten fragment)
    glowne.h
    @

    #include "mainwindow.h"
    #include <QMainWindow>

    namespace Ui {
    class Glowne;
    }

    class Glowne : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit Glowne(QWidget *parent = 0);
    ~Glowne();

    private slots:
    void on_pushButton_clicked();

    private:
    Ui::Glowne *ui;
    MainWindow *window;
    };
    @

    glowne.cpp

    @
    #include "glowne.h"
    #include "ui_glowne.h"

    #include <QFileDialog>

    Glowne::Glowne(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Glowne)
    {
    ui->setupUi(this);
    window = NULL;
    }

    Glowne::~Glowne()
    {
    delete ui;
    }

    void Glowne::on_pushButton_clicked()
    {
    QString dir = QFileDialog::getExistingDirectory(this,
    tr("Open Directory"),
    "/home",
    QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
    if (dir.isEmpty()) {
    return;
    }
    this->close();
    window = new MainWindow(this);
    window->set_dir(dir);
    window->show();
    }
    @

    mainwindow.h

    @
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit MainWindow(QMainWindow *parent = 0);
    ~MainWindow();
    void set_dir(const QString &dir);
    private:
    Ui::MainWindow *ui;
    QString _dir;
    };

    #endif // MAINWINDOW_H
    @

    mainwindow.cpp
    @
    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QMainWindow *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }

    void MainWindow::set_dir(const QString &dir)
    {
    _dir = dir;
    }
    @
    Kompiluje się i działa tak jak chciałeś.
    Ahh te studia :P



  • DZIAŁA teraz jeszcze pytanie mam przycisk w klasie window Twojej i chce by przyciskajac go wyswietlil mi w application output ten wlasnie qstring dir ??



  • Pod sygnał clicked() przycisku podepnij slot i w nim użyj klasy qDebug()



  • @void MainWindow2::on_pushButton_4_clicked()
    {
    qDebug()<<"directory"<<dir<<endl;
    }@
    "dir" was not declared in this scope
    chce wykorzystać tego QString dir w różnych przyciskach w tym oknie MainWindow2



  • Czytamy co za błąd nam sie pojawia:

    bq.
    “dir” was not declared in this scope

    i na pierwszy rzut oka widać, że zadeklarowane pole to _dir a nie dir



  • Dzieki Wielkie !!!



  • Jeśli udało się to oznacz temat jako zakończony dla przyszłych pokoleń.


Log in to reply