2013-03-02 13 views
21

Mam problem z moją aplikacją Qt. Próbuję emitować sygnał z innej klasy (jest to klasa zagnieżdżona z tego, w którym umieszczony jest sygnał).Jak mogę emitować sygnał z innej klasy?

Podłączyłem już sygnał do gniazda, co powinno być w porządku. Ale gdy próbuję emitować ten sygnał z wnętrza tego pod klasie pojawia się błąd kompilatora:

cannot call member function without object

Co jest nie tak? Szukałem tego w dokumentacji Qt, ale nie mogłem znaleźć rozsądnego rozwiązania, a nawet wyjaśnienia.

Uproszczona definicja klasy wygląda następująco.

class LogWriter : public QDialog 
{ 
    Q_OBJECT 

public: 
    class Log : public QObject 
    { 
     Q_OBJECT 

    public: 
     bool print; 

     Log(bool _print, QString _color, QObject *obj = NULL) 
     : QObject(obj) 
     { 
     print = _print; 
     color = _color; 
     } 
    }; 

    LogWriter(QWidget * parent = 0); 
    ~LogWriter(); 

public slots: 
    void setMinVal(); 
    void setMediumVal(); 
    void setHighVal(); 
    void cleanWindow(); 
    void appendText(QString &text); 

signals: 
    void signalLogAppend(QString); 
}; 

podłączyć sygnał instancji LOW z LogWriter w kodzie klienta do jakiejś szczeliny, stosując następujące wywołanie funkcji:

connect(&LOW, SIGNAL(signalLogAppend(QString)), 
     this, SLOT(appendText(QString&)), 
     Qt::DirectConnection); 
+0

Czy "LOW" jest właściwym typem obiektu? – tmpearce

+0

Co to jest LOW? Brakuje jakiegoś kodu, aby uzyskać właściwą analizę. –

+0

LOW reprezentuje klasę Log - klasa wewnętrzna, o której wspomniałem w poście – lagoru

Odpowiedz

34

Aby zrozumieć problem, trzeba zrozumieć, w jaki sposób sygnały są emitowane :

Są po prostu niestatycznym wywołaniem funkcji członka i dlatego wymagają wywołania instancji ("nadawcy"). Zazwyczaj ta instancja to this (jeśli emitujesz sygnał z innej niestatycznej funkcji członkowskiej z tej samej klasy), więc składnia wywołania staje się normalnym wywołaniem funkcji bez żadnej (literalnej) instancji. Słowo kluczowe emit jest opcjonalne i jest po prostu makro, które rozszerza się do niczego. Kolejne cztery wersje są takie same, gdy napisane w funkcji członka tej samej klasy, która zawiera sygnał:

emit this->signalLogAppend("foo"); 
emit signalLogAppend("foo"); 
this->signalLogAppend("foo"); 
signalLogAppend("foo"); 

Jeśli emitować sygnał zewnętrznej klasy od wewnątrz wewnętrznej klasy, wskaźnik this odnosi się do instancja klasy wewnętrznej, a zatem brakuje pewnej instancji dla klasy zewnętrznej. Podobnie jest, jeśli wywołujesz jakąkolwiek inną funkcję klasy zewnętrznej z wewnątrz klasy wewnętrznej: kompilator nie wie, na której instancji obiektu (klasy zewnętrznej), aby ją wywołać. Więc trzeba napisać coś takiego:

emit someLogWriter->signalLogAppend("foo"); 

Tutaj, someLogWriter jest instancją LogWriter dla którego chcesz emitować sygnał.

+0

Hm ... wydaje się, że to jest logiczne wytłumaczenie :) Próbowałem też tak myśleć, ale użyłem ptr-> emit signalLogAppend(), który po przeczytaniu twojego postu wygląda trochę głupio - ok, dzięki za pomoc !! ! – lagoru

+0

Cóż, to jest głupie, ale myślę, że to też powinno działać. Ponieważ rozszerza się do 'ptr-> signalLogAppend()' (zwróć uwagę na spację), które powinno być poprawne. – leemes