sygnal i sloty Qt

0

Witam

piszę sobie grę w Qt i graphicsview dokładnie chodzi o statki.

I tak

Mam klase QMainWindow (Q_OBJECT), klasę dziedziczącą po QGraphicsScene, klasę dziedziczącą po QGraphicsItem (pola na planszy) i ogólną klasę z mechaniką gry...

I w klasie od sceny mam tablice wskaźników do obiektów klasy od itemów oraz wskaźnik na obiekt klasy od gry i teraz chcę za pomocą sygnałów i slotów stworzyć taki mechanizm że jak klikne na item to on znika i wczytuje na to miejesce jakąś pixmape...dodam że korzystam z mousepressevent w klasie od QGpraphicsItem

i próbowałem tak

w klasie item :

bool MyItem::Click() // to jest public slot
{
    pressed = true;
    return pressed;
}

w klasie od sceny

void MyScene::drawObject() // to jest sygnal
{
    // jakiś kod który wczytuje pixmape czy rysuje coś od nowa
}

teraz connect próbowałem w konstruktorze sceny

connect(cell,SIGNAL(Click()),this,SLOT(drawObject()));

cell to wskaznik na tablice obiektów od MyItem

wyskakuje błąd, mniej więcej wiem dlaczego tak jest ale jak to rozwiązać ?

błąd:no matching function for call to 'MyScene::connect(MyItem [25], const char, MyScene const, const char)'

Ze slotami mam małe doświadczenie więc nie wiem czy dobrze kombinuję..

Kodu trochę mało dalem bo jeden wieli chaos panuje w projekcie, jak trzeba to do kleje więcej.

0

Cóż,raczej na pewno "const MyScene" a nie "MyScene const"
I przydałoby się,żebyś zapodał linijkę kodu w któej jest błąd oraz deklarację sygnału i slotu które chcesz łączyć

0

błąd wywala właśnie na :

connect(cell,SIGNAL(Click()),this,SLOT(drawObject()));

nie wiem czy tutaj moge dać this (czy musi być już utworzony obiekt sceny?), nie wiem czy również jeśli cell jest tablicą wskaźników na obiekt to samo cell wystarczy ?, no i SIGNAL(Click()) nie wiem jak się odwołać do sygnału ogólnie bez [] np. cell[0].Click()

to w MyScene

// wycinek z pliku.h

MyItem  *cell[25];

signals:
        void drawObject();

to w MyItem

public slots :
    bool Click();

Click wywołuje w mousePressEvent od MyItem

void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    Click();
    update();
    QGraphicsItem::mousePressEvent(event);
}
0

Ehh próbuje małymi kroczkami ale nie idzie;/

Każda klasa chcąca używać sygnałów i slotów musi posiadać marko Q_OBJECT ?

Więc do mojej klasy MyScene próbowałem dodać to macro w taki sposób :

plik.h

class MyScene : public QGraphicsScene
{
    Q_OBJECT
public:
        MyScene(QObject *parent = 0);

    // reszta kodu
}

i plik.cpp

konsturktor

MyScene::MyScene(QObject *parent) : QGraphicsScene(parent) // błąd
{
    // reszta kodu
}

destruktor

MyScene::~MyScene() // błąd
{
    //delete game;
    //delete []cell;
}

i wywala

błąd:undefined reference to `vtable for MyScene'

w pliku .cpp na liniach z konstruktorem i destruktorem ;[

0

próbowałeś przebudować projekt? Najlepiej wyczyść i zbuduj na nowo. QtCreator miewał problemy niegdyś z tym.

najlepiej wrzuć tutaj cały swój projekt jeśli nie jest to ściśle tajne wtedy może coś poradzimy.

0

Ok dzięki dałem wyczyść projekt, uruchom qmake, przebuduj projekt i działa :)

teraz przestudiuje jeszcze raz sloty i sygnały i powoli będę próbował to zaimplementować tak jak chciałem.

Jak by co temat jeszcze otwarty.

0

wszystko ładnie pięknie prawie dokończone tylko po kompilacji taki warring :

ostrzeżenie:Class MyItem implements the interface QGraphicsItem but does not list it in Q_INTERFACES. qobject_cast to QGraphicsItem will not work!

czyli nie da się używać S & S w klasie dziedziczącej po QGraphicsItem:) nie ma to jak cały dzień dochodzić do tego :)

0
k4myk napisał(a)

wszystko ładnie pięknie prawie dokończone tylko po kompilacji taki warring :

ostrzeżenie:Class MyItem implements the interface QGraphicsItem but does not list it in Q_INTERFACES. qobject_cast to QGraphicsItem will not work!

czyli nie da się używać S & S w klasie dziedziczącej po QGraphicsItem:) nie ma to jak cały dzień dochodzić do tego :)

Jakbyś zajrzał do dokumentacji nie miałbyś takich problemów. Aby móc korzystać z s&s klasa musi dziedziczyć bo QObject. Teraz masz kilka wyjść jak dodać s&s do swojej klasy.

0

Niestety nie mam pojecia jak to zrobić ;[

próbowałem w normalny sposób czyli klasę dziedziczyć po QObject i QGraphicsItem

0

To może utwórz sobie drugą klasę pomocniczą, która będzie dziedziczyć po QObject i umieść jej obiekt jako składowa klasy dziedziczącej po QGraphicsItem.

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