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
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.