mte.ui — bouwers van formulierspecificaties¶
Elk interfacevlak uit fase 3 — ctx.docks.add_panel en
ctx.settings_page.register — neemt een
formulierspecificatie: een gewoon woordenboek dat een widgetboom beschrijft.
Bouw die specificaties met de hulpjes mte.ui.*, zodat u de JSON niet met de hand
hoeft te schrijven.
from mte.ui import (
Column, Row, Group,
Label, Button, Checkbox, LineEdit, NumberSpin, ComboBox, List,
)
Niets in mte.ui praat met Qt of PySide — elk hulpje levert een woordenboek op
dat het draadschema volgt dat de C++-formulierontleder van de host verwacht.
Combineer ze gerust, voeg lijsten in of genereer ze programmatisch:
from mte.ui import Column, Row, Label, Button
def make_toolbar(commands):
return Row([Button(text=c["label"], on_click=c["id"])
for c in commands])
form = Column([Label(text="Actions:"),
make_toolbar(my_commands)])
De specificatie wordt aan de kant van de host gevalideerd; onbekende
besturingssoorten of ontbrekende verplichte velden leveren een fout
InvalidParams op die u in het logboek ziet.
De labels in een formulierspecificatie worden niet vertaald
Elk bijschrift dat u in een specificatie zet — paneeltitels, labels van
vinkjes, groepskoppen — wordt precies getoond zoals u het schreef, wat de
taal van de interface ook is. Het zijn gegevens die uw plug-in naar de editor
stuurt, geen tekenreeksen die de editor in een vertaalcatalogus kan opzoeken.
Moet uw plug-in meer dan één taal spreken, kies de teksten dan zelf voordat u
register aanroept; de huidige taal van de interface is
ctx.app_settings.get_string(mte.keys.UI_LANGUAGE) (leeg betekent «volg het
systeem»). Hetzelfde geldt voor de name en description die uw
plugin.json op Voorkeuren ▸ Plug-ins toont.
Indelingen¶
Indelingsbouwers nemen een lijst met woordenboeken van kinderen en schikken die verticaal of horizontaal.
Column(children)¶
Stapelt de kinderen van boven naar beneden met een rek aan het einde — de besturingselementen houden hun natuurlijke hoogte in plaats van op te zwellen om een hoog dok te vullen.
Row(children)¶
Hetzelfde idee, van links naar rechts, met een horizontale rek aan het einde.
Group(children, *, title="")¶
Een kader met een titel (weergegeven als QGroupBox) dat een verticale stapel
bevat. Gebruik het om verwante besturingselementen visueel te groeperen:
Group([
Checkbox(id="cs", label="Case sensitive", binds="settings:cs"),
Checkbox(id="ww", label="Whole words", binds="settings:ww"),
], title="Search options")
Indelingen nestelen vrijelijk — een Row binnen een Column binnen een Group
is prima.
Bladbesturingselementen¶
Elk blad aanvaardt via benoemde argumenten dezelfde vier gedeelde koppelingen:
| Argument | Betekenis |
|---|---|
id= |
Stabiele id die ctx.ui.get / ctx.ui.set en (impliciet) binds gebruiken. |
binds= |
"settings:<key>" — bewaart automatisch via ctx.settings. |
on_click= |
Id van de opdracht die aangeroepen wordt — alleen voor Buttons. |
on_change= |
Id van de afhandelaar (ctx.docks.on_change(...)) — voor elk ander besturingselement. |
Alleen bladeren die een «waarde» blootleggen ondersteunen binds en on_change.
Label(*, text="", id=None)¶
Statische tekst.
Button(*, text, on_click=None, id=None)¶
Een drukknop. on_click laten afgaan roept de geregistreerde opdracht aan; wilt u
de knop met iets anders gelijk houden, dan kunt u met ctx.ui.set zijn text
zetten.
Checkbox(*, label="", default=False, id=None, binds=None, on_change=None)¶
Booleaans besturingselement. default is de beginstaat; binds overschrijft die
met de bewaarde waarde wanneer die bestaat.
LineEdit(*, placeholder="", default="", id=None, binds=None, on_change=None)¶
Tekstinvoer op één regel.
NumberSpin(*, default=0, min=None, max=None, step=1, id=None, binds=None, on_change=None)¶
Draaivak voor gehele getallen. min en max klemmen het bereik (beide optioneel;
de onderliggende QSpinBox gebruikt zijn standaardbereik wanneer ze niet gezet
zijn). step is de stap op de pijltjes.
int-bereik
NumberSpin steunt op QSpinBox, dat een int (32 bits) bewaart. Waarden
buiten -2_147_483_648 … 2_147_483_647 verzadigen op de grens van het
platform.
ComboBox(*, items, default="", id=None, binds=None, on_change=None)¶
Uitklaplijst. items is een lijst — elk item mag ofwel een gewone tekenreeks zijn,
ofwel een object als {"value": "cpp", "label": "C++"} (vandaag wordt alleen
value gebruikt; label is voor een latere verfijning gereserveerd).
List(*, items, id=None, on_change=None)¶
Lijstwidget met enkelvoudige selectie. on_change gaat af met de tekst van het
zojuist geselecteerde item. Geen binds — bewaar de selectie zelf als u haar nodig
hebt.
Toegang tijdens het draaien¶
Zodra het paneel geregistreerd is, stuurt u het vanuit elke opdracht aan:
panel_id = ctx.docks.add_panel(id="my.panel", ..., form=Column([
LineEdit(id="needle"),
Checkbox(id="cs"),
]))
# Read current values
needle = ctx.ui.get(panel_id, "needle")
cs = ctx.ui.get(panel_id, "cs") == "true"
# Write values (does NOT fire on_change)
ctx.ui.set(panel_id, "needle", "hello")
ctx.ui.set(panel_id, "cs", True)
Zie ctx.ui voor de volledige naslag.
Waarden bewaren¶
binds="settings:<key>" is de kortste manier om de waarde van een
besturingselement te bewaren:
- Bij het bouwen van het paneel leest de widget zijn beginwaarde uit
ctx.settings.get(key, <default>). - Bij elke bewerking van de gebruiker schrijft de widget terug via
ctx.settings.set(key, new_value).
Omdat zowel panelen als Voorkeurenpagina's ctx.settings delen, spiegelen twee
besturingselementen met dezelfde binds-tekenreeks elkaar in real time. Zo houden
het dok en de Voorkeurenpagina van HelloPython het vinkje «Loud» gelijk.
Moet u iets bewaren dat het vocabulaire niet dekt (bijvoorbeeld de selectie van
een List), lees en schrijf dan rechtstreeks via ctx.settings in een
callback on_change.