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_OBJECTpublic:
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_OBJECTpublic:
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_OBJECTpublic:
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