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.
signals aus static methode
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
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
Moin,
also so ungefähr:
Klasse A ruft in einer nichtstatischen Methode auf (messagelog.h ist includiert):
Klasse B (MessageLog):
Header:
cpp:
Klasse C:
Header:
cpp (im Konstruktor):
cpp (Slot):
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 =)
also so ungefähr:
Klasse A ruft in einer nichtstatischen Methode auf (messagelog.h ist includiert):
Code: Alles auswählen
MessageLog::setText("Beispiel");Header:
Code: Alles auswählen
class MessageLog: public QObject {
...
public:
static void setText(QString text);
signals:
void signalSetStatusBar(QString);
private
static QListWidget * m_ListWidget;
...
}Code: Alles auswählen
QListWidget * m_ListWidget = 0;
void MessageLog::setText(QString text) {
m_ListWidget->addItem(text);
//so nun das Problem:
emit signalSetStatusBar(text);
}Header:
Code: Alles auswählen
class MessageLog;
class C: public QObject {
public slots:
void setStatusBarSlot(QString text);
private:
MessageLog * m_messageLog;
}Code: Alles auswählen
m_messageLog = MessageLog::Instance(); //da Singleton
connect(m_messageLog, SIGNAL(signalSetStatusBar(QString)), this, SLOT(setStatusBarSlot(QString)));Code: Alles auswählen
void C::setStatusBarSlot(QString text) {
m_widget->ui.statusBar->showMessage(text, 2000);
}
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?
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);
}