Qt, dziwna sprawa

Qt, dziwna sprawa
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0

Cześć :)
Mam klasę bazową BAZOWA, która dziedziczy po QtObject. Po tejże klasie bazowej dziedziczy inna klasa DZIEDZIC, a zatem dziedziczy pośrednio po QtObject.
W klasie BAZOWEJ mam czysto wirtualne funkcje i nic więcej. W klasie DZIEDZIC mam publiczne sloty. I teraz jeżeli w mainwindow.cpp podpinam sygnał pod ten slot ( publiczny) to dostaję komunikat:
QObject::connect: No such slot BAZOWA::mojSlot();
Dlaczego w ogóle on ma szukac niby w Bazowej skoro jako pierwszy argument przekazuję wskaźnik na obiekt typu DZIEDZIC.

KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:6 miesięcy
  • Postów:2514
0

Pokaż kod


░█░█░█░█░█░█░█░█░█░█░█░
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0
Kopiuj
class Bazowa : public QObject
{
Q_OBJECT
public:
    Bazowa();
    virtual void f() =0;
    virtual void g() = 0;

};

class Dziedziczona : public Bazowa
{

public:
    Dziedziczona(QString , QString, QString , QString);
private:
   void f();
   void g();

    
public slots:
   void Button1Clicked();
   void Button2Clicked();
};

MainWindow.h:

Kopiuj
....
private:
Dziedziczona* obj;

MainWindow.cpp:

Kopiuj
 obj = new Dzedziczona("Da","Das","das");
Kopiuj
QObject::connect( ui->Button1, SIGNAL(clicked()), obj, SLOT(Button1Clicked()));

I dosataję:

QObject::connect: No such slot Bazowa::Button1Clicked()

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 2 godziny
0

Brakuje Q_OBJECT w klasie dziedziczonej.

MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0

ok, a dlaczego to się nie dziedziczy? Przecież do Q_OBJECT wygląda tak:

Kopiuj
public: \
    Q_OBJECT_CHECK \
    static const QMetaObject staticMetaObject; \
    virtual const QMetaObject *metaObject() const; \
    virtual void *qt_metacast(const char *); \
    QT_TR_FUNCTIONS \
    virtual int qt_metacall(QMetaObject::Call, int, void **); \
private: \
    Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
    struct QPrivateSignal {};

Po dodaniu tego Q_OBJECT w Dziedziczona dostaję:

undefined reference to `vtable for Dziedziczona'

edytowany 2x, ostatnio: mielony
MarekR22
bug w make wyczyść projekt i zbuduj na nowo. Makro Q_OBJECT poza dodaniem do klasy tego kodu, stanowi również instrukcję dla moctool by stworzyć meta dane dla danej klasy.
Azarien
w Qt Creatorze jest opcja "run qmake"
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:15 minut
1

W sumie dziwne, że masz taki problem, skoro w te sloty zdefiniowane są w klasie bazowej, która ma makro Q_OBJECT.
Tak czy siak, każdy QObject musi mieć to makro, bo inaczej wiele ważnych rzeczy nie działa jak należy.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Azarien
sloty są w klasie dziedziczonej.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.