QtEDM Reference Manual

Robert Soliday

March 2026

Advanced Photon Source

Argonne National Laboratory

Contents

Introduction

Relationship to MEDM

Requirements

Command Line

Modes of Operation

Supported Widgets

Environment Variables

ADL Files

Features

Differences from MEDM

Building QtEDM

Acknowledgments

Technical Support

Copyright

Introduction

QtEDM (Qt Editor and Display Manager) is a modern Qt5-based reimplementation of MEDM, the classic Motif Editor and Display Manager for EPICS control systems. QtEDM provides a graphical user interface for designing and operating control screens that interact with EPICS process variables through Channel Access.

Like MEDM, QtEDM uses ADL (ASCII Display List) files to define displays. These files describe the layout, appearance, and behavior of graphical objects that present and/or modify EPICS process variables. Typical widgets include buttons, meters, sliders, text fields, strip charts, Cartesian plots, and QtEDM-specific extensions such as expression channels.

QtEDM operates in two modes:

Relationship to MEDM

QtEDM is designed as a drop-in replacement for MEDM for the standard MEDM ADL feature set. It reads and writes the same core ADL format, while also supporting a small number of QtEDM-only extensions. The primary differences are:

Both MEDM and QtEDM are built from the same source repository and share the same overall display-model lineage, which keeps the common ADL subset compatible between the two implementations while still allowing QtEDM to add new block types for QtEDM-only widgets.

Requirements

QtEDM requires the following:

QtEDM is primarily developed and tested on Linux. The program should build on other Unix-like systems with Qt5 support.

Command Line

QtEDM can be executed from the command line in the general form:

qtedm [options] [display-files]

Options are:

Option Description
-help, -h, -? Display usage information and exit
-version Display version information and exit
-x Start in EXECUTE mode (default is EDIT mode)
-local Run in local mode (default)
-attach Attach to an existing QtEDM instance
-cleanup Clean up shared resources from previous instances
-macro "xxx=aaa,yyy=bbb,..." Define macro substitutions for PV names
-dg geometry Specify display geometry (WxH+X+Y format)
-displayFont alias|scalable Select font mode: alias (MEDM-compatible) or scalable
-noMsg Do not raise the message window on startup
-nolog Disable audit logging of control widget value changes
-bigMousePointer Use a larger mouse pointer for accessibility
-cmap Use a private colormap (compatibility option)

Examples

Start QtEDM with a display in execute mode:

qtedm -x main.adl

Start with macro substitutions:

qtedm -x -macro "P=ioc1:,R=motor1" motor.adl

Open multiple displays:

qtedm -x display1.adl display2.adl display3.adl

Remote Display via SSH

When running QtEDM over an SSH connection with X11 forwarding, it is highly recommended to use the -C option to enable compression. This significantly improves display update performance and provides a smoother experience, especially when monitoring rapidly changing process variables.

ssh -C -X user@host
qtedm -x display.adl

The -C option compresses all data sent over the SSH connection, which reduces the bandwidth required for X11 protocol traffic. Without compression, high-frequency widget updates can overwhelm the connection and cause sluggish or jerky display behavior.

Modes of Operation

EDIT Mode

In EDIT mode, QtEDM functions as a display editor. You can:

The Object Palette provides access to all available widget types. Click on a widget type, then click and drag on the display to create a new widget.

EXECUTE Mode

In EXECUTE mode, QtEDM connects to EPICS and displays live process variable data. Widgets become interactive:

To switch between modes, use the Edit menu or press Ctrl+E (toggle Edit mode) or Ctrl+X (toggle Execute mode).

Supported Widgets

QtEDM supports the complete MEDM widget set plus QtEDM-specific extensions. The sections below expand the brief object list into a practical reference: what each widget is for, the properties that matter most, and a representative screenshot.

The screenshots in this section were captured from dedicated documentation ADL example files in docs/images/adl. Most are rendered in EDIT mode; monitor examples that need live state coloring may be captured in EXECUTE mode using local soft-PV fixtures. They are intended to show geometry, styling, labeling, and available variants in a reproducible way.

Common Widget Concepts

Graphics: Rectangle, Oval, Arc, Line, Polyline, Polygon, Text, Image, Composite

Monitors: Text Monitor, Expression Channel, Bar Monitor, Thermometer, Byte Monitor, LED Monitor, Heatmap, PV Table, Waveform Table, Waterfall Plot, Scale Monitor, Meter, Strip Chart, Cartesian Plot

Controllers: Text Entry, Text Area, Slider, Wheel Switch, Choice Button, Menu, Message Button, Related Display, Shell Command

Graphics

Rectangle

Rectangle widget examples in QtEDM

Rectangle examples showing filled, outlined, dashed, and dynamically visible variants.

Rectangles are the basic building block for panels, frames, alarm tiles, background fills, and simple status regions. In EXECUTE mode they are monitor-only; any behavior comes from dynamic color or visibility rules.

Oval

Oval widget examples in QtEDM

Oval examples showing circles, stretched ellipses, and outline versus filled styles.

Ovals provide circular or elliptical graphics with the same styling model as rectangles. They are commonly used for lamps, indicator bodies, and schematic symbols that should respond to process state.

Arc

Arc widget examples in QtEDM

Arc examples covering open arcs, pie-slice fills, angle ranges, and dynamic variants.

Arcs draw partial ellipses. They can be open outlines or filled wedge-style shapes and are useful for gauges, directional annotations, and process diagrams that need something more specific than a full oval.

Line

Line widget examples in QtEDM

The documentation example shows straight line segments with default and dashed styles.

Use a Line when you need a straight connection segment, pointer, or border detail. A simple line is the two-point case of the polyline data model, so line and polyline styling stay consistent.

Polyline

Polyline widget examples in QtEDM

The documentation example shows multi-segment polyline paths with default and dashed styles.

Polylines are connected line segments with arbitrarily many vertices. They are the right choice for piping runs, beam lines, and other paths that must bend without becoming filled areas.

Polygon

Polygon widget examples in QtEDM

Polygon examples showing filled and outlined multi-sided shapes across several vertex layouts.

Polygons represent closed multi-sided shapes. They are useful for arrows, custom equipment outlines, filled regions with irregular boundaries, and symbols that cannot be expressed as rectangles or ovals.

Text

Text widget examples in QtEDM

Static text examples covering alignment, font sizes, labels, and decorative uses.

Text widgets provide static labels, titles, engineering notes, and screen annotations. They are not tied to PV updates and are intended for fixed wording that helps operators interpret the rest of the display.

Image

Image widget examples in QtEDM

Image examples showing file-backed graphics, scaling, and animated/static image usage.

The Image widget displays file-backed graphics such as GIFs and other Qt image formats. It is useful for logos, equipment symbols, and any case where a drawn primitive would be too limited.

Composite

Composite widget examples in QtEDM

The graphics example includes a composite containing child widgets that move and render as one object.

A Composite groups multiple child widgets into a single higher-level object. This is useful when a display repeatedly reuses the same local assembly of labels, indicators, and controls.

Monitors

Text Monitor

Text Monitor widget examples in QtEDM

Text Monitor examples showing numeric formatting, string readback, alignment, and alarm-driven color changes.

Text Monitor is the standard readback widget for scalar or string PVs. It displays the current value as text and can format the value for operator readability without allowing writes.

Expression Channel

Expression Channel is a QtEDM-only logical monitor widget that evaluates an EPICS calc expression over up to four input channels and publishes the result as a process-local soft PV. In EDIT mode it appears as a compact labeled rectangle so it can be selected and configured. In EXECUTE mode it becomes invisible and runs only as a calculation/publishing node.

Bar Monitor

Bar Monitor widget examples in QtEDM

Bar Monitor examples covering horizontal and vertical bars, different scales, and color modes.

Bar Monitor turns a scalar PV into a filled bar graph. It is one of the clearest ways to show level, percentage, position, or any value that should be interpreted relative to a range.

Thermometer

Thermometer widget examples in QtEDM

Thermometer examples showing vertical fill, value overlays, and several limit configurations.

Thermometer is a QtEDM-only monitor widget that presents a scalar PV as a thermometer-style fill. It provides a more literal physical metaphor than a generic bar graph.

Byte Monitor

Byte Monitor widget examples in QtEDM

Byte Monitor examples displaying individual bits and grouped status patterns from integer PVs.

Byte Monitor breaks an integer PV into visible bit states. It is especially useful for status words, interlocks, mode fields, and hardware flags where individual bits are meaningful to operators.

LED Monitor

LED Monitor widget examples in QtEDM

LED Monitor examples showing a static lamp, an alarm-driven indicator, and a discrete multi-state indicator.

LED Monitor is a QtEDM-only compact status lamp. It is intended for cases where a single small shape should communicate connection, alarm state, or a discrete integer state more directly than a full bar, meter, or layered graphic composite.

Property Purpose
channel The PV or soft-PV driving the LED state.
colorMode static, alarm, or discrete.
shape circle, square, or rounded_square.
bezel Enables the lamp-style raised ring and highlight.
onColor / offColor Convenience colors for binary-style usage and edit-mode previews.
undefinedColor Fallback color for disconnects or out-of-range discrete states.
stateCount / stateColorN Configures the discrete color table for integer states 0 through 15.
visibilityMode, visibilityCalc, visibility channels Optional hide/show behavior matching the other dynamic widgets.
led_monitor {
  object {
    x=60
    y=110
    width=24
    height=24
  }
  monitor {
    chan="device:state"
    clr=25
    bclr=4
  }
  colorMode="discrete"
  shape="rounded_square"
  bezel=1
  stateCount=4
  stateColor0=12
  stateColor1=15
  stateColor2=33
  stateColor3=20
  undefinedColor=7
}

Heatmap

Heatmap widget example in QtEDM

Heatmap example showing the widget layout with title area, plot area, and optional profile regions.

Heatmap is a QtEDM-only 2-D array monitor. It renders a waveform or array PV as a color image and can derive the X and Y dimensions from either fixed values or additional PVs.

PV Table

PV Table is a QtEDM-only read-only monitor for a small list of related PVs. Each configured row subscribes independently and can show the row label, PV name, current value, engineering units, and alarm severity in a single compact table.

Property Description
columnsComma-separated subset of label, pv, value, units, and severity.
colorModestatic or alarm foreground coloring.
showHeadersShows or hides the table column headers.
fontSizeManual table font size using MEDM legacy font-size units. In alias font mode, QtEDM uses the nearest larger MEDM alias when available and falls back to a scalable font for larger requested sizes.
rowOne table row with a label and monitored chan.

Example ADL fragment:

pv_table {
  object { x=40 y=80 width=620 height=160 }
  "basic attribute" {
    clr=14
    bclr=4
  }
  colorMode="alarm"
  showHeaders=1
  fontSize=12
  columns="label,pv,value,units,severity"
  row {
    label="Beam Current"
    chan="BPM:CURRENT"
  }
  row {
    label="Mode"
    chan="BPM:MODE"
  }
}

Waveform Table

Waveform Table is a QtEDM-only read-only table monitor for a single waveform or array PV. It is intended for exact sample inspection: operators can see the current element values, indexes, connection state, received length, and alarm-driven foreground color without turning the waveform into a plot.

Property Description
chanWaveform, array, or scalar fallback PV to monitor.
layoutgrid, row, or column sample arrangement.
columnsGrid column count. Column layout always shows Index and Value columns.
fontSizeManual table font size using MEDM legacy font-size units. In alias font mode, QtEDM uses the nearest larger MEDM alias when available and falls back to a scalable font for larger requested sizes.
maxElementsMaximum displayed samples. A value of zero allows the runtime default limit.
indexBaseIndex labels start at zero or one.
valueFormatdefault, fixed, scientific, hex, or engineering numeric formatting.
charModestring, bytes, ascii, or numeric display for char waveforms.

Example ADL fragment:

wave_table {
  object { x=40 y=80 width=520 height=220 }
  "basic attribute" {
    clr=14
    bclr=4
  }
  chan="BPM:WAVEFORM"
  colorMode="alarm"
  showHeaders=1
  fontSize=12
  layout="grid"
  columns=8
  maxElements=256
  indexBase=0
  valueFormat="default"
  charMode="string"
}

Waterfall Plot

Waterfall Plot widget in QtEDM connected to a waveform PV

Waterfall Plot connected to a waveform PV, showing successive buffered samples rendered as a scrolling intensity image with a legend.

Waterfall Plot is a QtEDM-only monitor for waveform-versus-time data. It sits between Cartesian Plot, which shows the current waveform as traces, and Heatmap, which renders a single 2-D array. Each new waveform becomes one time slice in the rolling buffer.

Property Description
dataChannelWaveform PV. Each monitor update adds one sample to the waterfall.
countChannelOptional PV supplying the active waveform length when the array is only partially populated.
triggerChannelOptional PV used to trigger sampling of the most recent waveform update.
eraseChannelOptional PV used to clear the rolling buffer when the configured erase transition occurs.
eraseModeControls whether a zero or non-zero transition clears the buffer.
title, xLabel, yLabelPlot title and axis labels.
historyCountNumber of waveform samples retained in the rolling buffer.
scrollDirectionChooses where new samples appear: top, bottom, left, or right.
colorMap, invertGreyscaleIntensity palette selection, reusing the Heatmap color maps.
intensityScale, intensityMin, intensityMaxAuto, manual, or logarithmic intensity scaling for the image and legend.
showLegend, showGridOptional legend bar and faint axis grid overlay.
samplePeriod, unitsOptional fixed sample spacing used for time-axis labeling and data export when timestamps are not available.
foreground, backgroundColors used for labels, axes, and the plot background.

Example ADL fragment:

waterfall_plot {
  object { x=40 y=40 width=320 height=220 }
  plotcom {
    title="Beam Profile vs Time"
    xlabel="Position (mm)"
    ylabel="Time (s)"
    clr=14
    bclr=0
  }
  data { chan="BPM:WAVEFORM" }
  count { chan="BPM:NUSE" }
  trigger { chan="BPM:TRIG" }
  erase { chan="BPM:ERASE" mode="ifnotzero" }
  historyCount=200
  scrollDirection="topToBottom"
  colorMap="rainbow"
  intensityScale="auto"
  showLegend=1
  showGrid=0
  samplePeriod=0
  units="seconds"
}

Right-clicking a Waterfall Plot in EXECUTE mode adds Save Image..., Save Data..., Clear Buffer, and Reset Zoom when zoom is active.

Scale Monitor

Scale Monitor widget examples in QtEDM

Scale Monitor examples showing pointer direction, labels, and mixed geometry ranging from tiny to large.

Scale Monitor is a compact analog-style readback widget combining a ruler, tick marks, and a moving indicator. It works well when a bar monitor feels too heavy but text alone is not visual enough.

Meter

Meter widget examples in QtEDM

Meter examples showing analog needle displays, scale labeling, and size-dependent layout.

Meter presents a scalar PV as an analog dial. It is useful for displays that benefit from a familiar instrument-panel look or when operators prefer to recognize direction and magnitude from needle position.

Strip Chart

Strip Chart widget examples in QtEDM

Strip Chart examples showing multi-trace time histories, axes, and chart layout variations.

Strip Chart trends one or more PVs against time. It is the standard widget for short-term history, quick diagnostics, and operator displays that need to show whether a signal is stable, drifting, or oscillating.

Cartesian Plot

Cartesian Plot widget examples in QtEDM

Cartesian Plot examples with multiple traces, axis combinations, scatter-style displays, and overlaid lines.

Cartesian Plot is the most flexible plotting widget in QtEDM. It can show Y-only traces against sample index or true X-Y data, and it supports multiple traces with independent axis assignments.

QtEDM-only note: The text_area, heatmap, waterfall_plot, thermometer, led_monitor, and expression_channel ADL blocks are extensions implemented only in QtEDM. Legacy MEDM does not provide runtime support for these widget types, so displays that rely on them are not fully backward compatible.

Controllers

Text Entry

Text Entry widget examples in QtEDM

Text Entry examples showing editable numeric and string fields with different sizes and color modes.

Text Entry allows an operator to type a value and write it to a PV. It is the most direct control widget when precise numeric or string input matters more than constrained stepwise adjustment.

Text Area

Text Area is the multi-line companion to Text Entry. It is intended for long strings and waveform-backed text, preserving embedded line breaks while still allowing operator edits in EXECUTE mode.

Slider

Slider widget examples in QtEDM

Slider examples showing horizontal and vertical layouts, label regions, and value ranges.

Slider provides a drag-based numeric control. It is well suited to setpoints and analog adjustments where the operator thinks in terms of moving a value within a bounded range.

Wheel Switch

Wheel Switch widget examples in QtEDM

Wheel Switch examples showing digit-by-digit editing across different widths and precisions.

Wheel Switch is a precision numeric entry widget in which each digit can be incremented or decremented independently. It is ideal for control rooms where operators want explicit control over significant digits.

Choice Button

Choice Button widget examples in QtEDM

Choice Button examples with discrete states rendered as always-visible buttons in several styles.

Choice Button presents a small fixed set of states as visible buttons rather than hiding them in a drop-down. It is most useful for enum-like PVs where the operator should always see the available choices.

Menu

Menu widget examples in QtEDM

Menu examples showing compact drop-down selection for enumerated and discrete values.

Menu is the compact alternative to Choice Button. It exposes the current value in a drop-down control and is appropriate when the state list is longer or screen real estate is limited.

Message Button

Message Button widget examples in QtEDM

Message Button examples showing command-style controls with different labels and value mappings.

Message Button writes a predefined value when activated. It is the right widget for command actions such as Start, Stop, Reset, Open, Close, or acknowledgement operations.

Related Display

Related Display widget examples in QtEDM

Related Display examples showing buttons that open additional ADL screens with operator-friendly labels.

Related Display is a navigation widget rather than a direct PV writer. It opens one or more ADL files and can pass macro substitutions so downstream displays inherit the current device or subsystem context.

Shell Command

Shell Command widget examples in QtEDM

Shell Command examples showing command-launch buttons with multiple labels and action rows.

Shell Command launches external commands from a display button. It is useful for opening helper tools, diagnostic scripts, or file viewers that sit outside the ADL display itself.

Environment Variables

QtEDM uses the following environment variables:

Variable Description
EPICS_DISPLAY_PATH Colon-separated list of directories to search for ADL files
EPICS_CA_ADDR_LIST EPICS Channel Access address list
EPICS_CA_AUTO_ADDR_LIST Enable/disable automatic CA address discovery

Standard EPICS Channel Access environment variables are also used. See the EPICS documentation for details.

ADL Files

ADL (ASCII Display List) files are text files that describe display layouts. QtEDM uses the same core ADL format as MEDM and extends it with a small number of QtEDM-only block types when a display uses QtEDM-specific widgets.

An ADL file contains:

QtEDM reads ADL files created by MEDM. MEDM can read the common ADL subset written by QtEDM, but displays that use QtEDM-only extensions are not behaviorally compatible with legacy MEDM. The common file format is documented in the MEDM Reference Manual.

PV Protocol Prefix

QtEDM supports both Channel Access (CA) and PVAccess (PVA). To force PVA for a specific channel, prefix the PV name with pva://:

ADL Version Header

QtEDM writes a file header version of 40001 when any PV uses the pva:// prefix. Displays with only CA PVs are saved with version 40000. Both versions remain fully readable by QtEDM.

QtEDM-only ADL Extensions

QtEDM currently adds these widget block types beyond the legacy MEDM set:

The expression_channel block stores a local calc node that publishes a soft PV for other widgets to consume. A typical block looks like this:

expression_channel {
  object {
    x=20
    y=66
    width=120
    height=40
  }
  variable="expr:sum"
  calc="A+B"
  channelA="src:pv1"
  channelB="src:pv2"
  channelC=""
  channelD=""
  initialValue=0
  eventSignal="onAnyChange"
  clr=30
  bclr=4
  precision=3
}

Expression-channel outputs are process-local to the running QtEDM instance. Other widgets subscribe to the result by using the variable value as their ordinary channel name.

Features

Dynamic Attributes

Graphics widgets support dynamic attributes that change appearance based on PV values:

Macro Substitution

PV names can include macro references like $(P) that are replaced at runtime. This allows creating reusable displays that work with different devices.

Related Displays

Related Display widgets can open additional displays, optionally passing macro substitutions and replacing or overlaying the current display.

Expression Channels and Soft PVs

QtEDM provides expression channels as a built-in local-logic feature. An expression channel evaluates an EPICS calc expression over up to four input channels and publishes the result as a named soft PV inside the QtEDM process.

Printing

Displays can be printed using the File > Print menu. Page setup options allow configuring paper size and orientation.

PV Information

Right-click on a widget in EXECUTE mode to access PV information including connection status, current value, alarm limits, and access rights.

Differences from MEDM

While QtEDM strives for full MEDM compatibility, there are some differences:

Building QtEDM

QtEDM is built as part of the MEDM source distribution. From the repository root:

make -j4

This builds both MEDM and QtEDM. The QtEDM binary is installed to bin/<arch>/qtedm.

On a clean tree, a full build can take several minutes. If you are trying to diagnose a warning or an error and want less interleaved output, rerun the same build without -j4.

Build requirements:

The build system automatically detects Qt5 using pkg-config and configures the appropriate compiler and linker flags.

Acknowledgments

QtEDM builds upon the foundation laid by the original MEDM developers:

QtEDM was developed by Robert Soliday at Argonne National Laboratory as a modern alternative to the Motif-based MEDM, ensuring continued support for EPICS display management on contemporary Linux systems.

The EPICS community has contributed numerous bug fixes, platform ports, and suggestions that have improved both MEDM and QtEDM.

Technical Support

If you have problems, comments, or questions about QtEDM you can send them to soliday@anl.gov. If you wish to report a bug, it is essential that you send enough information for the bug to be reproduced. It would be helpful to include:

Another source of help is the EPICS Tech-Talk forum at https://epics.anl.gov/tech-talk/index.php. This page includes an archive of articles and directions for joining the forum. You may present your problem and often get practical responses from the many users of EPICS.

Copyright

Copyright © 2002 The University of Chicago, as Operator of Argonne National Laboratory.

Copyright © 2002 The Regents of the University of California, as Operator of Los Alamos National Laboratory.

QtEDM is distributed subject to a Software License Agreement found in the file LICENSE that is included with the distribution.

EPICS and Channel Access are trademarks of the University of Chicago.