Dialog creation/ro

In această pagină vă vom expune cum se construiește o fereastră de conversație 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: A modal dialog appears in front of your screen, stopping the action of the main window, forcing the user to respond to the dialog, while a non-modal dialog doesn't stop you from working on the main window. In some case the first is better, in other cases not.
 * Identifying what is required and what is optional: Make sure the user knows what he must do. Label everything with proper description, use tooltips, etc.
 * Separating commands from parameters: This is usually done with buttons and text input fields. The user knows that clicking a button will produce an action while changing a value inside a text field will change a parameter somewhere. Nowadays, though, users usually know well what is a button, what is an input field, etc. The interface toolkit we are using, Qt, is a state-of-the-art toolkit, and we won't have to worry much about making things clear, since they will already be very clear by themselves.

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ă am selectat 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 loalizat in "C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" Pentru a crea un batch file "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 PySide install building/building PySide), pentru a face fișierul bazat pe PySide acum trebuie să utilizați:

Into Windows uic.py are located in "C:\Python27\Lib\site-packages\PySide\scripts\uic.py" For create batch file "compSide.bat": In the console Dos type without extension 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 face 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. Putem vedea deja widget-ul nostru în acțiune, punând fișierul mywidget.py într-un loc în care îl găsește 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 pictograma ei apropiată, desigur) să facem:

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.

What we will do here, is to create a new function that will create a plane based on height and width, and to connect that function to the pressed signal emitted by our "Create!" button. So, let's begin with importing our FreeCAD modules, by putting the following line at the top of the script, where we already import QtCore and 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): This, as you see, connects the pressed signal of our create object (the "Create!" button), to a slot named createPlane, which we just defined. That's it! Now, as a final touch, we can add a little function to create the dialog, it will be easier to call. Outside the Ui_Dialog class, let's add this code: (Python reminder: the __init__ method of a class is automatically executed whenever a new object is created!) Then, from FreeCAD, we only need to do: That's all Folks... Now you can try all kinds of things, like for example inserting your widget in the FreeCAD interface (see the Code snippets page), or making much more advanced custom tools, by using other elements on your widget.

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.

Download associated icons (Click rigth "Copy the image below ...)"



Here the code to display the icon on the pushButton, change the name for another button, (radioButton, checkBox) and the path to the icon. The command UserAppData gives the user path AppHomePath gives the installation path of FreeCAD This command reverses the horizontal button, right to left.

Method 2
Another method to display a window, here by creating a file QtForm.py which contains the header program (module called with import QtForm), and a second module that contains the code window all these accessories, and your code (the calling module).

This method requires two separate files, but allows to shorten your program using the file ' ' QtForm.py ' ' import. Then distribute the two files together, they are inseparable.

The file QtForm.py The appellant, file that contains the window and your code.

The file my_file.py

The connections are to do, a good exercise.

Other example

Are treated :

The code page and the icons Qt_Example
 * 1) icon for window
 * 2) horizontalSlider
 * 3) progressBar horizontal
 * 4) verticalSlider
 * 5) progressBar vertical
 * 6) lineEdit
 * 7) lineEdit
 * 8) doubleSpinBox
 * 9) doubleSpinBox
 * 10) doubleSpinBox
 * 11) buttom
 * 12) buttom
 * 13) radioButtom with icons
 * 14) checkBox with icon checked and unchecked
 * 15) textEdit
 * 16) graphicsView with 2 graphes

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ță pentru a- o plasa în același director a macrocomenzii

Pictograma utilizată este o iconiță pentru a fișierul disc, o pictogramă pentru a resursa FreeCAD și o pictogramă include în macro(format .XPM)



Alt exemplu complet de creare a unui cub cu iconiță în macrocomandă

Utilizare QFileDialog pentru a scrie fișierul
Codul complet:

Utilizarea QFileDialog pentru a citi fișierul
Codul complet:

Utilizare QColorDialog pentru a defini culoarea
Codul complet:

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

Câteva soluții sunt posibile.

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

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

sau cu procedura or or or