Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Qt] Tworzenie edytora map

Ostatnio zmodyfikowano 2011-02-16 15:07
Autor Wiadomość
programista12
Temat założony przez niniejszego użytkownika
[Qt] Tworzenie edytora map
» 2011-01-19 16:10:12
Chcę napisać w Qt swój edytor map. Problem w tym, że nie wiem, jak rysować kafelki w oknie Qt. Czytałem w internecie, że w Qt można użyć OpenGL, ale ja go nie umiem i nie wiem jak w nim rysować obrazki z pliku BMP. Zacząłem szukać dalej. Poczytałem i znalazłem informacje o tym, że można używać w Qt SDLa, którego już znam. Potem doczytałem, że nie potrzeba SDLa, bo można użyć QPaintera, QPixmap i QImage. I teraz zachodzi kilka pytań:
1. Jak napisać taki widget?
2. Z jakiej klasy ma dziedziczyć?
3. Jak dodać go do okna w designerze?
4. Jak zrobić tak, aby był scrollowalny, tzn. jak widget ma rozmiar 100x100 i jak się coś rysuje w pozycji np. X = 110, Y = 140 to żeby pojawiły się suwaki?
5. Jak odbierać sygnały myszki, tzn. gdzie w widgecie kliknięto, jaki był to przycisk myszy, itd. ?
Proszę o pomoc. Z góry dziękuję za odpowiedź.
P-26707
pixelmaster
» 2011-01-19 16:23:35
Do takiego edytora chyba lepiej będzie użyć QGraphicsScene, QGraphicsView i QGraphicsItem
QGraphicsView sobie rzucasz na formatkę i tworzysz klasy dziedziczące QGraphicsScene, QGraphicsItem.
W QGraphicsScene masz dostęp do pozycji myszki w QGraphicsItem masz dostęp do paintera.
Jak QGraphicsScene będzie większe od QGraphicsView to suwaki się pojawią automatycznie.
P-26708
SeaMonster131
» 2011-01-19 19:48:44
A nie lepiej sobie napisać to normalnie w samym SDL (czy w jakiej tam bibliotece robisz) niż w QT dodatkowo ? :D
P-26711
programista12
Temat założony przez niniejszego użytkownika
» 2011-01-19 20:05:35
@pixelmaster: Dzięki za odpowiedź, pokombinuję trochę i dam znać.
@SeaMonster131: Bo dla mnie to mordęga. Długo się pisze i trzeba zwracać uwagę nie tylko na samo programowanie edytowania mapy, ale też na programowanie interfejsu, dokładną pozycję XY każdego elementu interfejsu (częsta kompilacja i poprawianie) i większe szanse na buga. Poza tym w SDLu raczej pisze się same gry, a nie programy do nich. A w Qt mogę poświęcić więcej czasu na sam sposób działania edytora, bo tylko ustawię daną kontrolkę, dodam sloty, akcje, itp. i zajmuje to mniej więcej 5-10 minut. Nie muszę dodawać kilkunastu linijek kodu sprawdzających czy kursor jest nad przyciskiem, czy jest kliknięty itd., bo to Qt Designer robi za mnie.
Uff. Rozpisałem się, ale mam nadzieję, że mnie rozumiesz :)
P-26713
madmike44
» 2011-01-19 20:41:24
Na początek proponuję Ci poczytać o klasach, które wymieniłeś - QPainter, QPixmap i QImage - co oznaczają i jakie mają możliwości - wtedy pójdzie już "z górki" :)
P-26717
BlackDante
» 2011-01-20 11:05:19
Polecam najpierw zapoznanie się z filmikami: http://qt.nokia.com/developer/learning/online/training/specialized-elearning/graphics-view to Ci bardzo pomoże, są tam 3 filmiki pokazujące możliwości klasy QGraphicsView :)
P-26743
programista12
Temat założony przez niniejszego użytkownika
» 2011-01-21 16:05:20
@BlackDante: Dzięki za linka! Obejrzałem wszystkie 3 filmiki i trochę mi się sprawa rozjaśniła.

Mam jednak parę pytań:
1. Mam sobie QPixMapę z wczytanym obrazkiem. Jak  mogę wyświetlić fragment tego obrazka?
2. Jak sprawdzać kliknięcie myszą w danym miejscu QGraphicsSceny, albo w QGraphicsViewie?
3. Żeby na bieżąco aktualizować scenę muszę ją wyświetlać w pętli tak, jak w SDL, czy można inaczej? Proszę o jakiś przykład.
4. Z jakiego domyślnie folderu są wczytywane obrazki do QPixMapy? Na razie nie zrobiłem wczytywania obrazków przez okno otwierania (ale wiem jak to zrobić), bo teraz tylko testuję, a niezbyt wygodne jest podawanie pełnej ścieżki do obrazka.

EDIT:
5. Co muszę ustawić we właściwościach QGraphicsViewa, aby rozciągał się razem z oknem?
P-26767
pixelmaster
» 2011-01-21 18:17:00
1. http://doc.qt.nokia.com/4.7/qpixmap.html#copy-2
2. w swojej klasie dziedziczącej po QGraphicsScene
C/C++
#include <QtGui/QGraphicsSceneMouseEvent>
protected:
void mousePressEvent( QGraphicsSceneMouseEvent * event );
i potem
C/C++
void EditorScene::mousePressEvent( QGraphicsSceneMouseEvent * event )
{
    QPointF point = event->scenePos();
    /* point.x() i point.y() to współrzędne myszki na scenie */
}
3. jak dodajesz item to sama się odświerza a jak potrzebujesz możesz wywołać QGraphicsScene::update()
4. z folderu aplikacji
5. jak masz formatkę kliknij PPM -> rozmieść -> rozmieść w siatce
P-26773
« 1 » 2 3
  Strona 1 z 3 Następna strona