Dziedziczenie w Qt

0

cześć,
uczę się programować w QT i trafiłem na pewien problem.
Utworzyłem kasę z formem. Na formie mam kilka zakładek więc chciałem, żeby każdą zakładką zarządzała osobna klasa.
Mam więc klasę główną:

#include <QMainWindow>
#include <QDate>

namespace Ui {
class KlasaForm;
}

class KlasaForm : public QMainWindow
{
    Q_OBJECT

public:
    ...

protected:
    Ui::KlasaForm *ui;

i tworzę klasę pochodną:

#include "klasaForm.h"

class klasaPochodna : KlasaForm
{
public:
    ...
};

W klasie pochodnej mogę wywoływać metody z klasy nadrzędnej ale nie wiem jak w klasie pochodnej zmieniać samego forma, np. w taki sposób:
ui->jakasLista->addItem("aaa")

dostaje błąd "invalid use of incomplete type 'class Ui::KlasaForm' "

0

dostaje błąd "invalid use of incomplete type 'class Ui::KlasaForm' "

Ten błąd oznacza, że brakuje Ci #include KlasaForma.h

0

Uprzedzając kolejne pytanie: brakuje Q_OBJECT w klasie pochodnej.

1

Q_OBJECT nie jest niezbędne jeśli nie definiuje nowych sygnałów/slotów (i ogółem nie korzysta z MOC).

Swoją drogą: czemu prywatnie dziedziczysz po KlasaForm?

a co do samego pytania: @several prawdopodobnie się myli: aby korzystać z klasy wygenerowanej przez designera musisz zaincludować ui_klasaform.h (lub jakkolwiek inaczej się wygenerowany plik nazywa). Jest to jednak prawdopodobnie błąd designowy - pimpl/dptr jest po to, aby był widoczny wyłącznie dla jednej klasy. Zastanów się czy nie warto udostępnić odpowiednich rzeczy w publicznym interfejsie KlasaForm

0

#include KlasaForma.h mam w pliku .h oraz .cpp

Q_OBJECT powinienem dodać w ten sposób: #include "QObject"?
jeśli tak co nic nie pomogło.

1
kq napisał(a):

@several prawdopodobnie się myli: aby korzystać z klasy wygenerowanej przez designera musisz zaincludować ui_klasaform.h

Nope, skrót myślowy w poście pisanym na szybko. Miałem na myśli dokładnie to co napisałeś, sądziłem że to jasne no i nie pamiętam konwencji nazewniczej generowanych przez designera plików. Moja wina.

0

Bo zadeklarowałeś klase Ui::KlasaForm, a definiujesz KlasaForm. To są dwie różne klasy, a skoro Ui::KlasaForm została **tylko **zadeklarowana, to nie dziwne, że kompialtor mówi, że jest niekompletna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1