signals aus static methode

Alles rund um die Programmierung mit Qt
Antworten
Angyrtis
Beiträge: 5
Registriert: 5. Dezember 2007 17:28

signals aus static methode

Beitrag von Angyrtis »

heyho,

ich habe eine Methode, die von außen einen QString empfängt und diesen dann in ein ListWidget hängt. Also eine Klasse A ruft B::setText(text); auf.

Dazu muss B::setText static sein, soweit ich weiß. Über gegenteiliges Wissen wäre ich dankbar. Nun ja, nun ist mein Problem, dass Methode B::setText(text); diesen Text per SIGNAL an Klasse C, die eine Statusbar einhält, wo der text ausgegeben werden soll, aber B nicht bekannt ist, weiterschicken soll... Also C connectet mit

connect(B, SIGNAL(sendText(QSting)), this, SLOT(setStatusBarText(QString)));

das Signal mit eigenem Slot. Da aber setText static ist, kann es auch keine Signals schmeißen. Irgendeine Idee oder einen Workaround-Vorschlag?

danke, A.
honda71
Beiträge: 49
Registriert: 12. Juli 2006 16:16

Beitrag von honda71 »

Das die SLOT-Methode static sein soll ist jetzt irgendwie verwirrend.

Leider ist Deine Beschreibung des Problems zwar ausführlich, aber nicht klar.

Könntest Du die Problembeschreibung mit einem Stück Quellcode füllen?
Oder mit den Fehlermeldungen, die Du beim Kompilieren und/oder zur Laufzeit erhälst?

Gruß

Oli
Angyrtis
Beiträge: 5
Registriert: 5. Dezember 2007 17:28

Beitrag von Angyrtis »

Moin,

also so ungefähr:

Klasse A ruft in einer nichtstatischen Methode auf (messagelog.h ist includiert):

Code: Alles auswählen

MessageLog::setText("Beispiel");
Klasse B (MessageLog):
Header:

Code: Alles auswählen

class MessageLog: public QObject {
...
public:
static void setText(QString text);

signals:
void signalSetStatusBar(QString);

private
static QListWidget * m_ListWidget;
...
}
cpp:

Code: Alles auswählen

QListWidget * m_ListWidget = 0;

void MessageLog::setText(QString text) {
m_ListWidget->addItem(text);
//so nun das Problem:
emit signalSetStatusBar(text);
}
Klasse C:
Header:

Code: Alles auswählen

class MessageLog;
class C: public QObject {

public slots:
void setStatusBarSlot(QString text);

private:
MessageLog * m_messageLog;
}
cpp (im Konstruktor):

Code: Alles auswählen

m_messageLog = MessageLog::Instance(); //da Singleton
connect(m_messageLog, SIGNAL(signalSetStatusBar(QString)), this, SLOT(setStatusBarSlot(QString)));
cpp (Slot):

Code: Alles auswählen

void C::setStatusBarSlot(QString text) {
m_widget->ui.statusBar->showMessage(text, 2000);
}
Naja, so ungefähr jetzt aus dem Kopf mal schnell zusammengefriemelt... Hab den Code grad nicht zuhause, deswegen :) Also in der C sollte alles stimmen, denk ich...

So, kein Slot soll static sein, das ist was falsch rüber gekommen... die setText-Methode ist statisch, aber kein Slot. Nur darin wird halt ein Signal emittiert... Und das ist halt nicht statisch, weswegen es ein Problem gibt... Ist nun setText nicht statisch, dann kommt eine Fehlermeldung dem Sinn nach: "kein gültiger Aufruf von nicht-statischer Methode", muss also static sein. So, da static nur static aufrufen kann, sollte das Signal auch static gesetzt werden, was aber nicht geht (Fehler: signal kennt keinen this-Pointer)... Wie kriege ich nun diesen verfluchten Text nach Klasse C, die nur die Statusbar kennt... Mir wäre auch eine Idee nicht-SignalSlot-technischer Art lieb. Allerdings ist es aus Modularitätsgründen nicht möglich, dass MessageLog die Klasse C kennt (includiert). Deswegen sind Signals in dem Fall wirklich gut... Aber wie kriege ich die aus einer statischen Methode raus? ;) Achso, wenn setText nicht statisch wäre, würde auch alles funktionieren... Nur halt der Aufruf aus A nicht ;) Also connectet isses soweit richtig (SOFERN man es bei statischen Dingen nicht anders macht, natürlich ;)) etc. - nur für den Fall dass Meldungen kommen, ich hab oben kein Q_Object drin oder sowas :) Ist halt bloß ein schnell zusammen geschriebener Code um mal einen Überblick zu geben =)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Bist du eine Frau, oder warum schreibst du so lange Texte? Singleton ist das was du suchst.
myme
Beiträge: 24
Registriert: 31. März 2008 14:25

Beitrag von myme »

Wenn MessageLog ein Singleton ist, sollte die Instance Methode den fehlenden This-Zeiger liefern:

Code: Alles auswählen

void MessageLog::setText(QString const& text)
{
  m_ListWidget->addItem(text); 
  MessageLog::Instance()->signalSetStatusBar(text); 
}
Antworten