Problem z QGraphicsView

0

Witam. Mam problem. Chcę sobie zrobić taki element graficzny, który będzie mi wyświetlał obrazek, a obok niego opis. Postanowiłem, że napiszę klasę, która dziedziczy po QGraphicsPixmapItem i po prostu dodam do niej QGraphicsTextItem. Oto ona:

 #include <QGraphicsPixmapItem>
#include <QGraphicsTextItem>
#include <QGraphicsScene>
class QGraphicsMytem : public QGraphicsPixmapItem
{
public:
    QGraphicsMytem();
    QGraphicsTextItem *textItem;
    void setPixmap(const QPixmap &pixmap);
    int spaceBetweenPixAndText;
    void setFont(const QFont &font);
private:
    void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
};
//----------------------------------------------------------------------------------------------------
#include "qgraphicsmytem.h"
#include <QDebug>
QGraphicsMytem::QGraphicsMytem() : QGraphicsPixmapItem(),
spaceBetweenPixAndText(10)
{
  textItem = new QGraphicsTextItem("blablablablabal", this);

}
void QGraphicsMytem::setFont(const QFont &font)
{
  textItem->setFont(font);
  //ustaw tekst na srodku //
  textItem->setPos(pixmap().width()+spaceBetweenPixAndText, pixmap().height()/2 - textItem->boundingRect().height()/2);
}

void QGraphicsMytem::setPixmap(const QPixmap &pixmap)
{
  //ustaw tekst na środku
  textItem->setPos(pixmap.width()+spaceBetweenPixAndText, pixmap.height()/2 - textItem->boundingRect().height()/2);
  QGraphicsPixmapItem::setPixmap(pixmap);
}

Po dodaniu tego obiektu do sceny(chcę np. ustawić jego pozycję i pobrać szerokość (taką, żeby była równa szerokości pixmapy i tekstu)) pojawiają się dwa ODDZIELNE obiekty :( QGraphicsPixmapItem i QGraphicsTextItem . Stąd moje pytanie - co mam zrobić żeby się dostać do obiektu QGraphicsMytem ??? Rzutować z obiektu PixmapItem, TextItem ? Proszę o pomoc .

0

Co rozumiesz o przez dwa oddzielne obiekty? Jak dla mnie jest to normalne zachowanie zgodne z oczekiwaniami, masz dwa obiekty spełniające relacje dziecko-rodzic!

Jeśli chcesz aby zmienił się obszar reagowania na zdarzenia myszy musisz zmienić implementację QPainterPath QGraphicsItem::shape () const tak by pokrył obszar obrazka i tekstu.

0

Hmmm wytłumacz jaśniej Bracie z czym problem?Bo gdzieś w kodzie tworzysz sobie zapewne obiekt klasy QGraphicsMytem,a skoro tak to nie ma przeciwskazań,abyś się doń odwoływał
Jeśli idzie Ci o graficzną reprezentację tegoż Twojego QGraphicsMytem,to dzieje się tak jak powinno być-składa się nań QGraphicsPixmapItem i QGraphicsTextItem połączone relacją parent-child,i tak jest wyświetlane
Jeśli zaś chodzi Ci o inny dostęp,to obacz QGraphicsScene::items() czy QGraphicsScene::selectedItems().Następnie rzutuj wskaźniki na swój typ,przy czym mała uwaga-polecam użyć QGraphicsItem::setData(0,"QGraphicsMytem") w konstruktorze Twojej klasy aby w łatwy sposób móc się skapnąć,że istotnie jest to obiekt klasy QGraphicsMytem.

0

Moja scena ma dodany jeden obiekt QGraphicsMytem ... Chcę się do niego dostać za pomocą items(), ale gdy iteruję, to mam dwa obiekty - QGraphicsPixmapItem i QGraphicsTextItem, które sobie rozróżniam po QGraphicsItem::type(). No i teraz pytanie brzmi: Jak mam poprawnie rzutować ten obiekt na QGraphicsMytem ? ? ?
Robię coś takiego :

 
  QGraphicsMytem *customItem;

  for(int i = 0 ; i < scene->items().count() ; i++)
  {
    if(scene->items().at(i)->type() == 7) //jeśli jest to QGraphicsPixmapItem(czyli rodzic) 
    {
      customItem = dynamic_cast<QGraphicsMytem*>(scene->items().at(i));
      customItem->setFont(QFont("Tahoma", 22)); <<<<<<<<<<---------------- DLACZEGO TUTAJ MI SIĘ WYWALA ? ? ?
    }
  }

I wywala się we wskazanym miejscu. I tutaj właśnie nie rozumiem dlaczego. Może błąd w rzutowaniu ?

0

Użyj qgraphicsitem_casta,ewentualnie static_casta Bracie.Qt jak moja praktyka pokazuje coś się z dynamic_castem nie lubi,a o ile mnie pamięć nie myli qobject_cast daje się stosować tylko do klas pochodnych od QObject ze zdeklarowanym makrem Q_OBJECT.

Tak btw,nieoptymalny masz kod-weź sobie nad pętlą stwórz QList<QGraphicsItem*> list=scene->items(); zamiast za każdym razem ją wyciągać ze sceny

0

by zadziałał qgraphicsitem_cast prawidłowo, należy nadpisać metodę: QGraphicsItem::type (w dokumentacji jest dobry opis).

Co do problemów dynamic_cast, jest to raczej problem kompilatora i pojawia się w aplikacjach podzielonych na dll-ki.
W twoim jednak przypadku, problem polega na tym, że nie sprawdzasz co zwrócił dynamic_cast (może zwrócić zero, jeśli konwersja nie przebiegła prawidłowo), brak if (customItem) ... .

0

OK. Dzięki Panowie. Zrobiłem już co chciałem. Iteruje wszystkie itemy, wybieram tylko te, które są rodzicami i rzutuję je na ten typ co stworzyłem . Dzięki za ten QGraphicsItem::Shape ... Dodam tylko, że oprócz shape() trzeba jeszcze zaimplementować boundingRect żeby się dało klikać.

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