achim wrote:

Hello Laurent,
I tested using the current AppImage as well as within Qt Creator using the latest Git clone, and I encountered frequent program crashes. However, I was unable to reproduce these crashes reliably.
The crashes occurred :
- when clicking the Line Tool button in the diagram editor;
- when dragging a contact element into the diagram;
- when using the mouse wheel (this happened frequently).

Furthermore, I noticed that when zooming, the contact lines in the contact mirror disappear (see photos).

I do not use the ccrossrefitem.patch

This is a SIGSEGV (segfault) in QElectroTech on Debian, crashing during text rendering. Here's what the stack trace tells us:

Root cause: crash in the Wayland Qt client while drawing cached glyphs

The main thread (
#159466) crashed at:


libQt5WaylandClient.so.5 → drawCachedGlyphs → drawTextItem → QTextLine::draw → QGraphicsTextItem::paint → QGraphicsView::paintEvent
The crash happens inside libQt5WaylandClient when Qt tries to render text (glyphs) in a QGraphicsTextItem — likely a label or annotation in a schematic — via the Wayland backend.

Most likely causes and fixes to try, in order:

Force X11 instead of Wayland — this is the most common fix for this kind of crash. Run QElectroTech with:

bash
   QT_QPA_PLATFORM=xcb qelectrotech
If that works, make it permanent by adding QT_QPA_PLATFORM=xcb to your ~/.profile or creating a wrapper script.

Disable GPU/hardware acceleration — the libgallium threads (Mesa's Gallium3D) visible in the other threads suggest GPU rendering is active. Try:

bash
   LIBGL_ALWAYS_SOFTWARE=1 qelectrotech

crossrefitem: fix SIGSEGV crash + improve double-click navigation + fix PDF/SVG/print rendering

Fix a use-after-free crash (SIGSEGV in QRegion::begin, Qt5Gui+0x49af60)
confirmed by analysis of 19 coredumps. The crash was triggered when the
scene viewport clip region was freed during zoom/resize events while
QPicture::play() replayed drawPolyline commands through the scene painter.
Qt's raster engine then dereferenced a stale QRegionData pointer.

Root cause: CrossRefItem used three nested QPicture objects (m_drawing,
m_hdr_no_ctc, m_hdr_nc_ctc). The nested drawPicture() calls amplified
the use-after-free risk on any repaint event.

Fix: remove all QPicture from CrossRefItem entirely.
- updateLabel() now uses a QImage-backed dummy painter to compute
  m_bounding_rect, m_shape_path and m_hovered_contacts_map geometry.
  A bool m_update_map flag prevents the map from being overwritten
  during paint().
- paint() calls drawAsCross()/drawAsContacts() directly on the scene
  painter — no QPicture::play() anywhere in the class.
- buildHeaderContact() now draws NO/NC symbols directly onto the painter
  instead of recording them into QPicture members.

Also fix mouseDoubleClickEvent: the element under the click is now found
directly from m_hovered_contacts_map using the event position, rather
than relying on m_hovered_contact which could be reset by hoverMoveEvent
between the two clicks of a double-click.

Also remove setBold(true) on terminal name labels: the Qt PDF/SVG/print
engine rendered bold at 4pt as extremely thick glyphs, making exports
unreadable. Normal weight at 4pt is correct and legible on all backends.

Fixes: SIGSEGV in CrossRefItem::paint() on zoom/resize
Fixes: double-click navigation unreliable on Xref contact symbols
Fixes: terminal name labels unreadable in PDF/SVG/print export


Please try the new package builds for all of us who use nightly builds in production like us.

Hello Achim

Crash analysis — 19 coredumps, two distinct bugs

I analyzed all 19 coredumps using a Python/pyelftools script. The crashes fall into two completely separate categories.

Bug 1 — QRegion use-after-free in crossrefitem.cpp (7 cores, May 22–24)

Every single one of these crashes hits the exact same address: Qt5Gui+0x49af60 = QRegion::begin(). The QRegionData internals are fully corrupted at crash time (ref count garbage, numRects ~21 800–22 000, rects* pointer invalid) — classic use-after-free signature. The QRegion object has already been destroyed, but a dangling reference to it is still held inside the QPicture and gets dereferenced when play() replays the recorded paint commands during a repaint or zoom event.

This bug was introduced by the recent crossrefitem.cpp commits. The fix needs to ensure that any QRegion passed to the painter inside updateLabel() outlives the QPicture that records it, or better, avoid setClipRegion() entirely and use setClipRect() instead (which copies by value with no shared ownership).

Bug 2 — Spinbox + mouse wheel crash (12 cores, May 22–23)

Completely unrelated. These crashes are all inside libQt5WaylandClient or libQt5XcbQpa — Qt's platform backends — with no crossrefitem involvement whatsoever. This is the old spinbox/mouse-wheel crash in the element editor that has been reproducible since QET 0.7/0.8/0.9. It only appears on Linux (Wayland and XCB sessions), not on Windows, which confirms it is a Qt platform-layer bug, not a QET bug.

Summary table:

Date range    Cores    Crash site    Root cause
May 22–24    7    Qt5Gui+0x49af60 QRegion::begin()    use-after-free in crossrefitem.cpp
May 22–23    12    WaylandClient / XcbQpa    old spinbox/wheel Qt platform bug
The priority fix is Bug 1 — it is a regression introduced by the recent terminal-name display work and affects normal diagram editing on all platforms.

Hi all,

Following the previous work on terminal name display in cross-references, I've added a new option to disable this feature per xref type, as Achim had recommended.

A new checkbox "Show terminal numbers in Xrefs" (Show terminal names in Xrefs) has been added to the XRef properties widget, in the main display group — so it is available in both Cross and Contacts modes.

When unchecked, terminal names are hidden in all rendering paths:
- drawContact() — Contacts mode (NO/NC/SW symbols)
- fillCrossRef() — Cross mode (NO and NC columns)
- setUpCrossBoundingRect() — Cross mode (bounding rect sizing)

The new boolean property 'showTerminalName' (default: true) is fully persisted in XML and QSettings, so existing project files are not affected (backward compatible).

Also included in the same patch series: a fix for power contact terminal pairing in Contacts mode. The previous alphanumeric sort was breaking consecutive-pair grouping for terminals named L1,L2,L3,T1,T2,T3 — pole 0 was showing L1/L2 instead of L1/T1. Terminal names are now used in declaration order from the element editor; users must declare pairs consecutively (e.g. L1,T1,L2,T2,L3,T3).

Files changed:
- sources/properties/xrefproperties.h
- sources/properties/xrefproperties.cpp
- sources/ui/xrefpropertieswidget.ui
- sources/ui/xrefpropertieswidget.cpp
- sources/qetgraphicsitem/crossrefitem.cpp

Joshua, Achim, plc-user, Kellermorph — thoughts?

crossrefitem: fix terminal name sorting for power contacts

The previous sort used QString::toInt() to order terminal names,
which returns 0 for any string containing a non-numeric prefix
(e.g. "R1", "R2", "L1", "L2"...). This caused undefined sort order
and incorrect pole pairing in the Xref contact mirror.

Example: a 4-pole NC power contact with terminals R1..R8 was
displaying R1/R3, R5/R7, R2/R4, R6/R8 instead of the correct
R1/R2, R3/R4, R5/R6, R7/R8.

Fix: extract the trailing numeric part of each terminal name and
compare prefixes separately. If both names share the same prefix
and both have a trailing number, sort numerically on that number;
otherwise fall back to full string comparison.

This covers all naming conventions: "1"/"2"/"3", "R1"/"R2"/"R3",
"L1"/"L2"/"L3", etc.

Applied in both drawContact() and setUpCrossBoundingRect().
https://download.qelectrotech.org/qet/forum_img_2/max_slave_contacts_box9.png


Edit : wrong pictures. nomicons/smiley-green done

Additional fix pushed today: crossrefitem: fix SIGSEGV when dropping a power NC contact on the folio

A reproducible crash (SIGSEGV in QRegion::begin) occurred as soon as a power NC slave element was placed on a folio, even before linking it to a master element.

Three bugs were found and fixed in crossrefitem.cpp:

1. m_drawing (QPicture) was never reset between updateLabel() calls.
QPicture accumulates paint commands — calling qp.begin() on an existing QPicture appends to it rather than replacing its content. After several updates (load, move, hover...) the picture became corrupted and crashed on play().
Fix: reset m_drawing = QPicture() at the start of updateLabel().

2. m_drawed_contacts was only initialized to 0 in drawAsContacts(), but not in drawAsCross().
When drawing in Cross mode, fillCrossRef() called drawContact() with an uninitialized m_drawed_contacts value, producing a garbage offset. The NC contact symbol uses drawPolyline() with a sub-pixel Y coordinate (offset+2.5); with a random offset Qt generated an invalid QRegion and crashed.
This explains why NC contacts crashed but NO contacts did not: the NO symbol only uses drawLine() which is more tolerant of bad coordinates.
Fix: add m_drawed_contacts = 0 at the start of drawAsCross().

3. setUpCrossBoundingRect() used QRectF() (null rect) as the reference rect for painter.boundingRect(), which can return invalid dimensions. Additionally, height was accumulated incorrectly: united() + setHeight() doubled the height at each iteration, causing an exponentially growing bounding rect with multiple contacts.
Fix: use QRectF(0, 0, 500, 20) as reference rect and accumulate height and width independently.

Only crossrefitem.cpp was modified.

https://download.qelectrotech.org/qet/forum_img_2/max_slave_contacts_box7.png

Is your element a power element?
See my contactor power element.

@Kellermorph:

Yes, it’s a lot of work, but everything is scripted and all I have to do is wait for the machine to finish compiling and packaging it; however, it takes a bit of time, and you need powerful machines that can compile QET in under 90 seconds, like my old Threadripper 3960X with 24 cores and 48 threads.  Thank you to everyone who helped me buy this workstation in 2020 through their donations.

-> Workstation build 2020
Funding for a new build machine 2019

https://download.qelectrotech.org/qet/scorpio/threadripper/3960x.jpg
https://download.qelectrotech.org/qet/scorpio/threadripper/3960x-1.jpg

FYI, we have now two CI/CD one for snap but in edge channel, and Windows CI/CD github action pushed by me, and we wait to signpath.io mail for valid or cancel signing job before upload Installer, Ready-to-use and MSI to https://qelectrotech.github.io/qelectro … ce-mirror/

By the way I launch my packaging script to packages Debian stable and unstable deb, make PPA Upload, after I launch macOS KVM/Qemu VM for bundle Intel dmg, Open AppImage VM and build new AppImage, I open flatpak VM and build new flatpak.

After I launch my mac Mini M2 for build dmg signed and notarised for macOS Apple silicon, after I launch my Raspery Py 5 for build AppImage for aarch64 Linux.

Built with Qt 5.15.13 - x86_64 - Date : May 22 2026 : 09:36:52 so I pushed PR this night very late, build some packages and go to bed.. now I continu to packages other

QElectroTech V 0.100.1-dev
Compilation : GCC 15.2.0
Built with Qt 5.15.17 - x86_64 - Date : May 23 2026 : 00:14:25

See log and check the version git hash.
You use my PPA or snap, for snap I don't deploy it to stable channel yet.
Or you use my Debian deb repository?

Kellermorph wrote:

I installed the new update that was offered to me via Discover.
I don't see the new selection of connections in the component editor. Also, for a 3-pole normally open contact, it still only shows 1 and 3, and yes, the program is now crashing more often for me in the component editor.

Hello Thomas, can’t you see the new option in the editor for terminals?

As for the crashes in the element editor, I’ve noticed that I can cause the programme to crash by quickly changing the size of a static text input field using the mouse wheel. I can reproduce this even on older versions such as 0.7, 0.8, 0.9... I’ve checked on my Windows 10 virtual machine running the latest MSI installer, but I can’t reproduce this crash.

In older projects, the `terminal_name` tag does not exist; consequently, terminal numbers will not be displayed.
@Achim: you could share an little sample?
What you using list mode or cross for XREFs?
I use only list mode, I hate cross.

But I’ve discovered a reproducible crash:

However, a reproducible crash occurs in the element editor when editing static text size spinbox; clicking rapidly on the size selection spin box whilst hovering over it with the mouse wheel to quickly scroll through the drop-down list in order to rapidly decrease or increase the value causes the application to crash.

This bug was very old I can crash old: 0.9, 08, 07 appImages...


4618.563460] qelectrotech[180110]: segfault at 0 ip 00007f43d435cac0 sp 00007ffd6d6b9380 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7f43d4310000+a8000] likely on CPU 9 (core 12, socket 0)
[54618.563475] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[55407.159955] qelectrotech[289531]: segfault at 0 ip 00007f1ff6b5cac0 sp 00007ffe3bc56f70 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7f1ff6b10000+a8000] likely on CPU 15 (core 20, socket 0)
[55407.159971] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[55878.824942] qelectrotech[294763]: segfault at 0 ip 00007fdf7c317ac0 sp 00007fff4c4833c0 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7fdf7c2cb000+a8000] likely on CPU 40 (core 21, socket 0)
[55878.824959] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[55926.713745] qelectrotech[295041]: segfault at 0 ip 00007f36b9f5cac0 sp 00007ffe2f9c84e0 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7f36b9f10000+a8000] likely on CPU 17 (core 22, socket 0)
[55926.713760] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[56039.003506] qelectrotech[295419]: segfault at 0 ip 00007f391635cac0 sp 00007ffde0a72510 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7f3916310000+a8000] likely on CPU 15 (core 20, socket 0)
[56039.003522] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[62132.993660] qelectrotech[370775]: segfault at 0 ip 00007f473455cac0 sp 00007ffe223d3de0 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7f4734510000+a8000] likely on CPU 16 (core 21, socket 0)
[62132.993676] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[62177.491767] qelectrotech[370978]: segfault at 0 ip 00007f45f55e0ac0 sp 00007ffe5fcedef0 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7f45f5594000+a8000] likely on CPU 15 (core 20, socket 0)
[62177.491782] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[63808.277931] qelectrotech[374595]: segfault at 0 ip 00007f1538f5cac0 sp 00007ffd50716220 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7f1538f10000+a8000] likely on CPU 15 (core 20, socket 0)
[63808.277947] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[64010.287344] qelectrotech[376296]: segfault at 0 ip 00007f6862b5cac0 sp 00007ffe2af56ef0 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7f6862b10000+a8000] likely on CPU 15 (core 20, socket 0)
[64010.287360] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[64259.990010] qelectrotech[378588]: segfault at 0 ip 00007f863915cac0 sp 00007ffc45c147c0 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7f8639110000+a8000] likely on CPU 16 (core 21, socket 0)
[64259.990028] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[66222.289237] qelectrotech[381720]: segfault at 0 ip 00007f21cd55cac0 sp 00007ffed7756630 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7f21cd510000+a8000] likely on CPU 15 (core 20, socket 0)
[66222.289251] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[67221.833917] qelectrotech[384539]: segfault at 0 ip 00007fcb6e9edac0 sp 00007ffee8437890 error 4 in libQt5WaylandClient.so.5.15.17[b1ac0,7fcb6e9a1000+a8000] likely on CPU 15 (core 20, socket 0)
[67221.833932] Code: 4c 89 d6 4c 8d 2c 85 00 00 00 00 4a 8d 7c 15 00 48 29 ee 0f 1f 80 00 00 00 00 4c 89 c9 31 d2 66 66 2e 0f 1f 84 00 00 00 00 00 <0f> b6 44 16 01 45 0f b6 64 12 01 48 83 c1 04 41 c1 e4 08 c1 e0 10
[67436.543199] qelectrotech[385262]: segfault at 0 ip 00007ff13359e7b0 sp 00007ffcad687ff0 error 4 in libQt5XcbQpa.so.5[b67b0,7ff133518000+8e000] likely on CPU 15 (core 20, socket 0)
[67436.543214] Code: 8b 54 24 28 4c 29 f6 4c 01 f7 48 8d 1c 95 00 00 00 00 0f 1f 84 00 00 00 00 00 4e 8d 04 36 4c 89 d1 31 d2 85 ed 74 36 0f 1f 00 <0f> b6 44 16 01 45 0f b6 7c 10 01 48 83 c1 04 41 c1 e7 08 c1 e0 10
[67484.866151] qelectrotech[385406]: segfault at 0 ip 00007fe18ff9e7b0 sp 00007ffe0092fa20 error 4 in libQt5XcbQpa.so.5[b67b0,7fe18ff18000+8e000] likely on CPU 39 (core 20, socket 0)
[67484.866166] Code: 8b 54 24 28 4c 29 f6 4c 01 f7 48 8d 1c 95 00 00 00 00 0f 1f 84 00 00 00 00 00 4e 8d 04 36 4c 89 d1 31 d2 85 ed 74 36 0f 1f 00 <0f> b6 44 16 01 45 0f b6 7c 10 01 48 83 c1 04 41 c1 e7 08 c1 e0 10
[67556.962754] qelectrotech[385588]: segfault at 0 ip 00007f8fb2603380 sp 00007ffc187a3c50 error 4 in libQt5XcbQpa.so.5[e2380,7f8fb2559000+dc000] likely on CPU 15 (core 20, socket 0)
[67556.962768] Code: 48 89 fe 45 0f b7 f2 48 89 c3 49 c1 e6 02 4c 29 e6 4c 01 e7 66 0f 1f 44 00 00 4e 8d 0c 26 48 89 d9 31 d2 45 85 c0 74 35 66 90 <0f> b6 44 16 01 45 0f b6 6c 11 01 48 83 c1 04 41 c1 e5 08 c1 e0 10
[67656.520957] qelectrotech[385802]: segfault at 0 ip 00007f441494d380 sp 00007ffefee6f8d0 error 4 in libQt5XcbQpa.so.5[e2380,7f44148a3000+dc000] likely on CPU 6 (core 8, socket 0)
[67656.520973] Code: 48 89 fe 45 0f b7 f2 48 89 c3 49 c1 e6 02 4c 29 e6 4c 01 e7 66 0f 1f 44 00 00 4e 8d 0c 26 48 89 d9 31 d2 45 85 c0 74 35 66 90 <0f> b6 44 16 01 45 0f b6 6c 11 01 48 83 c1 04 41 c1 e5 08 c1 e0 10
[68184.980531] qelectrotech[386496]: segfault at 0 ip 00007f8e598bc398 sp 00007ffda42c0dc0 error 4 in libQt5XcbQpa.so.5[bc398,7f8e59800000+14e000] likely on CPU 15 (core 20, socket 0)
[68184.980545] Code: 95 00 00 00 00 48 89 cd 66 2e 0f 1f 84 00 00 00 00 00 49 89 fa 31 c9 4c 89 de 4d 29 f2 45 85 c0 4e 8d 0c 37 74 36 0f 1f 40 00 <41> 0f b6 44 0a 01 48 83 c6 04 c1 e0 10 89 c2 41 0f b6 44 09 01 0d
[68255.801243] qelectrotech[386764]: segfault at 0 ip 00007ff1778cec68 sp 00007fff20112550 error 4 in libQt5XcbQpa.so.5[cec68,7ff177800000+194000] likely on CPU 15 (core 20, socket 0)
[68255.801258] Code: 4d 63 ed 48 c1 e0 02 49 89 c7 0f 1f 84 00 00 00 00 00 49 89 fb 31 c9 4c 89 e6 4d 29 eb 45 85 c0 4e 8d 0c 2f 74 36 0f 1f 40 00 <41> 0f b6 44 0b 01 48 83 c6 04 c1 e0 10 89 c2 41 0f b6 44 09 01 0d

Edit : libQt5WaylandClient.so.5.15.17, libQt5XcbQpa.so.5 so only reproductible on Debian Sid?

Hi all,

Following the previous commit that displays terminal names on contact symbols in Xref (both Contact and Cross modes), I've been working on extending the feature to power contacts and switch (SW) contacts.

Here is what has been implemented:

**Power contacts (e.g. 3-pole contactor, 6 terminals)**

Cross mode: all terminals are collected and sorted numerically → [1-2-3-4-5-6] P1-H9
Contacts mode: each pole displays its own pair:
- Pole 1 → 1 (left) / 2 (right)
- Pole 2 → 3 (left) / 4 (right)
- Pole 3 → 5 (left) / 6 (right)

**SW contacts with typed terminals**

To solve the ambiguity of SW contacts (which appear in both NO and NC columns), TerminalData::Type has been extended with three new semantic values:

  enum Type { Generic, Inner, Outer, No, Nc, Common };

Users can now assign a role to each terminal of a SW element directly in the element editor (new entries in the Type combobox: "NO (contact SW)", "NC (contact SW)", "Commun (contact SW)").

Once typed, the Xref displays the correct pair per column:
- NO column: NO + Common pair, e.g. [14-13]
- NC column: NC + Common pair, e.g. [12-13]
- Contacts mode: NO top-left, NC bottom-left, Common right

Elements without explicit terminal types fall back to the previous behavior (first 2 named terminals) — fully backward compatible.

This change affects:
- terminaldata.h / terminaldata.cpp — new enum values + serialization
- terminal.h / terminal.cpp — new public terminalType() accessor
- terminaleditor.cpp — new entries in the type combobox + pre-existing bug fix in updateForm()
- crossrefitem.cpp — filtering by type in Cross and Contacts modes

Joshua, Achim, plc-user, Kellermorph — what do you think?

https://download.qelectrotech.org/qet/forum_img_2/max_slave_contacts_box6.png
https://download.qelectrotech.org/qet/forum_img_2/max_slave_contacts_box4.png
https://download.qelectrotech.org/qet/forum_img_2/max_slave_contacts_box5.png


EDIT: Pushed to the master branch and compiled the main packages.

Kellermorph wrote:

i think yes.
because in this Picture Bildschirmfoto_20260522_202722.png  you can see, that the Contactsnumbers that are visible are completly wrong.

Hum, ok!
For now we search only terminals: [0] [1] [2] so it's wrong for power element with 6 terminals like this capture.
https://download.qelectrotech.org/qet/forum_img_2/max_slave_contacts_box3.png

So

scorpio810 wrote:

The proper solution is to use TerminalData::Type and add the missing values:


Thus, in the .elmt file, each terminal has its explicit role, independent of the order. And in crossrefitem.cpp we filter:

enum Type {
    Generic,
    Inner,
    Outer,
    No,      // ← new
    Nc,      // ← new
    Common   // ← new
};

NO side → terminals of type No + Common
NC side → terminals of type Nc + Common

This change affects:
terminaldata.h — add the values to the enum
terminaldata.cpp — typeToString / typeFromString
The element editor — UI for selecting the type
crossrefitem.cpp — filter by type

What do you think about this change?

@Kellermorph: For the time being, I don’t plan to include the terminal numbers for the power contacts – is that useful, I think no?

kellermorph wrote:

For a changeover contact, contact 11 isn’t displayed as a terminal contact, and for a 3-pole normally open contact, only 2 terminal numbers are shown, and these keep repeating. The other 4 are left out.

What do you think when you wrote to :The other 4 are left out?
You ask for like an 4 changeover contact?

https://download.qelectrotech.org/qet/forum_img_2/TN-S-system-4-pole-wiring-schematic-showing-separate-neutral-and-protective-earth-conductors.webp

Like 4 positions switch, mercury switch 4 terminals?
https://download.qelectrotech.org/qet/forum_img_2/Engineering-Electrical-Design-Elements-Switches-and-Relays.png
https://download.qelectrotech.org/qet/forum_img_2/How-to-Wire-Automatic-Manual-Changeover-Transfer-Switch-Single-Three-Phase.webp

Can you test this patch?
last captures is based on!; or I push it?
https://qelectrotech.org/forum/misc.php … download=1

Hi all,

Following the recent commit that displays terminal names on contact symbols in Xref Contact mode, I've been working on extending the same feature to Cross mode.

The implementation is straightforward: for each slave element in the NO and NC columns, we prepend the terminal names as "[13-14] 1-C3" inline with the position text. The cross width is recalculated accordingly.

However, we ran into a fundamental limitation with switch contacts (SW):

A SW element appears in both the NO and NC columns. With the current approach of simply taking the first 2 named terminals, both sides display the same label (e.g. [12-13]), which is incorrect — the NO side should show the NO+common pair and the NC side the NC+common pair.

The core problem is that the order of terminals in the XML depends entirely on how the user built the element in the editor. There is no guaranteed convention like [0]=NO, [1]=common, [2]=NC.

Two possible approaches to discuss:

1. Simple convention (user responsibility)
Keep the current implementation (first 2 named terminals) and document that users must name and order their terminals correctly in the element editor. This is consistent with what I'm stated: "Users are expected to name their own terminals in the element editor." Simple, no breaking changes, works perfectly for NO/NC classics (13-14, 23-24, 11-12, 21-22...).

2. Extend TerminalData::Type enum
Add semantic types to TerminalData:

   enum Type { Generic, Inner, Outer, No, Nc, Common };

This would allow crossrefitem to filter terminals by role regardless of their order in the XML:
- NO column: show terminals typed No + Common
- NC column: show terminals typed Nc + Common

This requires changes to terminaldata.h, terminaldata.cpp (typeToString/typeFromString), the element editor UI, and crossrefitem.cpp. More work, but the only truly robust solution for SW contacts.

Thoughts? Is option 2 worth pursuing, or is option 1 acceptable given that SW contacts with named terminals are an edge case?

The current patch (option 1) is working well for standard NO/NC contacts and is ready to submit if the all in the team agrees with the approach.


The proper solution is to use TerminalData::Type and add the missing values:


Thus, in the .elmt file, each terminal has its explicit role, independent of the order. And in crossrefitem.cpp we filter:

enum Type {
    Generic,
    Inner,
    Outer,
    No,      // ← new
    Nc,      // ← new
    Common   // ← new
};

NO side → terminals of type No + Common
NC side → terminals of type Nc + Common

This change affects:
terminaldata.h — add the values to the enum
terminaldata.cpp — typeToString / typeFromString
The element editor — UI for selecting the type
crossrefitem.cpp — filter by type

Joshua, Achim, plc-user, kellermorph,what do you think about?


Latest patch for cross.

https://download.qelectrotech.org/qet/forum_img_2/number_of%20contact%20in_report_XREfs2.png
https://download.qelectrotech.org/qet/forum_img_2/number_of%20contact%20in_report_XREfs3.png

https://github.com/qelectrotech/qelectr … r/pull/464

Kellermorph wrote:

New element for wire definition.
Advantages: It doesn't create an open end like a sheet reference, and I can filter it out of the wiring diagram in the subsequent pull request to prevent incorrect connections from being displayed, unlike with the sheet reference.

scorpio810 wrote:
scorpio810 wrote:

crossrefitem: display terminal names on contact symbols in Xref
When a slave element has named terminals in its element definition
(.elmt), the terminal names (e.g. 13/14 for NO, 11/12 for NC,
12/13/14 for SW) are now displayed on each side of the contact
symbol in the cross-reference view.

- NO/NC contacts: name[0] on the left, name[1] on the right
- SW contacts: name[0] (NO) top-left, name[1] (common) top-right,
  name[2] (NC) bottom-left

Terminal names are read from Terminal::name() which is populated
from TerminalData::m_name during element parsing. If terminals are
not named, nothing is displayed (fully backward compatible).

Users are expected to name their own terminals in the element
editor to avoid duplicating elements in the official collection.

https://github.com/qelectrotech/qelectr … 86b0ce2636

scorpio810 wrote:

crossrefitem: display terminal names on contact symbols in Xref
When a slave element has named terminals in its element definition
(.elmt), the terminal names (e.g. 13/14 for NO, 11/12 for NC,
12/13/14 for SW) are now displayed on each side of the contact
symbol in the cross-reference view.

- NO/NC contacts: name[0] on the left, name[1] on the right
- SW contacts: name[0] (NO) top-left, name[1] (common) top-right,
  name[2] (NC) bottom-left

Terminal names are read from Terminal::name() which is populated
from TerminalData::m_name during element parsing. If terminals are
not named, nothing is displayed (fully backward compatible).

Users are expected to name their own terminals in the element
editor to avoid duplicating elements in the official collection
.

Ps: it's work on list mode not in cross XREFs
BTW for checting I enter hazardus terminal name in this capture: joke! nomicons/smiley-green

Enjoy! nomicons/wink

Another step is to control you can't linked an antother slave contact if terminal_name was already into the list.
I don’t think it’s necessary to include the names of power contacts on this list, like contactors..



https://download.qelectrotech.org/qet/forum_img_2/number_of%20contact%20in_report_XREfs.png

25

(11 replies, posted in Platform-specific problems: Windows,)

✅ SignPath integration — MSI signed automatically
✅ Unique ProductCode per build based on the Git SHA
✅ FIX MajorUpgrade triggers correctly — a single entry in Settings remove programs

Roadmap :

Await the EV certificate from the SignPath Foundation
Change test-signing to release-signing in windows-msi.yml
Add the SignPath signature to windows-build.yml for the NSIS .exe and Ready-To-Use
Configure the NSIS project in SignPath