Jump to content
KrzyM

PySide - pytania

Recommended Posts

Hej

Zakładam jeden temat z pytaniami, mam nadzieje że tak będzie łatwiej.

kto wie to bardzo proszę o pomoc ;)

 

1. Brakuje mi frameLayout z mayi, jak to rozwiązujecie z PySide? Zacząłem pisać swoją funkcję, ale na samym początku natknąłem się na problem.

Stworzyłem QFRAME a w nim layout. tylko jak dodam elementy do QFrama to one są od razu zfreezowane. Nigdzie nie znalazłem jeszcze jak je odblokować.

http://doc.qt.io/qt-4.8/qpushbutton-members.html

http://doc.qt.io/qt-4.8/qframe-members.html

 

Mój kod

http://pastebin.com/LVetMStz

 

2. Jak ustawić ikonę w przycisku? Kod ^ . Próbowałem przez setIcon, style coś nie mogę tego uruchomić.

ySIHfij.png

 

3. Zauważyłem że przez reload(). Moje UI potrafi się zawiesić. Albo nie mogę go w ogóle wyłączyć, albo zawiesza mayę.

- tak wywołuję Okno http://pastebin.com/4DJ1JsCR

- tym skryptem z Shelfa http://pastebin.com/NKYtQVHE

 

Czytałem o różnych metodach, zostałem przy jednej bo wytrzymuje najdłużej. Ale nie jest to chyba rozwiązanie idealne.

4. Jak zrobić przycisk do pobierania danych ze sceny?

 

Klikam "Pick Mesh" i dopiero wtedy klikam na scene.

 

 

 

Z góry dziękuje za poświęcony czas ;)

Pozdro,

Krzysiek

Edited by KrzyM

Share this post


Link to post
Share on other sites

Odpowiedzi zacznę od końca:

4: najczęściej robię coś QLineEdit i QPushButton - zaznaczasz obiekt, klikasz button i nazwa zaznaczonego obiektu pojawia się w line edit.

 

3: to jest dość mętne, może mieć kilka przyczyn i generalnie nie jestem pewien czy dobrze to rozumiem.

 

Generalnie reload jest dość niebezpieczny, zwłaszcza w kontaktach z PySide. Jeżeli wrapujesz sobie wskaźnik na główne okno majki shibokenem i tą instancję trzymasz w zmiennej w scope modułu, to musisz pamiętać, że reload() spowoduje nadpisanie tego wskaźnika, zostanie stworzona nowa instancja PySide.QtGui.QWidget a stara zostanie skasowana przez garbage collector. Niestety widget który jest aktualnie odpalony potrzebuje nadal tego obiektu który został scollectowany, przez co albo Maya się wywala albo okno już nie działa prawidłowo (wypada z pętli głównego wątku QApplication etc.) Żeby temu zapobiec używam najczęściej prostej implementacji wzorca Singleton w module, którego nigdy nie przeładowuję reloadem, a który trzyma listę wszystkich wskaźników do okienek jakie tworzę w sesji majki. Jak znajdę się w pracy a sobie nie poradzisz z tym to znajdę snippet z kodem.

 

Cheers.

Share this post


Link to post
Share on other sites

Jeśli chodzi o same widgety i layouty to bardzo Ci polecam nauczyć się używać QtDesignera i ładowania plików .ui prosto na QWidget - odchodzi Ci babranina z budowaniem UI oraz jeśli trzeba zmienić coś w wyglądzie to jest to 10 minut a nie 10 godzin.

PS. w tym kodzie na pastebin'ie masz jakoś strasznie długie te wcięcia - standard w pythonie to 4 spacje na jeden poziom wcięcia - niby pierdoła ale aż boli patrzenie na to :)

 

- - - Połączono posty - - -

 

a - jeszcze ikona. Spróbuj najpierw sprawdzić czy tak naprawdę znajduje Ci prawidłowy plik, w drugiej kolejności po stworzeniu instancji QIcon sprawdź sobie jej rozmiary. Qt ma to do siebie że nie wyrzuca wyjątku jeśli nie uda mu się otworzyć obrazka tylko zwraca pusty obrazek.

Share this post


Link to post
Share on other sites

Dzięki wielkie ;) QT designer używam, ten skrypt chciałem napisać ręcznie żeby zobaczyć co i jak. Pewnie nie zawsze uda mi się coś zrobić qdesignerem ;)

Po testuje wszystko co mi napisałeś i będę się odzywać.

Faktycznie paste bin jakoś dziwnie to wkleił, ja używam 1tab jako indent, więc chyba 1tb = 4 space.

 

Doszły mi już książki z Pythona więc trochę przystopuje po pracy kodowanie i poczytam ;)

 

Jeszcze 1 ;) A jak zrobić frameLayout rozwijany jak w mayce? Może ja złych elementów używam. Chciałem użyć QFRAME, ale jak coś do niego wrzucę to jest zfreezowane. Jeszcze nie udało mi się nic znaleźć na ten temat

Edited by KrzyM

Share this post


Link to post
Share on other sites

Robisz QGroupBox z ustawionymi flagami flat i checkable, wstawiasz w niego jeden QWidget który będzie kontenerem na całą zawartość, robisz połączenie między sygnałem "toogled(bool)" group box'a a "setVisible(bool)" kontenera. Pakujesz sobie do kontenera wszystkie widgety których potrzebujesz.

 

Teraz pozostaje tylko ostylować checkbox'a i voila.

Share this post


Link to post
Share on other sites

Hej,

wracam z problemami ;)

Generalnie reload jest dość niebezpieczny, zwłaszcza w kontaktach z PySide. Jeżeli wrapujesz sobie wskaźnik na główne okno majki shibokenem i tą instancję trzymasz w zmiennej w scope modułu, to musisz pamiętać, że reload() spowoduje nadpisanie tego wskaźnika, zostanie stworzona nowa instancja PySide.QtGui.QWidget a stara zostanie skasowana przez garbage collector. Niestety widget który jest aktualnie odpalony potrzebuje nadal tego obiektu który został scollectowany, przez co albo Maya się wywala albo okno już nie działa prawidłowo (wypada z pętli głównego wątku QApplication etc.) Żeby temu zapobiec używam najczęściej prostej implementacji wzorca Singleton w module, którego nigdy nie przeładowuję reloadem, a który trzyma listę wszystkich wskaźników do okienek jakie tworzę w sesji majki. Jak znajdę się w pracy a sobie nie poradzisz z tym to znajdę snippet z kodem.

 

^up niestety nie udało mi się tego rozwiązać, dużo rzeczy też jeszcze nie do końca łapię tak od razu ;)

coś szukam, mam jakiś szkic - ale efektów 0 jak na razie :)

class replaceUI(object):
   _instance = None

   def __new__(plugin, *args, **kwargs ):
       if plugin._instance == None:
           plugin._instance = {}
       return plugin._instance

To odswieżanie skryptów może ma jakiś związekz tym jak ja odpalam te skrypty? http://max3d.pl/forum/threads/98630-Maya-UI-Python-Dynamiczne-%C5%82adowanie-klasy?p=1248062#post1248062

 

i nowe pytania jakie się urodziły:

1. Jeśli mam na obiekt nałożony już jakiś css setStyleSheet("style.css"), to czy jest jakaś opcja tylko nadpisać jeden element a nie resetować style do 0? Jak dodam linię niżej setStyleSheet("background: red") to zrestuje mi to co miałem, a chciałbym nadpisać tylko to tło i tyle.

 

2. Jest jakaś opcja że dodatki które dopiszę sobie do pySide mogę podpiąć pod QTDesignera i używać w plikach? Czy wtedy używając takich elementów skazany jestem na tworzenie UI z kodu? Chyba że nie wczytujecie samych plików UI, tylko konwertujecie je do .py i tam jeszcze wprowadzacie zmiany?

 

3. Znalazłem kilka w miarę różnych metod wczytywania UI, i z moim brakiem doświadczenia nie jestem w stanie powiedzieć która jest lepsza od innej.

Np. ta metoda działa całkiem fajnie, zastanawiam się tylko czy to ok rozwiązanie z cmds.window itp.

http://pastebin.com/RjaBVXLi

http://pastebin.com/P6PNUn98

 

zabrałem to z: http://nicholas-silveira.blogspot.com/2013/10/get-maya-2014-pyside-example.html

 

Na koniec wrzucam jakieś screeny z tego co mam,

2who2g7.jpg

 

 

Z góry dzięki za pomoc,

KrzyM

Share this post


Link to post
Share on other sites

Tak na szybko odnośnie 2 - nie używam prawie nigdy UI generowanego z kodu, staram się zawsze zaszywać je w plikach .ui.

Da się tego używać w designerze ale nie jest to takie oczywiste. Musisz kliknąć sobie "Promote to" na widget'cie i dalej to już dłuższa historia :)

Share this post


Link to post
Share on other sites

Czytałem na temat schematu Singleton, i znalazłem na to z kilka różnych rozwiązań.

np. http://python-3-patterns-idioms-test.readthedocs.org/en/latest/Singleton.html

czy http://nathanhorne.com/?p=465

 

kilka udało mi się zaimplementować i nawet wydaje się że działają.

Znalazłem jednak takie rozwiązanie i wydaje się super - może się myle ale wygląda na wzorzec Singleton.

http://nathanhorne.com/?p=485

Mam nadzieje że jedno z pytań można uznać za rozwiązane? Wyprowadźcie mnie z błędu jeśli coś nie tak ;)

Share this post


Link to post
Share on other sites

Ponownie bede przekonywal abys nie uzywal klasy w celu implementacji wzorca singleton. Wzorzec ten pochodzi, o ile se nie myle, z jezyka Java. Jest to klasa gdyz w Java nie mozna poprostu zdefiniowac globalnej zmiennej. W python, mozna. Caly koncept singleton opiera sie na utrzymywaniu jakiegos globalnego stanu.

Ponadto wzorzec ten probuje rozwazac problem dostepu do tego zasobu w srodowisku wielowatkowym. Twoja aplikacja nie skorzysta z tego w zadnym stopniu. Czy planujesz wymieniac informacje miedzy glownym oknem a potomnymi ? Jesli uzytkownik urchomi glowne okno, wywola dwa potomne i zamknie glowne to potomne moga aktualizowac stan w jakims globalnym slowniku i przy ponownym uruchomieniu glownego okna, moze ono czytac ten stan i zmienic kolorki ma przyklad. Slownik taki mozesz zdefiniowac podczas startu maya i uniknac przeladowywania go w trakcie pracy interprerera. W kodzie tworzenia glownego okna mozesz sprawdzic czy okno juz istnieje w slowniku i je zwrocic lub stworzyc nowe. W ten sposob unikniesz problemu z "reload".

Edited by CgBartosz

Share this post


Link to post
Share on other sites

W sumie nie myślałem żeby okna się komunikowały, ale dlaczego by nie ;) Każda nowa rzecz na +

 

okno jedno, ale problem z reload jest chyba głównie z importu, nie wiem czy muszę przyjąć za stałe że jeśli jest import to na pewno jest okno? Chyba tak.

 

Ale rozumiem że jak będę wiedział to okno już jest to będę je jedynie pokazywał i chował. Ale ten reload i tak muszę jakoś wykonać jak wprowadzę jakieś zmiany

Będę pracował nad tym w przyszłym tygodniu.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

We are using cookies. Read about our Privacy Policy