Seite 1 von 1

[gelöst] Probleme mit dem Gültigkeitsbereich

Verfasst: 4. Januar 2010 23:16
von TeaAge
Huhu zusammen,

ich versuche mir gerade etwas das Programmieren (C++/Qt4) beizubringen und schreibe gerade mein erstes (sinnvolle) Programm.

Jetzt möchte ich, dass wenn ich auf ein Knopf drücke sich ein Dialog-Fenster öffnet und in einem Textfeld mir eine QList wiedergibt.

Ich hatte also bisher (bevor ich den Dialog einbauen wollte) nur die Klasse qt4urpm mit der ich gearbeitet habe. Für die QDialog hab ich eine weitere Klassen 'Dialog' erzeugt. Im Konstruktur dieser Klasse definiere ich den Dialog (mit seinem GUI-Elementen) und will nun die Funktion getOrphan() der Klasse qt4urpm aufrufen (um ein Variable abfragen zu lassen).

Also brauch ich den Namen des Objektes der Klasse qt4urpm. In der main.cpp steht bei mir nun

Code: Alles auswählen

qt4urpm w;
(das hat der QtCreator für mich gemacht).

Also dachte ich, dass ich mit

Code: Alles auswählen

w.getOrphan()
die Funktion aus der Klasse Dialog aufrufen kann. Dann wird mir aber gesagt, dass 'w' in diesem Gültigkeitsbereich nicht definiert ist.

Danach dachte ich, ich könnte vielleicht mit dem this-Zeiger arbeiten. Weiß aber auch nicht recht wie. Wenn ich mit der Maus auf 'this' gehe, zeigt er mir übrigens

Code: Alles auswählen

qt4urpm *qt4urpm
das hilft mir aber auch noch nicht so wirklich weiter. Ihr seht schon, ich hab da noch ein "paar" Defizite.

Könnt ich mir vielleicht nochmal ein paar Tipps geben oder braucht ihr vielleicht selber noch ein paar mehr Code-Schnippsel?

Gruß,
TeaAge

Verfasst: 5. Januar 2010 17:49
von upsala
Zeig mal die komplette main.cpp

Verfasst: 5. Januar 2010 18:00
von TeaAge
Moin moin,

sollst du haben:

Code: Alles auswählen

#include <QtGui/QApplication>
#include <QAction>
#include <QDesktopServices>
#include "qt4urpm.h"
#include "dialog.h"
#include <string.h>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	QString locale = QLocale::system().name();
	QTranslator translator;
	QString translatorfile = LOCALEPATH;
	translatorfile += locale;
	translator.load(translatorfile);
	a.installTranslator(&translator);
	// Check whether user == root
	if (getuid() != 0 )
	{
		qt4urpm::termlog("Trying to start as root.");
		std::string cmd("/usr/lib/kde4/libexec/kdesu ");
		cmd += argv[0];
		if (system(cmd.c_str()) != 0) {
			cmd = "gksu ";
			cmd += argv[0];
			if (system(cmd.c_str()) != 0) {
				QString msg
					(QMainWindow::tr("You need to be root!\n\nTo ease the use of "
					 "qt4urpm we suggest to install gksu (run \"gurpmi gksu\")"));
				QMessageBox msgBox
					(QMessageBox::Critical, QMainWindow::tr("Not root!"), msg);
				msgBox.exec();
			}
		}
		return 0;
	}

	// we use the application in the popup message, so we initialize it here
	qt4urpm w;

	// Show pre start warning
	QString buf
		(QMainWindow::tr("This tool works system wide. Only use it if you know "
		                 "what you are doing! It is possible, that you damage "
		                 "or even destroy your system! Go on anyways?"));
	QMessageBox qdia
		(QMessageBox::Warning, QMainWindow::tr("Warning!"), buf);
	QPushButton * yes = qdia.addButton(QMessageBox::Yes);
	yes->setText(QMainWindow::tr("Yes"));
	QPushButton * no = qdia.addButton(QMessageBox::No);
	no->setText(QMainWindow::tr("No"));
	QMainWindow::connect(no, SIGNAL(clicked()), &w, SLOT(cancelAct()));
	qdia.setDefaultButton(no);
	qdia.exec();
	
	// Do nothing, if user canceled
	// NOTE for some reasons the return value of qdia.exec() is always the same
	// NOTE that's why I added the workaround with actioncanceled
	if (w.isactioncanceled()) {
		return 0;
	}

	// Start up the main application
	w.show();
	return a.exec();
}
Gruß,
TeaAge

Re: Probleme mit dem Gültigkeitsbereich

Verfasst: 6. Januar 2010 21:52
von franzf
TeaAge hat geschrieben:Klasse qt4urpm mit der ich gearbeitet habe. Für die QDialog hab ich eine weitere Klassen 'Dialog' erzeugt. Im Konstruktur dieser Klasse definiere ich den Dialog (mit seinem GUI-Elementen) und will nun die Funktion getOrphan() der Klasse qt4urpm aufrufen (um ein Variable abfragen zu lassen).

Also brauch ich den Namen des Objektes der Klasse qt4urpm. In der main.cpp steht bei mir nun

Code: Alles auswählen

qt4urpm w;
(das hat der QtCreator für mich gemacht).

Also dachte ich, dass ich mit

Code: Alles auswählen

w.getOrphan()
die Funktion aus der Klasse Dialog aufrufen kann. Dann wird mir aber gesagt, dass 'w' in diesem Gültigkeitsbereich nicht definiert ist.
Äh, du erstellst in der main ein Objekt und erwartest dass es wie durch Zauberei in der Klasse Dialog genau mit jenem Namen verfügbar ist?
Das geht nicht, die Fehlermeldung sagt es schon und du hast es wohl auch erkannt.
Entweder qt4urpm-Objekt in Dialog anlegen, oder per Konstruktor/setter in der Dialog-Klasse übergeben.
Das sind zwei vollkommen verschieden Sichtbarkeitsbereiche!

Code: Alles auswählen

int main()
{
    int a = 10;
    {
        int b = a + 10;
    }
    cout << b << endl;
}
Obwohl wir hier in der main sind, geht das nicht, denn b liegt in einem anonymen Block, nach Verlassen ist b über dem Jordan, von außen auch nicht sichtbar!

Verfasst: 9. Januar 2010 16:17
von TeaAge
Huhu,

erstmal danke. Eigentlich ist es ganz logisch, nur manchmal vergesse ich, dass eine Klasse auch nur ein fortgeschrittener Datentyp ist ... Wald vor lauter Bäumen und so ...

Wie auch immer, ich hab das ganze jetzt sogar noch etwas einfacher gelöst. Ich hab jetzt einfach beim Aufruf des Dialogs die Variable übergeben ...

Gruß,
TeaAge