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

[Qt] Drag and drop między layoutami

Ostatnio zmodyfikowano 2015-01-06 11:01
Autor Wiadomość
Nowicjusz
Temat założony przez niniejszego użytkownika
[Qt] Drag and drop między layoutami
» 2015-01-04 15:02:58
Cześć, mam dwa osobne layouty nie są one w żaden sposób ze sobą połączone, a chciałbym mieć możliwość przemieszczania między nimi labeli. Wiecie może jak to zrobić ?
P-124076
turaz
» 2015-01-04 15:15:50
Cześć,
Powiem Ci szczerze, że parokrotnie robiłem d&d w Qt to zawsze robiłem to przy użyciu własnych widgetów, i to one ustawiały w swoim layout'ie element droppnięty. Nie wiem niestety, czy klasy layout'ów posiadają metody do d&d, jeżeli tak to najlepiej stworzyć klasę dziedziczącą po tym layoutcie i w niej zaimplementować event'y d&d.
Ja osobiscie wykonałbym tak jak wyżej wspomniałem d&d na własnych widgetach.
P-124079
Nowicjusz
Temat założony przez niniejszego użytkownika
» 2015-01-04 15:24:45
Czyli stworzyłbyś dwa widgety, załóżmy do pierwszego dodałbyś label i chciałbyś go przenieść do drugiego widgeta. Ja dokładnie taki efekt chcę osiągnąć tylko nie wiem co zrobić, żeby program widział, że label znajduje się w obszarze drugiego widgeta. Efekt musi być taki, ze w momencie jak wychodzę poza obszar pierwszego widgeta wyłącza się możliwość 'drop', ąz do momentu gdy wejdę labelem w obszar drugiego widgeta.
P-124081
turaz
» 2015-01-04 15:40:28
Do d&d wykorzystuje się 3 eventy:
C/C++
void dragMoveEvent( QDragEvent * event );
void dropEvent( QDropEvent * event );
void dragEnterEvent( QDragEnterEvent * event );
 (może być błąd w nazwie bo piszę z pamięci)
dragEnterEvent()
 występuje, gdy jest element przeciągany wejdzie w pole widgetu obsługującego ten event i tutaj musisz sobie sprawdzic QMimeData(), którą używa się do d&d.
dropEvent()
 czyli zdarzenie występujące w momencie upuszczenia elementu
Jeżeli obsłużysz już samo 'chwycenie' w pierwszym widget'ie to teraz w drugim powinieneś mieć obsłużone te 3 opisane wyżej zdarzenia
Najlepszym sposobem, jeżeli chcesz aby widget pierwszy wyłącznie 'chwytał' elementy to nie musisz w nim obsługiwać tych elementów :)
Może troszke niejasno to opisałem to tutaj znajduje się przykład ze strony qt-project: http://qt-project.org/doc​/qt-4.8​/draganddrop-draggableicons.html nie jest on idealnie taki jak Twój ale mozna z niego wiele wyciągnąć.
P-124083
Nowicjusz
Temat założony przez niniejszego użytkownika
» 2015-01-04 15:53:41
dzieki udało mi się to rozwiązać powiem ci że qt przy c# to jest naprawde hardcore ;p

A powiedz mi jeszcze jedną rzecz to dotyczy tego tematu. Problem rozwiązałem dzięki temu, że utworzyłem sobie dwa obiekty które dziedziczą po klasie QWidget, tylko że system drag and drop działa w obu obiektach tak samo- logiczne, a co w przypadku gdybym chciał zmienić zachowanie się labela w momencie gdy pobieram go z widgeta 1 do widgeta 2 i odwrotnie. Np aby label pobrany z widgeta 1 i upuszczony do widgeta 2 zmienił kolor, a pobrany z widgeta 2 do widgeta 1 zmienił nazwe. Prawidłowym podejściem byłoby zrobienie odpowiedniego warunku w metodzie drop czy raczej utworzenie zupełnie innej klasy virtualnej która również dziedziczyłaby po QWidget w ten sposób możnabyłoby tak mi się wydaje kontrolować rózne zachowania dla różnych widgetów.
P-124085
turaz
» 2015-01-04 15:59:46
Ten warunek na dropEvent jest ok. Tylko nie rozumiem. czy zawsze zmiana będzie taka sama? Znaczy się czy np. zawsze z w1(widget pierwszy) do w2 zmienia kolor, a z w2 -> w1 zmienia tekst? Bo jeżeli dobrze rozumiem to nie wiesz jak przekazać inne rzeczy poza tekstem, mam rację?
PS. Qt jest świetny! :D Używam ponad 2 lata i jestem zadowolony ;)
P-124086
Nowicjusz
Temat założony przez niniejszego użytkownika
» 2015-01-04 21:11:25
Wiesz co musiałem zrezygnować z ustawiania wartości dla mimeData z racji tego iż podczas wyjezdzania labelem poza okno programu aktywował się event drop, a tego chciałem uniknąć ma to działać tylko pomiędzy widgetami. Chociaż teraz zastanawiam się, że może się pojawić problem bo nie będę wstanie odróżnić który label przesyłam w przypadku większej ilości. Jeżeli masz jakiś sposób na to aby mimo podania wartości w mimeData d&d działał tylko między widgetami to podziel się prosze :)
P-124145
turaz
» 2015-01-05 13:52:17
Najlepszym sposobem jest używanie własnego typu w mimedata i nie przesyłanie tego jako tekstu.
Kiedyś pracując przy d&d miałem taki przypadek, że użyłem tego standardowego, a nie typu stworzonego przez siebie i zakończyło się to tym, że mogłem droppować swoje elementy do przeglądarki. :)
Pokaż kod od d&d pewnie coś zaradzimy ;)
P-124200
« 1 » 2
  Strona 1 z 2 Następna strona