Dialog creation/ro

In această pagină vă vom expune cum se construiește o casetă de dialog Qt Dialog cu Qt Designer, Qt's instrumentul oficial pentru proiectarea interfețelor, apoi se convertesc în codul Pytohn, ca mai apoi să fie utilizat în interiorul FreeCAD. Voi presupune în exemplul acesta că știți cum se editează și se rulează deja scripturile Python și că puteți face lucruri simple într-o fereastră terminală, cum ar fi navigarea, etc. Trebuie să fi instalat, firește, pyqt.

Proiectarea dialogului
In aplicațiile CAD, proiectarea unei bune interfețe user UI (User Interface) este foarte importantă. Despre tot ce va face utilizatorul va fi prin intermediul unei interfețe: citirea casetelor de dialog, apăsarea butoanelor, alegerea între pictograme etc. De aceea este foarte important să vă gândiți cu atenție la ceea ce doriți să faceți, cum doriți să se comporte utilizatorul, și cum va fi fluxul de activități al acțiunii dvs.

Există câteva concepte pe care trebuie să le cunoașteți atunci când proiectați interfața:
 * Modal/non-modal dialogs: Un dialog modal apare în fața ecranului, oprind acțiunea ferestrei principale, forțând utilizatorului să răspundă la dialog, în timp ce un dialog non-modal nu vă oprește să lucrați pe fereastra principală. În unele cazuri, prima este mai bună, în alte cazuri nu.
 * Identificarea cerințelor și a opțiunilor: Asigurați-vă că utilizatorul știe ce trebuie să facă. Etichetați totul cu o descriere adecvată, utilizați sfaturi pentru sfaturi, etc.
 * Separarea comenzilor de parametrii: Aceasta se face de obicei cu butoanele și câmpurile de introducere a textului. Utilizatorul știe că dacă faceți clic pe un buton veți produce o acțiune în timp ce modificați o valoare în interiorul unui câmp de text, veți schimba un parametru undeva. În prezent, totuși, utilizatorii cunosc de obicei bine ce este un buton, ce este un câmp de intrare etc. Setul de instrumente de interfață pe care îl folosim, Qt, este un set de instrumente de ultimă oră și nu ne vom teme prea mult despre clarificarea lucrurilor, deoarece vor fi deja foarte clare de la sine.

Deci, acum că am definit bine ce vom face, este timpul să deschidem designerul qt. Să proiectăm un dialog foarte simplu, după cum urmează:



Apoi, vom folosi acest dialog în FreeCAD pentru a produce un plan dreptunghiular. S-ar putea să nu fie foarte util să produci planuri dreptunghiulare, dar va fi ușor să le schimbi mai târziu pentru a face lucruri mai complexe. Când îl deschideți, Designer Qt arată astfel:



Este foarte simplu de utilizat. În bara din stânga aveți elemente care pot fi trase pe widget(toate instrumentele). În partea dreaptă aveți panouri care afișează tot felul de proprietăți editabile ale elementelor selectate. Deci, începeți cu crearea unui widget nou. Selectați "Dialog fără butoane", deoarece nu dorim butoanele implicite Ok / Cancel. Apoi trageți pe widget-ul 3 etichete, unul pentru titlu, unul pentru scrierea "Înălțime" și unul pentru scrierea "Lățime". Etichetele sunt simple texte care apar pe widget-ul dvs., doar pentru a informa utilizatorul. Dacă selectați o etichetă, în partea dreaptă vor apărea mai multe proprietăți pe care le puteți modifica dacă doriți, cum ar fi stilul fontului, dimensiune a, etc.

Apoi, adăugați 2 LineEdits , care sunt câmpuri de text pe care utilizatorul le poate completa, una pentru înălțime și una pentru lățime. Și tot aici putem edita proprietățile. De exemplu, de ce nu setați o valoare implicită? De exemplu, 1,00 pentru fiecare. În acest fel, atunci când utilizatorul va vedea dialogul, ambele valori vor fi deja completate și dacă este mulțumit el poate apăsa direct butonul, economisind timp prețios. Apoi, adăugați un PushButton, care este butonul pe care utilizatorul va trebui să îl apese după ce a completat cele două câmpuri.

Rețineți că selectăm aici niște controale foarte simple, dar Qt are mai multe opțiuni, de exemplu, ați putea folosi Spinboxes în loc de LineEdits, etc ... Aruncați o privire la ceea ce este disponibil, veți avea cu siguranță alte idei.

Este vorba despre tot ce trebuie să facem în Qt Designer. Un ultim lucru, totuși, să redenumim toate elementele noastre cu nume mai ușor, deci va fi mai ușor să le identificăm în scenariile noastre:



Traducerea dialogului nostru în python
Acum, hai să salvăm widget-ul undeva. Acesta va fi salvat ca un fișier .ui, pe care îl vom converti cu ușurință în scriptul python cu pyuic. Sub Windows, programul pyuic este livrat cu pyqt (pentru a fi verificat), sub Linux probabil că va trebui să îl instalați separat plecând de la managerul de pachete (pe sistemele bazate pe debian, face parte din pachetul pyqt4-dev-tools). Pentru a face conversia, va trebui să deschideți o fereastră de terminal (sau sub Windows o fereastră cu prompt de comandă ), să navigați la locul unde ați salvat fișierul .ui și să emiteți/tastați: În Windows pyuic.py este localizat in "C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" Pentru conversie creați un batch file numit "compQt4.bat: In consola Dos tastează fără extensie In Linux : to do

Deoarece FreeCAD s-a depărtat treptat de PyQt după versiunea 0.13, în favoarea PySide (Alegeți-vă PySide install building/building PySide), pentru a face fișierul bazat pe PySide acum trebuie să utilizați:

In Windows uic.py este localizat in "C:\Python27\Lib\site-packages\PySide\scripts\uic.py" Pentru a crea un fișier batch "compSide.bat": In consola Dos tastați fără extensie Into Linux : to do

Pe unele sisteme programul este numit pyuic4 în loc de pyuic. Acest lucru va transforma pur și simplu fișierul .ui într-un script python. Dacă deschidem fișierul mywidget.py, conținutul său este foarte ușor de înțeles: După cum vedeți, are o structură foarte simplă: este creată o clasă numită Ui_Dialog, care stochează elementele de interfață ale widget-ului nostru. Această clasă are două metode, una pentru configurarea widget-ului și una pentru traducerea conținutului său, care este parte din mecanismul general Qt pentru traducerea elementelor de interfață. Metoda de configurare creează pur și simplu, unul câte unul, widget-urile așa cum le-am definit în Qt Designer și le stabilește opțiunile așa cum am decis mai devreme. Apoi, întreaga interfață este tradusă și, în sfârșit, sloturile se conectează (vom vorbi despre asta mai târziu).

Acum putem crea un nou widget și putem folosi această clasă pentru a crea interfața sa. Putem vedea deja widget-ul nostru în acțiune, punând fișierul mywidget.py într-un loc în care va fi găsit de către FreeCAD (în directorul bin FreeCAD sau în oricare dintre subdirectoarele Mod) și, în interpretul Python FreeCAD, facem: Și dialogul nostru va apărea! Rețineți că interpretorul nostru Python funcționează încă, avem o fereastră de dialog nemodal. Deci, pentru a o închide, putem (în afară de a face clic pe iconița/pictograma ei apropiată, desigur) să facem:

Hai să facem ceva cu fereastra noastră de dialog
Acum, că putem afișa și ascunde fereasta noastră de dialog, trebuie doar să adăugăm o ultimă parte: Să faci ceva! Dacă explorați un pic designerul Qt, veți descoperi rapid o întreagă secțiune numită "semnale și sloturi". Practic, funcționează astfel: elementele de pe widget-urile dvs. (în terminologia Qt, aceste elemente sunt ele însele widget-uri) pot trimite semnale. Aceste semnale diferă în funcție de tipul de widget. De exemplu, un buton poate trimite un semnal atunci când este apăsat și când este eliberat. Aceste semnale pot fi conectate la sloturi, care pot fi funcționalități speciale ale altor widgeturi (de exemplu, un dialog are un slot "închis" la care puteți conecta semnalul de la un buton de închidere) sau pot fi funcții personalizate. Documentația PyQt Reference Documentation afișează toate widgeturile qt, ce pot face ele și ce semnale pot trimite etc.

Ceea ce vom face aici este crearea unei noi funcții care va crea un plan definit pe înălțime și lățime și pentru conectarea acelei funcții la semnalul emis de butonul apăsat "Creare!". Deci, să începem cu importul modulelor noastre FreeCAD, punând următoarea linie în partea de sus a scriptului, unde deja importăm QtCore și QtGui: Apoi, hai să adăugăm o nouă funție la a noastră Ui_Dialog class: Apoi, trebuie să informăm Qt pentru a conecta butonul la funcție, plasând următoarea linie înainte QtCore.QMetaObject.connectSlotsByName(Dialog): Aceasta, după cum vedeți, conectează semnalul pressed pus de obiectul creat (butonul "Creare!"), Într-un slot numit createPlane, pe care tocmai l-am definit. Gata, asta e! Acum, ca tușă finală, putem adăuga o mică funcție pentru a crea dialogul, va fi mai ușor de apelat. În afara clasei Ui_Dialog, să adăugăm acest cod: (Python amintește: the __init__ method of a class este executată automat ori de câte ori este creat un obiect nou!) Apoi, de la FreeCAD, avem nevoie doar de: Et voila ... Acum puteți încerca tot felul de lucruri, cum ar fi de exemplu inserarea widget-ului în interfața FreeCAD (consultați pagina Fragmente de cod) sau realizarea unor instrumente personalizate mult mai avansate, utilizând alte elemente pe widgetul tău.

Scriptul complet
Acesta este scriptul complet, pentru referințe:

Method 1
Un exemplu de cutie de dialog completă cu conexiunile sale. Aici este aceeași fereastră, dar cu o pictogramă pe fiecare buton.

Descărcați iconițele asociate (click rigth "Copy the image below ...)"



Aici codul pentru a afișa pictograma pe pushButton, schimba numele pentru un alt buton, (radioButton, checkBox) și calea spre pictogramă. Comanda UserAppData dă calea utilizatorului AppHomePath dă cale de instalare a FreeCAD Această comandă inversează butonul orizontal de la dreapta la stânga.

Method 2
O altă metodă de a afișa o fereastră, aici,este prin crearea unui fișier QtForm.py care conține programul de antet (modul numit cu import QtForm ) și un al doilea modul care conține fereastra de cod toate aceste accesorii și codul dvs. (modulul de apelare).

Această metodă necesită două fișiere separate, dar vă permite să scurtați programul utilizând fișierul importat "QtForm.py". Apoi distribuiți cele două fișiere împreună, ele sunt inseparabile.

The file QtForm.py Fișierul apelant, care conține fereastra și codul dvs.

The file my_file.py

Conexiunile trebuie făcute, un bun exercițiu

Other example

Sunt tratate :

Pagina Codului și iconițele sunt la Qt_Example
 * 1) icon for window, icoană afișată în colțul stânga sus a ferestrei principale
 * 2) horizontalSlider, glisor orizontal pentru conectare și extracție / asignarea datelor
 * 3) progressBar horizontal,bară de progres orizontală de conexiune și extracție / asignarea datelor
 * 4) verticalSlider, glisor vertical pentru conectarea și extragerea / asignarea de date
 * 5) progressBar vertical, bara de progres verticală conexiunea și extragerea / atribuirea de date
 * 6) lineEdit, line editează conexiunea sa și extragerea / asignarea datelor
 * 7) lineEdit
 * 8) doubleSpinBox,dublu spinbox conexiunea și extragerea / atribuirea de date
 * 9) doubleSpinBox
 * 10) doubleSpinBox
 * 11) button
 * 12) button
 * 13) radioButton with icons, butonul radio cu pictograma conexiunii bifate
 * 14) checkBox with icon checked and unchecked,caseta de validare cu pictograma conexiunii sale bifată și nebifată
 * 15) textEdit, text editează conexiunea sa și extragerea / asignarea datelor
 * 16) graphicsView with 2 graphes, vedere grafică cu 2 imagini și metoda de modificare a imaginii

Iconiță personalizată în ComboView
Aici este un exemplu de creare a unui obiect cu proprietăți și iconiță personalizată in ComboView

Descarcă exemplul de iconiță în același director ca și macrocomenda

Utilizați o pictogramă pentru trei cazuri diferite de utilizare: icon_in_file_disk (format .png), icon_XPM_in_macro (format .XPM) și icon_resource_FreeCAD



Completați un exemplu de creare a unui cub cu iconița sa

Utilizare QFileDialog pentru a scrie fișierul
Codul complet:

Utilizarea QFileDialog pentru a citi un fișier
Codul complet:

Utilizare QColorDialog pentru a defini culoarea
Codul complet:

Câteva comenzi utile
Folosind caracterele cu accente, primești eroarea:

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data

Câteva soluții sunt posibile. sau cu procedura

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 9: ordinal not in range(128)

sau cu procedura sau sau sau