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ć ? |
|
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. |
|
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. |
|
turaz |
» 2015-01-04 15:40:28 Do d&d wykorzystuje się 3 eventy: 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ąć. |
|
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. |
|
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 ;) |
|
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 :) |
|
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 ;)
|
|
« 1 » 2 |