Changes between Version 16 and Version 17 of salome


Ignore:
Timestamp:
Nov 23, 2017, 12:29:42 AM (6 years ago)
Author:
brankm
Comment:

Primer izdelave dialoga.

Legend:

Unmodified
Added
Removed
Modified
  • salome

    v16 v17  
    329329    * **QLabel** služi za prikaz besedila in je statični element, ki podaja neko informacijo.
    330330
    331 Na sliki je prikazan primer izgleda uporabniškega vmesnika, ki ga bomo napisali v tem poglavju. Ta vmesnik grafične elemente razporedi v vertikalni smeri z metodo ''QVBoxLayout()''. Na vrhu je definiran ''QLabel'', pod njim pa gumb ''QPushButton''. S klikom nanj se izvede funkcija, ki izriše panel in ga pozicionira v prostoru. Nato lahko panel še rotiramo in naredimo kopije panela. V ''QLineEdit'' pod ''Set name:'' zapišemo imena rotiranih panelov, v ''QLineEdit'' pod ''Set rotation angle::'' zapišemo kot rotacije tipa `float`, v ''QLineEdit'' pod ''Set number of rotations:'' pa število panelov tipa `int`.
     331Na sliki je prikazan primer izgleda uporabniškega vmesnika, ki ga bomo napisali v tem poglavju. Ta vmesnik grafične elemente razporedi v vertikalni smeri z metodo ''QVBoxLayout()''. Na vrhu je definiran ''QLabel'', pod njim pa gumb ''QPushButton''. S klikom nanj se izvede funkcija, ki izriše panel in ga pozicionira v prostoru. Nato lahko panel še rotiramo in naredimo kopije panela. V ''QLineEdit'' pod ''Set name:'' zapišemo imena rotiranih panelov, v ''QLineEdit'' pod ''Set rotation angle::'' zapišemo kot rotacije okoli ''z''-osi tipa `float`, v ''QLineEdit'' pod ''Set number of rotations:'' pa število panelov tipa `int`.
    332332
    333333Na začetku ponovno uvozimo vse potrebne knjižnice, tokrat tudi grafično knjižnico `PyQt5`.
     
    445445    salome.sg.updateObjBrowser(True)
    446446}}}
     447
     448Nato zapišemo še funkcijo ''createNewPanel'', ki se izvede ob pritisku na gumb ''Apply'', in izdela zasukane panele. Omenjena funkcija kot vhodne argumente prejme tri spremenljivke tipa **QLineEdit**. V našem primeru je ''lin1'' objekt razreda **QLineEdit**, ki sprejme tekst, ki predstavlja ime zasukanih panelov, ''lin2'' predstavlja kot rotacije panelov,  ''lin3'' pa število zasukanih panelov. Do teskta dostopamo z metodo `QLineEdit.text()`, npr. `lin1.text()` vrne spremenljivko, ki vsebuje vnešen tekst v omenjeni **QLineEdit()**. Omenjena funkcija bo zdelala zasukane panele, če bo uporabnik predhodno izdelal panel, ki ga definira gumb ''Create panel''.
     449
     450{{{
     451#!python
     452def createNewPanel(lin1, lin2, lin3):
     453    # If panel is not made, there is nothing to rotate
     454    # If lin2.text() is not float, angle cannot be determined
     455    # If lin3.text() is not int, number of rotated panels cannot be determined
     456    if panelIsMade and float(lin2.text()) and int(lin3.text()):
     457        p1 = geompy.MakeVertex(0, 0, 0)
     458        p2 = geompy.MakeVertex(0, 0, 1)
     459        v = geompy.MakeVector(p1, p2)
     460        # This for loop iterates over number of roteted panels and
     461        # adds angle to every new panel. Result is panel_FW_rotated
     462        # Name of panel is given by user + angle of rotation
     463        for nr in range(1,int(lin3.text())+1):
     464            panel_FW_rotated = geompy.MakeRotation(panel_FW, v, math.pi/180*nr*float(str(lin2.text())))
     465            panel_name = str(lin1.text())+"_rotated_"+str(float(str(lin2.text()))*nr)+"_deg"
     466            geompy.addToStudy(panel_FW_rotated,panel_name)
     467        salome.sg.updateObjBrowser(True)
     468}}}
     469
     470Sedaj lahko izdelamo uporabniški vmesnik. Vsak uporabniški vmesnik je definiran kot objekt. Pri knjižnici ''PyQt5'' je to objekt, definiran kot **QtWidgets.QWidget()**. Objekt ima svoje metode, kot so npr. `setFixedSize()`, ki definira točno velikost dialoga, ter `setWindowTitle()`, ki definira naslov dialoga.
     471
     472{{{
     473#!python
     474widgetHDF = QtWidgets.QWidget()
     475widgetHDF.setFixedSize(500, 250)
     476widgetHDF.setWindowTitle('Rotate panel')
     477}}}
     478
     479Nato definiramo uporabljene grafične elemente. Spremenljivka panelIsMade je uporabljena v funkciji ''createNewPanel''. Če je njena vrednost `False`, se funkcija ne izvede, saj to pomeni, da predhodni panel, ki ga kopiramo, ni bil izdelan.
     480
     481{{{
     482#!python
     483lblPanel = QLabel('Create panel:')
     484btnPanel = QPushButton('Create Panel')
     485lbl1 = QLabel('Set name for rotation panels:')
     486lin1 = QLineEdit('panel4')
     487lbl2 = QLabel('Set rotation angle:')
     488lin2 = QLineEdit('0')
     489lbl3 = QLabel('Set number of rotations:')
     490lin3 = QLineEdit('1')
     491btn = QPushButton('Apply')
     492panelIsMade = False
     493}}}
     494
     495Metoda `setToolTip` prikaže namig, če kurzor premaknemo na gumb. Ko kliknemo na gumb, se mora izvesti neka funkcija. V ''PyQt5'' knjižnici ima gumb metodo `clicked.connect()`, ki kot vhodni argument sprejme ime funkcije, ki se mora izvesti. Gumb ''btnPanel'' razreda **QPushButton** pokliče funkcijo ''createPanel()'', ki ne sprejme nobenega vhodnega argumenta, saj je njena naloga samo izrisati predhodno določen in pozicioniran panel. Drugače je pri gumbu ''btn''. Ta kliče funkcijo ''createNewPanel()'', ki sprejme tri vhodne argumente, ki so ime panelov, kot in število panelov. Metoda `clicked.connect()` pa sprejme samo en argument. To rešimo s funkcijo `partial`. Prvi argument te funkcije je ''createNewPanel'', ostali argumenti pa so vhodni argumenti za našo funkcijo. Funkcija `partial()` tako vhodne argumente poda v ''createNewPanel''. in rezultat prenese v `clicked.connect()`.
     496
     497{{{
     498#!python
     499btnPanel.setToolTip('Create panel')
     500btn.setToolTip('Create rotated panels')
     501btnPanel.clicked.connect(btnPanel.clicked.connect(createPanel))
     502btn.clicked.connect(partial(createNewPanel,lin1,lin2,lin3))
     503}}}
     504
     505Sedaj lahko definiramo razporeditev grafičnih elementov v našem dialogu. Možne izbire so **QGridLayout()**, kar pomeni mrežna razporeditev elementov, **QHBoxLayout()**, ki elemente razporedi horizontalno in **QVBoxLayout()**, ki elemente razporedi vertikalno. V našem primeru uporabimo **QVBoxLayout()**, ki grafične elemente glede na zaporedje dodajanja v dialog razvršča vertikalno od zgoraj navzdol (prvi element, ki je dodan v dialog, v našem primeru ''lblPanel'' tipa **QLabel**, je na vrhu, nato sledijo drugi).
     506
     507{{{
     508#!python
     509layout = QtWidgets.QVBoxLayout()
     510layout.addWidget(lblPanel)
     511layout.addWidget(btnPanel)
     512layout.addWidget(lbl1)
     513layout.addWidget(lin1)
     514layout.addWidget(lbl2)
     515layout.addWidget(lin2)
     516layout.addWidget(lbl3)
     517layout.addWidget(lin3)
     518layout.addWidget(btn)
     519}}}
     520
     521Na koncu v objekt, ki definira dialog, namestimo porazdelitev grafičnih elementov. Z metodo `move()` lahko določimo, kje na ekranu bo pozicioniran dialog, z metodo `show()` pa dokončno prikažemo dialog na zaslonu.
     522
     523{{{
     524#!python
     525widgetHDF.setLayout(layout)
     526widgetHDF.move(500, 500)
     527widgetHDF.show()
     528}}}