const QString & text, wie geht das?

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Cascoin
Beiträge: 20
Registriert: 28. September 2010 17:32

const QString & text, wie geht das?

Beitrag von Cascoin »

Hallo ich hätte mal wieder eine Frage:

ich möchte mir eine QAction erstellen:

Code: Alles auswählen

QAction ( const QIcon & icon, const QString & text, QObject * parent )	      // laut Hilfe
openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this);	// ist ein Bsp aus der Hilfe
Mein Problem ist allerdings das ich an die Stelle "const QString & text" ein QString einfügen möchte. Zur not auch ein const QString......

Also so:

Code: Alles auswählen

const QString Text = "Das soll in die open Action";

openAct = new QAction(QIcon(":/images/open.png"), &Text.data() , this);    // so funktionierts nicht....
Oben steht ja das dan die Stelle ein "const QString &" text kommt.....
Mit "Text.date()" bekomme ich ja ein "const Qchar*" zurück Den möchte ich zu einem "const QString & text" casten ....Die Frage ist ich das soweit richtig sehe, ob es vlt auch einfacher geht und wenn das so gut ist wie ich es bisher vorhabe?

Danke soweit

mfg Cascoin

Danke schonmal....
mfg cascoin
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: const QString & text, wie geht das?

Beitrag von franzf »

const QString& text ist eine Referenz auf einen nicht-änderbaren QString. Im Gegensatz zu Referenzen auf änderbaren QString (QString &) darf hier auch ein temporäres Objekt übergeben werden.
Wie man dann ein Objekt (auch temporär) an eine Funktion übergibt, so dass die dann eine Referenz bekommt, sollte doch in jedem C++-Buch stehen... (-> call by value vs call by reference)

Prinzipiell sind aber auch so viele Beispiel in der Doku, dass man da nicht viel sagen muss.
So gehts problemlos:

Code: Alles auswählen

openAct = new QAction(QIcon(":/images/open.png"), "Das soll in die open Action" , this);
Du übergibst ein Literal (das zwischen den Gänsefüßchen), der Compiler bastelt daraus die Initialisierung eines QString-Objekt, welches nur temporär ist.
Cascoin
Beiträge: 20
Registriert: 28. September 2010 17:32

Re: const QString & text, wie geht das?

Beitrag von Cascoin »

Hallo,
hab jetzt grad im Buch nachgeschlagen und da stand folgendes Bsp:

Code: Alles auswählen

void tausche (int& c, int &d);

int main()
{
int a=5;
int d=3;
tausche(a,b);
}
so Ist ja auch mein Bsp im Grunde.....
Mein Referenzparameter ist ja
const QString & text den ich aus der Methode "QAction( const QIcon & icon, const QString & text, QObject * parent )" kenne....
Wenn ich mir ein QString definiert habe, also QString Text= "Hier soll der Text rein" dann müßte dass ja so funktinieren:
openAct = new QAction(QIcon(":/images/open.png"), Text , this);
Also ich seh da schon eine Parallele von dem Bsp oben zu meinem Problem.....
Es funktioniert aber nicht......
So wie ich es verstanden habe brauch ich bei meiner Referrenz Text (die ein QString ist) keine Rückgabemethode....
Also ich muss das nicht so machen Text.data().......

Wo liegt hier mein Fehler? Vielen Dank soweit.....
mfg Cascoin
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: const QString & text, wie geht das?

Beitrag von franzf »

Code: Alles auswählen

QString Text= "Hier soll der Text rein";
openAct = new QAction(QIcon(":/images/open.png"), Text , this);
Genau so sollte es auch funktionieren.
Es funktioniert aber nicht..
Ist keine Fehlermeldung! Was funktioniert nicht? Kompiliert es nicht? Wie ist die genaue Fehlermeldung? Gibt es Laufzeitfehler? Meldung? Passiert einfach nichts?
Bitte genaue Beschreibung + Code, sonst kann man nicht helfen.
Cascoin
Beiträge: 20
Registriert: 28. September 2010 17:32

Re: const QString & text, wie geht das?

Beitrag von Cascoin »

Verdammt.....
Sorry, hab die Fehlermeldung vergessen.....
Also es kommt da:

Code: Alles auswählen

In member function 'void Ueebrsicht::create_Action()
no match for call '(QString)()'
Verwundert mich das der Compiler hiner das (QString) diese () macht.... So als ob es eine Methode wäre......
Ich habs aber so gemacht wie du mich zitiert hast......

Tortzdem nochmal hier der Code:

Code: Alles auswählen

void Uebersicht::create_Action()
{
QString TEST = "Text sollte hier stehen";
Modul_1_Act = new QAction(QIcon(":/images/open.png"),TEST , this);
}
Diese create_Action Methode wird dann im Konstruktor der QMainWindow aufgerufen......

mfg cascoin
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: const QString & text, wie geht das?

Beitrag von franzf »

Es fehlt immer noch der Code (außer du hast NUR diese beiden Zeilen in der Methode stehen).
Wäre schön wenn du die KOMPLETTE create_Action posten könntest.

(Der Stilfetischist in mir kommt auch nur kurz raus:
Es gibt 2 Benennungsschematas, um mehrere Worte übersichtlich in einen Bezeichner zu bekommen: Alles klein geschrieben und die einzelnen Worte mit "_" trennen. oder "CamelCase", also Buchstaben klein, Worte zusammen, nur der erste Buchstabe eines jeden Wortes ist groß:
* create_action() (wie im Std-C++)
* createAction() (Java, Qt)
Dein "create_Action()" ist eher ungewöhnlich - soll aber nicht heißen dass es verboten ist :P)
Cascoin
Beiträge: 20
Registriert: 28. September 2010 17:32

Re: const QString & text, wie geht das?

Beitrag von Cascoin »

Hallo,
hahahah.....Stilfetisch..... Verzeih mir wenn ich jetzt nochmal den original Code poste, der vom Stil falsch ist..... Werd aber probieren das mir anzugewöhnen... Wird wohl seinen Sinn haben...
Ich hab den kompletten Code nicht gepostet weil ich dachte das verwirrt nur..... Aber ist mir auch egal: Hier ist der Code:

Code: Alles auswählen

void Uebersicht::create_Action()
{
openAct = new QAction(QIcon(":/images/new.png"), tr("&Öffnen"), this);
openAct->setShortcuts(QKeySequence::Open);
openAct->setStatusTip(tr("Datei öffnen"));


beendenAct = new QAction(QIcon(":/images/open.png"), tr("&Beenden"), this);
beendenAct->setShortcuts(QKeySequence::Close);
beendenAct->setStatusTip(tr("Programm schließen"));
connect(beendenAct, SIGNAL(triggered()), this, SLOT(close()));

bearbeitenAct = new QAction(QIcon(":/images/open.png"), tr("Modul bearbeiten"), this);
bearbeitenAct->setStatusTip(tr("Neues Modul zur Abfrage hinzufügen - Vorhandenes Modul löschen"));

QString TEST = "awegraerg";
Modul_1_Act = new QAction(QIcon(":/images/open.png"),TEST , this);
}
Vorsichtshalber hier noch mein createMenu();

Code: Alles auswählen

void Uebersicht::create_Menu()
{
fileMenu = menuBar()->addMenu(tr("&Datei"));
fileMenu->addAction(openAct);
fileMenu->addAction(beendenAct);

fileMenu = menuBar()->addMenu(tr("&Bearbeiten"));
fileMenu = menuBar()->addMenu(tr("&Einstellungen"));
fileMenu->addAction(bearbeitenAct);
fileMenu = menuBar()->addMenu(tr("&Module"));
fileMenu->addAction(Modul_1_Act);
fileMenu = menuBar()->addMenu(tr("&Hilfe"));/**/
}
und der Konstruktor von meinem QMainWidget:

Code: Alles auswählen

Uebersicht::Uebersicht(QWidget *parent)
    : QMainWindow(parent)
{
this->setGeometry(50,100,500,500);

this->UECW = new Uebersicht_CentralWidget(this);
this->setCentralWidget(this->UECW);
create_Action();
create_Menu();
}
Übrigens noch vielen Dank für die bisherige Hilfe....
mfg Cascoin
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: const QString & text, wie geht das?

Beitrag von franzf »

TEST ist aber nicht zufällig ein Macro?
Benenn die Variable mal in eindeutiger Weise um.

(Weitere Konvention: Alles GROß nur für Macros oder Konstanten)
Cascoin
Beiträge: 20
Registriert: 28. September 2010 17:32

Re: const QString & text, wie geht das?

Beitrag von Cascoin »

Also das gibts ja nicht.... Habs umbenannt und jetzt funktioniert es.....
Kann ich mir überhaupt nicht erklären....
TEST ist weder ein Makro noch habe ich sonst irgendwo ein Member so benannt...... Nicht in dieser Klasse..... Ich hab extra den kompletten Code mit der Such-Funktion durchsucht.... Da ist nichts..... Manchmal spinnt des schon ein wenig.....
Naja, wie auch immer.... Ich danke dir....
mfg Cascoin
Antworten