Guten Tag,
ich bin gerade dabei, ein Programm zu schreiben bei welchem man zuerst die Datei / den Ordner auswählt und dann sagt was damit gescheen muss (Prozedur 1, 2, 3..)
Dazu habe ich mir zwei Buttons angelegt, mit einem soll man eine Datei auswählen (QFileDialog::getOpenFileName)) und mit dem anderen ein Ordner (zZ noch mit QFileDialog::getOpenFileNames, soll aber später noch modifiziert werden)
Nun habe ich einen neuen Button angelegt für Prozedur 1 und will damit das Programm starten...
Soweit so einfach aber nun muss ich zu Beginn der Prozedur ja Abfragen ob ein Ordner oder eine Datei eingelesen wurde vorher, also muss ich irgendwo eine globale Variable z.B. "Flag" anlegen in der gespeichert ist ob eine Datei oder ein Ordner ausgewählt wurde. Außerdem müsste der QSring in den ich den Dateinamen einspeichere ebenfalls global angelegt werden...
Wie geht das?
Oder gibt es dafür andere Lösungsmöglichkeiten??
DANKE
Übrings: QTCreator mit MinGW
[Anfängerfrage]Globale Variablen erstellen/altern. Lösung??
-
pizza4ever
- Beiträge: 21
- Registriert: 4. November 2010 23:17
Wo brauchst du da ne globale Variable? Es reicht doch eine Member-Variable. Sollten deine "Prozeduren" freie Funktionen sein, kannst du doch entsprechende Infos als Parameter mitgeben.
Merke: Globale Variablen sind prinzipiell immer böse, Ausnahmen bestätigen die Regel
http://bytes.com/topic/c/insights/73745 ... -variables
Merke: Globale Variablen sind prinzipiell immer böse, Ausnahmen bestätigen die Regel
http://bytes.com/topic/c/insights/73745 ... -variables
-
pizza4ever
- Beiträge: 21
- Registriert: 4. November 2010 23:17
puuuuuh ich muss zugeben dass ich grad aufem Schlauch stehe wie Du es lösen willst... Von wo soll die Variable denn Member sein? Ich kenn des nur in Zusammenhang mit einer Klasse die ich schreibe, ich schreib aber grad ja ne Funktion - und selbst dann wäre mir unklar in welcher Funktion ich die Variable denn deiner Meinung nach deklarieren soll.
Also ich habe zurzeit in meiner mainwindow.h folgende public slots definiert:
(für die entsprechenden Buttons)
Beim Start von Prozedur 1 (void MainWindow::Prozedur_1())
würde ich halt nun gerne
if(flat==1) //vorher wurd eine Datei ausgewählt
{
Load_Data(Dateiname)
}
ausführen...
Kannst Du mir bitte einen Lösungsweg aufzeichnen oder mir sagen wo ichs nachlesen kann?
DANKE
edit: Bin mir grad unsicher obs nicht vll sogar eher ne C++ Frage ist ...
Also ich habe zurzeit in meiner mainwindow.h folgende public slots definiert:
Code: Alles auswählen
// void ButtonClicked();
// void Button2Clicked();
void Ordner_nehmen();
void Datei_nehmen();
void Prozedur_1();
void Prozedur_2();
void Prozedur_3();
Beim Start von Prozedur 1 (void MainWindow::Prozedur_1())
würde ich halt nun gerne
if(flat==1) //vorher wurd eine Datei ausgewählt
{
Load_Data(Dateiname)
}
ausführen...
Kannst Du mir bitte einen Lösungsweg aufzeichnen oder mir sagen wo ichs nachlesen kann?
DANKE
edit: Bin mir grad unsicher obs nicht vll sogar eher ne C++ Frage ist ...
Deine Prozeduren sind Memberfunktionen von deiner MainWindow-Klasse. Ordner_nehmen/Datei_nehmen ebenfalls. Da liegt es doch auf der Hand, dass istDatei/Datei_Name/Ordner_Name/... ebenfalls Member von MainWindow werden sollten. Oder?pizza4ever hat geschrieben: Von wo soll die Variable denn Member sein? Ich kenn des nur in Zusammenhang mit einer Klasse die ich schreibe, ich schreib aber grad ja ne Funktion - und selbst dann wäre mir unklar in welcher Funktion ich die Variable denn deiner Meinung nach deklarieren soll.
Deshalb hat der Christian den Thread schon ins passende Unterforum geschobenedit: Bin mir grad unsicher obs nicht vll sogar eher ne C++ Frage ist ...
-
pizza4ever
- Beiträge: 21
- Registriert: 4. November 2010 23:17
Guuuuuuuut, danke ...
Also erstmal - es läuft jetzt, danke!
Ich habs dann in der mainwindow.h deklarierert und so klappts...
allerdings hab ich noch zwei Fragen:
a.) Wo nehme ich dann eine anfängliche initialisierung vor?
z.B.
public:
int flag = 0; // geht halt nicht
in der MainWindow::~MainWindow() ??
b.)
Spricht irgendwas dagegen in der MainWindow.h in einem "Public: " Abschnitt mehrere Dateitypen zu deklarieren?
also z.B.
public:
int flag;
QString Datei;
oder sollte man es - wieso auch immer - eher so machen:
public:
int flag;
public:
QString Datei;
So, ich denke das wars;)
DANKE
Also erstmal - es läuft jetzt, danke!
Ich habs dann in der mainwindow.h deklarierert und so klappts...
allerdings hab ich noch zwei Fragen:
a.) Wo nehme ich dann eine anfängliche initialisierung vor?
z.B.
public:
int flag = 0; // geht halt nicht
in der MainWindow::~MainWindow() ??
b.)
Spricht irgendwas dagegen in der MainWindow.h in einem "Public: " Abschnitt mehrere Dateitypen zu deklarieren?
also z.B.
public:
int flag;
QString Datei;
oder sollte man es - wieso auch immer - eher so machen:
public:
int flag;
public:
QString Datei;
So, ich denke das wars;)
DANKE
a) Initialisierung im Konstruktor, am besten verwendest du eine Initialisierungsliste (dein Buch/Google wissen dazu einiges)
b) Du kommst von java? public eröffnet für alle folgenden Deklarationen die Sichtbarkeit "public". Diese gilt bis zur nächsten Eröffnung einer Sichtbarkeit. Also kannst du so viele public-Elemente unter einem "public:" deklarieren wie du willst.
Aber warum eigentlich public? Das ist doch ein klarer Fall für private. Flag/Datei/... sind Implementations-Details, die niemanden außer MainWindow etwas angehen - dafür hat man private erfunden
Und selbst wenn es einzelne Interessierte gebe sollte, ist das noch kein Grund für public. Halte die Daten private und biete einen getter an, der einen nur-lesenden Zugriff auf die Variable ermöglichst. Einen setter lässt du bleiben, die Datei wird vom User über Datei_nehmen gesetzt.
b) Du kommst von java? public eröffnet für alle folgenden Deklarationen die Sichtbarkeit "public". Diese gilt bis zur nächsten Eröffnung einer Sichtbarkeit. Also kannst du so viele public-Elemente unter einem "public:" deklarieren wie du willst.
Aber warum eigentlich public? Das ist doch ein klarer Fall für private. Flag/Datei/... sind Implementations-Details, die niemanden außer MainWindow etwas angehen - dafür hat man private erfunden