Skip to content

Add qtpy+PySide6 UI compatibility test; fix duplicate widget names#132

Draft
Max Rakitin (mrakitin) wants to merge 1 commit intouse-qtpyfrom
fix-qtpy-ui-support
Draft

Add qtpy+PySide6 UI compatibility test; fix duplicate widget names#132
Max Rakitin (mrakitin) wants to merge 1 commit intouse-qtpyfrom
fix-qtpy-ui-support

Conversation

@mrakitin
Copy link
Copy Markdown
Contributor

That's something copilot came up with. Need to test at the beamline.


  • Add isstools/ui/test_ui_compat.py: headless offscreen script that loads every .ui file with qtpy.uic.loadUiType (PySide6 backend) and reports pass/fail. Must be run via 'pixi run python isstools/ui/test_ui_compat.py' so pyside6-uic is on PATH.

  • Fix ui_xlive.ui: rename second 'horizontalLayoutWidget_7' → 'horizontalLayoutWidget_7b' and second 'horizontalLayoutWidget_11' → 'horizontalLayoutWidget_11b'. pyside6-uic (Qt6) rejects duplicate object names; PyQt5 uic was lenient.

  • Fix ui_sample_manager.ui: rename second 'groupBox' → 'groupBox_2' for the same reason.

All 34 .ui files now load cleanly: 34 passed, 0 failed.

- Add isstools/ui/test_ui_compat.py: headless offscreen script that loads
  every .ui file with qtpy.uic.loadUiType (PySide6 backend) and reports
  pass/fail. Must be run via 'pixi run python isstools/ui/test_ui_compat.py'
  so pyside6-uic is on PATH.

- Fix ui_xlive.ui: rename second 'horizontalLayoutWidget_7' → 'horizontalLayoutWidget_7b'
  and second 'horizontalLayoutWidget_11' → 'horizontalLayoutWidget_11b'.
  pyside6-uic (Qt6) rejects duplicate object names; PyQt5 uic was lenient.

- Fix ui_sample_manager.ui: rename second 'groupBox' → 'groupBox_2'
  for the same reason.

All 34 .ui files now load cleanly: 34 passed, 0 failed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@mrakitin
Copy link
Copy Markdown
Contributor Author

Max Rakitin (mrakitin) commented May 6, 2026

Before the fix:

18:51 $ pixi run python isstools/ui/test_ui_compat.py
OK    ui_batch.ui
OK    ui_batch_automated.ui
OK    ui_batch_manual.ui
OK    ui_beamline_setup.ui
OK    ui_camera.ui
OK    ui_emission_energy_selector.ui
OK    ui_emission_energy_selector_no_optics.ui
OK    ui_energy_selector.ui
OK    ui_energy_selector_with_periodic_table.ui
OK    ui_energy_selector_without_e0.ui
OK    ui_info_beamline.ui
OK    ui_info_general.ui
OK    ui_info_shutters.ui
OK    ui_johann_spectrometer.ui
OK    ui_motor_widget.ui
OK    ui_motor_widget_compact.ui
OK    ui_pilatus.ui
OK    ui_plan_queue.ui
OK    ui_plan_queue_v2.ui
OK    ui_processing.ui
OK    ui_run.ui
Error while compiling the generated Python file
FAIL  ui_sample_manager.ui: cannot unpack non-iterable NoneType object
OK    ui_sample_positioner.ui
OK    ui_sample_registry.ui
OK    ui_scan_manager.ui
OK    ui_sdd_manager.ui
OK    ui_spectrometer.ui
OK    ui_spectrometer_R.ui
OK    ui_spectrometer_motors.ui
OK    ui_trajectory_manager.ui
OK    ui_tutorial.ui
OK    ui_user_manager.ui
OK    ui_xia_manager.ui
Error while compiling the generated Python file
FAIL  ui_xlive.ui: cannot unpack non-iterable NoneType object

Results: 32 passed, 2 failed out of 34 files.

@mrakitin
Copy link
Copy Markdown
Contributor Author

After the fix:

18:53 $ pixi run python isstools/ui/test_ui_compat.py
OK    ui_batch.ui
OK    ui_batch_automated.ui
OK    ui_batch_manual.ui
OK    ui_beamline_setup.ui
OK    ui_camera.ui
OK    ui_emission_energy_selector.ui
OK    ui_emission_energy_selector_no_optics.ui
OK    ui_energy_selector.ui
OK    ui_energy_selector_with_periodic_table.ui
OK    ui_energy_selector_without_e0.ui
OK    ui_info_beamline.ui
OK    ui_info_general.ui
OK    ui_info_shutters.ui
OK    ui_johann_spectrometer.ui
OK    ui_motor_widget.ui
OK    ui_motor_widget_compact.ui
OK    ui_pilatus.ui
OK    ui_plan_queue.ui
OK    ui_plan_queue_v2.ui
OK    ui_processing.ui
OK    ui_run.ui
OK    ui_sample_manager.ui
OK    ui_sample_positioner.ui
OK    ui_sample_registry.ui
OK    ui_scan_manager.ui
OK    ui_sdd_manager.ui
OK    ui_spectrometer.ui
OK    ui_spectrometer_R.ui
OK    ui_spectrometer_motors.ui
OK    ui_trajectory_manager.ui
OK    ui_tutorial.ui
OK    ui_user_manager.ui
OK    ui_xia_manager.ui
OK    ui_xlive.ui

Results: 34 passed, 0 failed out of 34 files.

@mrakitin
Copy link
Copy Markdown
Contributor Author

By the way, I've ran the same script, but with the PyQt5 within 2025-3.0-py312-tiled conda env, and it passed in the both cases. It looks like the pyside6 version is stricter with non-unique names of the widgets.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant