diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index dd5cdfb45..2a5eeb7df 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -113,7 +113,7 @@ jobs: -DQt5_DIR=/ucrt64/lib/cmake/Qt5 \ -DQT_VERSION_MAJOR=5 \ -DCMAKE_DISABLE_FIND_PACKAGE_Qt6=ON \ - -DBUILD_TESTING=OFF \ + -DPACKAGE_TESTS=OFF \ -DCMAKE_POLICY_DEFAULT_CMP0077=NEW \ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ -DCMAKE_CXX_FLAGS="-DQET_EXPORT_PROJECT_DB" \ @@ -456,7 +456,7 @@ jobs: -DCMAKE_PREFIX_PATH=/ucrt64 \ -DQt6_DIR=/ucrt64/lib/cmake/Qt6 \ -DQT_VERSION_MAJOR=6 \ - -DBUILD_WITH_KF5=OFF \ + -DBUILD_WITH_KF=OFF \ -DPACKAGE_TESTS=OFF \ -DCMAKE_POLICY_DEFAULT_CMP0077=NEW \ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 45b539de4..6fd475abe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,19 +48,11 @@ endif() # INTERFACE_QT_MAJOR_VERSION mismatch at generate time. set(QT_DEFAULT_MAJOR_VERSION ${QT_VERSION_MAJOR} CACHE STRING "Qt version to use (5 or 6)" FORCE) -# Add sub directories -option(PACKAGE_TESTS "Build the tests" ON) -if(PACKAGE_TESTS) - message("Add sub directory tests") - add_subdirectory(tests) -endif() - include(cmake/paths_compilation_installation.cmake) include(cmake/start_options.cmake) include(cmake/developer_options.cmake) include(cmake/git_update_submodules.cmake) include(cmake/git_last_commit_sha.cmake) -include(cmake/fetch_kdeaddons.cmake) include(cmake/fetch_singleapplication.cmake) include(cmake/fetch_pugixml.cmake) include(cmake/qet_compilation_vars.cmake) @@ -78,12 +70,23 @@ find_package( ${QET_COMPONENTS} REQUIRED) -# Qt6 only creates the Qt::GuiPrivate target (used for QPdfEngine::drawHyperlink) -# when the GuiPrivate component is explicitly requested. Qt5 has no such -# component package and creates the target implicitly with Gui, so only -# request it on Qt6 - requesting it on Qt5 fails the whole configure. +# (QPdfEngine::drawHyperlink) needs Qt's private GUI module. +# Qt >= 6.7 ships it as a proper find_package component, but some distro +# packages (e.g. Ubuntu's qt6-base-private-dev) omit Qt6GuiPrivateConfig.cmake +# and only provide the implicit Qt6::GuiPrivate target created alongside +# Qt6::Gui. Try the component quietly, then verify the target below so a +# missing private-headers package fails here instead of at compile time. +# Qt5 has no such component as its GuiPrivate target always exists once Gui is found. if(QT_VERSION_MAJOR GREATER_EQUAL 6) - find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS GuiPrivate) + find_package(Qt6 QUIET COMPONENTS GuiPrivate) +endif() + +if(QT_VERSION_MAJOR GREATER_EQUAL 6 AND NOT TARGET Qt6::GuiPrivate) + message(FATAL_ERROR + "Qt6::GuiPrivate was not found. It is required for PDF hyperlink " + "support (). Install the Qt6 private headers " + "(e.g. 'qt6-base-private-dev' on Debian/Ubuntu) or use a Qt build " + "that provides the GuiPrivate component.") endif() find_package(SQLite3 REQUIRED) @@ -100,25 +103,19 @@ endif() set(CMAKE_AUTOUIC_SEARCH_PATHS ${QET_DIR}/sources/ui) -# The default build only compiles the tracked .ts files to .qm (lrelease). -# Refreshing the .ts from the sources (lupdate) is a developer action behind -# the explicit "update_translations" target below: running lupdate on every -# build rewrote tracked files as a side effect, and under high parallelism -# lupdate rewriting a .ts while lrelease read the same file made the build -# fail with "Premature end of document". -set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${QET_DIR}/lang") if(QT_VERSION_MAJOR EQUAL 6) - qt6_add_translation(QM_FILES ${TS_FILES}) + set(KF_MAJOR_VERSION 6) else() - qt5_add_translation(QM_FILES ${TS_FILES}) + set(KF_MAJOR_VERSION 5) endif() +include(cmake/fetch_kdeaddons.cmake) -add_custom_target(update_translations - COMMAND $ ${CMAKE_SOURCE_DIR}/sources -ts ${TS_FILES} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Updating .ts files from sources/ (lupdate) - developer target, run explicitly" - VERBATIM -) +# Add sub directories +option(PACKAGE_TESTS "Build the tests" ON) +if(PACKAGE_TESTS) + message("Add sub directory tests") + add_subdirectory(tests) +endif() # als laatse include(cmake/define_definitions.cmake) @@ -145,6 +142,90 @@ else() ) endif() +# The default build only compiles the tracked .ts files to .qm (lrelease). +# Refreshing the .ts from the sources (lupdate) is a developer action behind +# the explicit "update_translations" target below: running lupdate on every +# build rewrote tracked files as a side effect, and under high parallelism +# lupdate rewriting a .ts while lrelease read the same file made the build +# fail with "Premature end of document". +set_source_files_properties( + ${TS_FILES} + PROPERTIES OUTPUT_LOCATION "${QET_DIR}/lang" +) +if(QT_VERSION_MAJOR EQUAL 6) + if(Qt6_VERSION VERSION_LESS "6.2") + # Qt 6.0–6.1 + qt6_add_translation(QM_FILES ${TS_FILES}) + + # qt6_add_translation() only creates custom commands. Something must + # depend on their outputs for them to run during the default build. + add_custom_target(${PROJECT_NAME}_lrelease ALL + DEPENDS ${QM_FILES} + ) + + add_custom_target(update_translations + COMMAND + $ + "${CMAKE_SOURCE_DIR}/sources" + -ts ${TS_FILES} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + COMMENT + "Updating .ts files from sources/ (lupdate) - developer target" + VERBATIM + ) + + elseif(Qt6_VERSION VERSION_LESS "6.7") + # Qt 6.2–6.6: old target-based signature + qt_add_lrelease( + ${PROJECT_NAME} + TS_FILES ${TS_FILES} + QM_FILES_OUTPUT_VARIABLE QM_FILES + ) + + # Automatically creates the update_translations umbrella target. + qt_add_lupdate( + ${PROJECT_NAME} + TS_FILES ${TS_FILES} + ) + + else() + # Qt 6.7+: new signature + qt_add_lrelease( + TS_FILES ${TS_FILES} + LRELEASE_TARGET ${PROJECT_NAME}_lrelease + QM_FILES_OUTPUT_VARIABLE QM_FILES + ) + + qt_add_lupdate( + SOURCE_TARGETS ${PROJECT_NAME} + TS_FILES ${TS_FILES} + LUPDATE_TARGET update_translations + NO_GLOBAL_TARGET + ) + endif() + +else() + # Qt 5 + qt5_add_translation(QM_FILES ${TS_FILES}) + + # Likewise, qt5_add_translation() needs a target depending on its outputs, + # unless QM_FILES are already consumed elsewhere. + add_custom_target(${PROJECT_NAME}_lrelease ALL + DEPENDS ${QM_FILES} + ) + + add_custom_target(update_translations + COMMAND + $ + "${CMAKE_SOURCE_DIR}/sources" + -ts ${TS_FILES} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + COMMENT + "Updating .ts files from sources/ (lupdate) - developer target" + VERBATIM + ) +endif() + # Optional precompiled headers -- see QET_ENABLE_PCH in # cmake/developer_options.cmake for what this trades away. # @@ -180,7 +261,7 @@ target_link_libraries( pugixml::pugixml SingleApplication::SingleApplication SQLite3::SQLite3 - ${KF5_PRIVATE_LIBRARIES} + ${KF_PRIVATE_LIBRARIES} ${QET_PRIVATE_LIBRARIES} ) @@ -221,7 +302,7 @@ target_include_directories( ${QET_DIR}/sources/svg ) -if(NOT BUILD_WITH_KF5) +if(NOT BUILD_WITH_KF) target_include_directories( ${PROJECT_NAME} PRIVATE diff --git a/build-aux/windows/nsis_base/files/README.md b/build-aux/windows/nsis_base/files/README.md index 310f8abf7..b90d792de 100644 --- a/build-aux/windows/nsis_base/files/README.md +++ b/build-aux/windows/nsis_base/files/README.md @@ -40,8 +40,8 @@ git clone --recursive https://github.com/qelectrotech/qelectrotech-source-mirror Here are the technical choices made for the software development: * Integrated development environment: [Qt Framework](https://www.qt.io/ide/) -* Libraries: Qt 5.x -* [KF5 Framework](https://github.com/KDE) +* Libraries: Qt 5.x / Qt 6.x +* [KF5/6 Framework](https://github.com/KDE) [Cmake](https://cmake.org/install/) [kcoreaddons](https://github.com/KDE/kcoreaddons/tree/kf5) [kwidgetsaddons](https://github.com/KDE/kwidgetsaddons/tree/kf5). diff --git a/cmake/define_definitions.cmake b/cmake/define_definitions.cmake index 7f9cb6ae0..5296156b7 100644 --- a/cmake/define_definitions.cmake +++ b/cmake/define_definitions.cmake @@ -62,10 +62,10 @@ message("PROJECT_SOURCE_DIR :" ${PROJECT_SOURCE_DIR}) message("QET_DIR :" ${QET_DIR}) message("GIT_COMMIT_SHA :" ${GIT_COMMIT_SHA}) -if(BUILD_WITH_KF5) - message("KF5_GIT_TAG :" ${KF5_GIT_TAG}) +if(BUILD_WITH_KF) + message("KF_GIT_TAG :" ${KF_GIT_TAG}) else() - add_definitions(-DBUILD_WITHOUT_KF5) + add_definitions(-DBUILD_WITHOUT_KF) endif() message("QET_COMPONENTS :" ${QET_COMPONENTS}) message("QT_VERSION_MAJOR :" ${QT_VERSION_MAJOR}) diff --git a/cmake/developer_options.cmake b/cmake/developer_options.cmake index cec095273..23f0799fa 100644 --- a/cmake/developer_options.cmake +++ b/cmake/developer_options.cmake @@ -31,8 +31,11 @@ add_definitions(-DQT_MESSAGELOGCONTEXT) # In order to do so, uncomment the following line. #add_definitions(-DTODO_LIST) -# Build with KF5 -option(BUILD_WITH_KF5 "Build with KF5" ON) +# Build with KDE Frameworks. The major version (KF5/KF6) is derived +# automatically from QT_VERSION_MAJOR -- KDE Frameworks deliberately +# mirrors Qt's own major version numbering, so there is no independent +# choice to make here. See cmake/fetch_kdeaddons.cmake. +option(BUILD_WITH_KF "Build with KDE Frameworks" ON) # Precompiled headers for the Qt umbrella headers. # diff --git a/cmake/fetch_kdeaddons.cmake b/cmake/fetch_kdeaddons.cmake index 0867afec4..9b1733214 100644 --- a/cmake/fetch_kdeaddons.cmake +++ b/cmake/fetch_kdeaddons.cmake @@ -16,52 +16,74 @@ message(" - fetch_kdeaddons") -if(BUILD_WITH_KF5) +# TODO remove path as soon as Qt5 gets retired +if(BUILD_WITH_KF) Include(FetchContent) - option(BUILD_KF5 "Build KF5 libraries, use system ones otherwise" YES) + option(BUILD_KF "Build KF libraries, use system ones otherwise" YES) - if(BUILD_KF5) + if(BUILD_KF) - if(NOT DEFINED KF5_GIT_TAG) - #https://qelectrotech.org/forum/viewtopic.php?pid=13924#p13924 - set(KF5_GIT_TAG v5.77.0) + if(KF_MAJOR_VERSION EQUAL 5) + if(NOT DEFINED KF_GIT_TAG) + #https://qelectrotech.org/forum/viewtopic.php?pid=13924#p13924 + set(KF_GIT_TAG v5.77.0) + endif() + else() + if(NOT DEFINED KF_GIT_TAG) + # this is a more or less random version, taken as an conservative approach + set(KF_GIT_TAG v6.10.0) + endif() endif() + # using a function in order to limit the scope of the variables + # with CMake >=3.25 we could use a block() + function(qet_make_kf_available) + # Fix stop the run autotests of kcoreaddons + # see + # https://invent.kde.org/frameworks/kcoreaddons/-/blob/master/CMakeLists.txt#L98 + # issue: + # CMake Error at /usr/share/ECM/modules/ECMAddTests.cmake:89 (add_executable): + # Cannot find source file: + # see + # https://qelectrotech.org/forum/viewtopic.php?pid=13929#p13929 + set(KDE_SKIP_TEST_SETTINGS ON) + set(BUILD_TESTING OFF) + + # QElectroTech is a plain QtWidgets application with no QML anywhere in + # it; these disable optional features of the fetched KF modules that + # would otherwise pull in extra Qt6 components (e.g. Qt6Qml) we don't + # have and don't need. + set(BUILD_DESIGNERPLUGIN OFF) + set(KCOREADDONS_USE_QML OFF) + set(BUILD_QCH OFF) + set(BUILD_SHARED_LIBS OFF) - # Fix stop the run autotests of kcoreaddons - # see - # https://invent.kde.org/frameworks/kcoreaddons/-/blob/master/CMakeLists.txt#L98 - # issue: - # CMake Error at /usr/share/ECM/modules/ECMAddTests.cmake:89 (add_executable): - # Cannot find source file: - # see - # https://qelectrotech.org/forum/viewtopic.php?pid=13929#p13929 - set(KDE_SKIP_TEST_SETTINGS "TRUE") - set(BUILD_TESTING "0") - FetchContent_Declare( - ecm - GIT_REPOSITORY https://invent.kde.org/frameworks/extra-cmake-modules.git - GIT_TAG ${KF5_GIT_TAG}) - FetchContent_MakeAvailable(ecm) + FetchContent_Declare( + ecm + GIT_REPOSITORY https://invent.kde.org/frameworks/extra-cmake-modules.git + GIT_TAG ${KF_GIT_TAG}) + FetchContent_MakeAvailable(ecm) - FetchContent_Declare( - kcoreaddons - GIT_REPOSITORY https://invent.kde.org/frameworks/kcoreaddons.git - GIT_TAG ${KF5_GIT_TAG}) - FetchContent_MakeAvailable(kcoreaddons) + FetchContent_Declare( + kcoreaddons + GIT_REPOSITORY https://invent.kde.org/frameworks/kcoreaddons.git + GIT_TAG ${KF_GIT_TAG}) + FetchContent_MakeAvailable(kcoreaddons) - FetchContent_Declare( - kwidgetsaddons - GIT_REPOSITORY https://invent.kde.org/frameworks/kwidgetsaddons.git - GIT_TAG ${KF5_GIT_TAG}) - FetchContent_MakeAvailable(kwidgetsaddons) + FetchContent_Declare( + kwidgetsaddons + GIT_REPOSITORY https://invent.kde.org/frameworks/kwidgetsaddons.git + GIT_TAG ${KF_GIT_TAG}) + FetchContent_MakeAvailable(kwidgetsaddons) + endfunction() + qet_make_kf_available() else() - find_package(KF5CoreAddons REQUIRED) - find_package(KF5WidgetsAddons REQUIRED) + find_package(KF${KF_MAJOR_VERSION}CoreAddons REQUIRED) + find_package(KF${KF_MAJOR_VERSION}WidgetsAddons REQUIRED) endif() - set(KF5_PRIVATE_LIBRARIES - KF5::WidgetsAddons - KF5::CoreAddons + set(KF_PRIVATE_LIBRARIES + KF${KF_MAJOR_VERSION}::WidgetsAddons + KF${KF_MAJOR_VERSION}::CoreAddons ) endif() diff --git a/cmake/qet_compilation_vars.cmake b/cmake/qet_compilation_vars.cmake index c0daa3aca..112e6dea5 100644 --- a/cmake/qet_compilation_vars.cmake +++ b/cmake/qet_compilation_vars.cmake @@ -801,7 +801,7 @@ set(QET_SRC_FILES ${QET_DIR}/sources/xml/terminalstriplayoutpatternxml.h ) -if(NOT BUILD_WITH_KF5) +if(NOT BUILD_WITH_KF) list(APPEND QET_SRC_FILES ${QET_DIR}/sources/ui/nokde/kautosavefile.cpp ${QET_DIR}/sources/ui/nokde/kautosavefile.h diff --git a/lang/qet_de.qm b/lang/qet_de.qm index 97d6f1365..9a62f5772 100644 Binary files a/lang/qet_de.qm and b/lang/qet_de.qm differ diff --git a/lang/qet_de.ts b/lang/qet_de.ts index 7f8c27f38..b70016135 100644 --- a/lang/qet_de.ts +++ b/lang/qet_de.ts @@ -358,12 +358,12 @@ Ajuster la taille du tableau au folio - Tabellegröße an Folie anpassen + Tabellegröße an Seite anpassen Ajouter de nouveau folio et tableau si nécessaire. - Folie und Tabelle hinzufügen, wenn erforderlich. + Seite und Tabelle hinzufügen, wenn erforderlich. @@ -507,46 +507,75 @@ Auswahl Nummerierungsregeln - - - + + Valeur + Wert + + + + Incrément + Inkrement + + + + Suivant + Nächstes + + + + + Réinitialiser à la valeur de départ Auf den Ausgangswert zurücksetzen - - - + + + Valeur actuelle du compteur. Saisir une nouvelle valeur et valider pour la modifier. Aktueller Zählerstand. Geben Sie einen neuen Wert ein und bestätigen Sie, um ihn zu ändern. - + + + + Incrément : valeur ajoutée au compteur à chaque nouvelle numérotation + Inkrement: Wert, der bei jeder neuen Nummerierung zum Zähler addiert wird + + + + + + Prochaine valeur qui sera appliquée avec cet incrément + Nächster Wert, der mit diesem Inkrement angewendet wird + + + Element Bauteil - + Conducteur Leiter - + Configurer les règles d'auto numérotation Nummerierungsregel konfigurieren - + Configurer Konfigurieren - + Folio - Folie + Seite - + Autonumérotation Automatische Nummerierung @@ -576,7 +605,7 @@ Apply to Selected Folios - Auf ausgewählte Folien anwenden + Auf ausgewählte Seiten anwenden @@ -638,7 +667,7 @@ Folio - Folie + Seite @@ -679,7 +708,7 @@ Für Betriebsmittelkennzeichen (BMK) von Bauteilen gibt es 4 Richtlinien: - Beide: neue und vorhandene BMK werden aktualisiert. Das ist die Standardoption. - nur Neue: nur BMK von neu angelegten Bauteilen werden aktualisiert. Vorhandene BMK bleiben bestehend. - nur Vorhandene: nur BMK von vorhandenen Bauteilen werden aktualisiert. Neuen Bauteilen werden ihr BMK-Formel zugewiesen, werden aber im Nachhinein nicht aktualisiert. -- nicht aktualisieren: neue und vorhandene BMK werden nicht aktualisiert. Dies gilt auch für neu angelegte Folien. +- nicht aktualisieren: neue und vorhandene BMK werden nicht aktualisiert. Dies gilt auch für neu angelegte Seiten. Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. @@ -783,7 +812,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Form - Folieneigenschaften + Seiteneigenschaften @@ -818,7 +847,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Dimensions du folio - Folienmaße + Seitenmaße @@ -905,7 +934,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Afficher un texte de potentiel par folio. - Nur eine Potenzialbeschriftung je Folie anzeigen. + Nur eine Potenzialbeschriftung je Seite anzeigen. @@ -1155,7 +1184,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. # - + # @@ -1382,7 +1411,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. DiagramEventAddElement - + Ajouter %1 Einfügen von .%1 @@ -1401,7 +1430,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Propriétés du folio window title - Folieneigenschaften + Seiteneigenschaften @@ -1600,210 +1629,210 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. DynamicElementTextModel - + Propriété Eigenschaft - + Valeur Wert - + Source du texte Textquelle - - - - - + + + + + Texte utilisateur Benutzertext - - - - - + + + + + Information de l'élément Bauteilinformation - - - - - + + + + + Texte composé Zusammengesetzter Text - + Texte Text - + Information Information - + Mon texte composé Mein zusammengesetzter Text - + Taille Größe - + Police Schriftart - + Largeur Breite - + Conserver la rotation visuel Leserichtung beim Drehen beibehalten - + Éditer Bearbeiten - + Modifier la police d'un texte d'élément Schriftart eines Bauteiltexts ändern - + Modifier le maintient de la rotation d'un texte d'élément Verhalten der Leserichtung beim Drehen eines Bauteiltexts ändern - + Modifier l'alignement d'un texte d'élément Ausrichtung eines Bauteiltexts ändern - + Modifier la taille d'un texte d'élément Größe eines Bauteiltexts ändern - + Modifier la couleur d'un texte d'élément Farbe eines Bauteiltexts ändern - + Modifier le cadre d'un texte d'élément Rahmen eines Bauteiltexts ändern - + Modifier la largeur d'un texte d'élément Breite eines Bauteiltexts ändern - + Déplacer un texte d'élément Text eines Bauteils verschieben - + Pivoter un texte d'élément Textfeld eines Bauteils drehen - + Éditer un groupe de textes Textgruppe bearbeiten - - - + + + Gauche Linksbündig - - - + + + Droite Rechtsbündig - - - + + + Centre Zentriert - - + + Alignement Ausrichtung - + Ajustement vertical Zeilenabstand - + Maintenir en bas de page - Am unteren Rand der Folie platzieren + Am unteren Rand der Seite platzieren - + Déplacer un texte dans un autre groupe Text in eine andere Gruppe verschieben - + Couleur Farbe - - + + Cadre Rahmen - - + + Position X Position X - - + + Position Y Position Y - - + + Rotation Drehung - + Éditer un texte d'élément Textfeld eines Bauteils bearbeiten @@ -1816,7 +1845,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren.Form - + Source du texte Textquelle @@ -1841,23 +1870,23 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren.Bauteilinformation - + Encadrer le texte Text einrahmen - + Texte composé Zusammengesetzter Text - + Police Schriftart - + X X @@ -1867,78 +1896,84 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren.Breite - + Y Y - + Alignement Ausrichtung - + Rotation Drehung - - + + Déplacer un champ texte Textfeld verschieben - + Pivoter un champ texte Textfeld drehen - + Modifier le texte d'un champ texte Text eines Textfelds ändern - - + + Modifier la police d'un champ texte Schriftart eines Textfelds ändern - + Modifier la couleur d'un champ texte Farbe eines Textfelds ändern - + Modifier la conservation de l'angle Beibehaltung des Winkels ändern - + + Modifier le point de rotation d'un champ texte + Rotationspunkt eines Textfelds ändern + + + Modifier le cadre d'un champ texte Rahmen eines Textfelds ändern - + Modifier la largeur d'un texte Breite eines Bauteiltexts ändern - + Modifier l'information d'un texte Text eines Textfelds ändern - + Modifier la source de texte, d'un texte Quelle eines Texts ändern - + Modifier l'alignement d'un champ texte Ausrichtung eines Textfelds ändern + Tourner autour de son propre centre Um eigenen Mittelpunkt drehen @@ -1946,32 +1981,32 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. DynamicTextItemDelegate - + Texte utilisateur Benutzertext - + Information de l'élément Bauteilinformation - + Texte composé Zusammengesetzter Text - + Gauche Linksbündig - + Centre Zentriert - + Droite Rechtsbündig @@ -2021,112 +2056,112 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. ElementDialog - + Ouvrir un élément dialog title Bauteil öffnen - + Choisissez l'élément que vous souhaitez ouvrir. dialog content Wählen Sie das zu öffnende Bauteil. - + Enregistrer un élément dialog title Bauteil speichern - + Choisissez l'élément dans lequel vous souhaitez enregistrer votre définition. dialog content Wählen Sie ein Bauteil, in dem Sie Ihre Definition speichern wollen. - + Ouvrir une catégorie dialog title Kategorie öffnen - - + + Choisissez une catégorie. dialog content Kategorie auswählen. - + Enregistrer une catégorie dialog title Kategorie speichern - + Enregistrer un template dialog title Vorlage speichern - + Choisissez l'emplacement dans lequel vous souhaitez enregistrer votre template. dialog content Wählen Sie den Speicherort, an dem Sie Ihre Vorlage speichern möchten. - + Titre Titel - + Label Betriebsmittelkennzeichen - + Nom du nouveau dossier Name vom neuen Ordner - + Nom du nouveau template Name der neuen Vorlage - + Écraser le template ? message box title Die Vorlage überschreiben? - + Le template existe déjà. Voulez-vous l'écraser ? message box content Die Vorlage existiert bereits. Möchten Sie sie überschreiben? - + Vous devez sélectionner un élément ou une catégorie avec un nom pour l'élément. message box content Sie müssen ein Bauteil oder eine Kategorie auswählen. - + Sélection inexistante message box title Keine Auswahl - + Nom de fichier de l'élément placeholder: the element's file name, not its display name Dateiname des Elements - + Nom de fichier de l'élément : chiffres, minuscules, « - », « _ » et « . » uniquement. Le nom affiché de l'élément se modifie séparément dans les propriétés de l'élément. tooltip for the element file-name field @@ -2134,32 +2169,32 @@ Le nom affiché de l'élément se modifie séparément dans les propriété Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des Elements ändern. - + La sélection n'existe pas. message box content Auswahl existiert nicht. - - + + Sélection incorrecte message box title Auswahl nicht korrekt - + La sélection n'est pas un élément. message box content Auswahl ist kein Bauteil. - + Écraser l'élément ? message box title Bauteil überschreiben? - + L'élément existe déjà. Voulez-vous l'écraser ? message box content Das Bauteil existiert bereits. Soll es überschrieben werden? @@ -2227,8 +2262,8 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El - - + + Type Typ @@ -2299,8 +2334,8 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El - - + + Fonction Funktion @@ -2322,7 +2357,7 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El - + Simple Einzelbauteil @@ -2339,12 +2374,12 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El Renvoi de folio suivant - abgehender Folienverweis + abgehender Seitenverweis Renvoi de folio précédent - ankommender Folienverweis + ankommender Seitenverweis @@ -2363,19 +2398,19 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El - + Normalement ouvert Schliesser - + Normalement fermé Öffner - + Inverseur Wechsler @@ -2391,25 +2426,25 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El - + Puissance Leistung - + Temporisé travail anzugverzögert - + Temporisé repos abfallverzögert - + Temporisé travail & repos Anzug- und Abfallverzögert @@ -2465,152 +2500,152 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El Neutralleiter - - + + + - - + T%1 T%1 - + Autre Andere - + Configuration PLC SPS-Konfiguration - + + + - + - - - - + + Adresse Adresse - - + + Commentaire Kommentar - + Réf. croisée Querverweis - - + + Nb. Anzahl - + T1 T1 - + Police des en-têtes Schriftart der Überschriften - + Configurer la police des en-têtes de colonnes Schriftart für Spaltenüberschriften festlegen - + Police du texte Schriftart des Textes - + Configurer la police du texte dans les cellules Schriftart des Textes in den Zellen festlegen - + Afficher les en-têtes sur la feuille Kopfzeilen auf dem Blatt anzeigen - + Afficher ou masquer les en-têtes de colonnes du tableau PLC sur la feuille Spaltenüberschriften der SPS-Tabelle auf dem Blatt anzeigen oder ausblenden - + Saut %1 après: Sprung %1 danach: - + Aucun Keine - + H. ligne: Zeilenhöhe: - - + + mm mm - + Réf. Querverweis - + Nom personnalisé de la colonne (vide = par défaut) Benutzerdefinierter Spaltenname (leer = Standard) - + Visible Sichtbar - + Coller depuis le presse-papiers Aus der Zwischenablage einfügen - - + + Police des en-têtes: %1 %2pt Schriftgröße der Überschriften: %1 %2pt - - + + Police du texte: %1 %2pt Schriftgröße: %1 %2pt - + Police des en-têtes de colonnes Schriftart der Spaltenüberschriften - + Police du texte des cellules Schriftart des Zelltextes @@ -2877,7 +2912,7 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El Titre du folio - Folientitel + Seitentitel @@ -2887,35 +2922,35 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El Numéro du folio - Foliennummer + Seitennummer ElementScene - + Déplacer une primitive Stammfunktion verschieben - + Éditer les informations sur l'auteur window title Informationen über Autoren bearbeiten - + Vous pouvez utiliser ce champ libre pour mentionner les auteurs de l'élément, sa licence, ou tout autre renseignement que vous jugerez utile. Sie können dieses freie Textfeld benutzen, um die Autoren, die Lizenz, oder jede weitere nützliche Information zu speichern. - + Éditer les noms window title Namen bearbeiten - + Vous pouvez spécifier le nom de l'élément dans plusieurs langues. Sie können den Namen des Bauteiles in verschiedenen Sprachen eingeben. @@ -3276,7 +3311,7 @@ Mit dem Import dieser Datei bestätigen Sie, dass: Glissez-déposez ce modèle de cartouche sur un folio pour l'y appliquer. Status tip displayed when selecting a title block template - Ziehen/Ablegen, um das Schriftfeld auf der Folie anzuwenden. + Ziehen/Ablegen, um das Schriftfeld auf der Seite anzuwenden. @@ -3345,12 +3380,12 @@ Mit dem Import dieser Datei bestätigen Sie, dass: Propriétés du folio - Folieneigenschaften + Seiteneigenschaften Ajouter un folio - Neue Folie hinzufügen + Neue Seite hinzufügen @@ -3370,42 +3405,42 @@ Mit dem Import dieser Datei bestätigen Sie, dass: Supprimer ce folio - Folie löschen + Seite löschen Remonter ce folio - Folie 1 Position nach oben verschieben + Seite 1 Position nach oben verschieben Abaisser ce folio - Folie 1 Position nach unten verschieben + Seite 1 Position nach unten verschieben Remonter ce folio x10 - Folie 10 Positionen nach oben verschieben + Seite 10 Positionen nach oben verschieben Remonter ce folio x100 - Folie 100 Positionen nach oben verschieben + Seite 100 Positionen nach oben verschieben Remonter ce folio au debut - Folie an den Anfang verschieben + Seite an den Anfang verschieben Abaisser ce folio x10 - Folie 10 Positionen nach unten verschieben + Seite 10 Positionen nach unten verschieben Abaisser ce folio x100 - Folie 100 Positionen nach unten verschieben + Seite 100 Positionen nach unten verschieben @@ -3508,72 +3543,72 @@ Mit dem Import dieser Datei bestätigen Sie, dass: Exporter les folios du projet window title - Folien des Projekts exportieren + Seiten des Projekts exportieren Choisissez les folios que vous désirez exporter ainsi que leurs dimensions : - Auswahl der zu exportierenden Folien und deren Abmessungen: + Auswahl der zu exportierenden Seiten und deren Abmessungen: - + Titre du folio - Folientitel + Seitentitel - + Nom de fichier Dateiname - + Dimensions Maße - + Noms des fichiers cibles message box title Namen der Zieldateien - + Vous devez entrer un nom de fichier non vide et unique pour chaque folio à exporter. message box content - Die Dateinamen der zu exportierenden Folien müssen einmalig und nicht leer sein. + Die Dateinamen der zu exportierenden Seiten müssen einmalig und nicht leer sein. - + Dossier non spécifié message box title Ordner nicht angegeben - + Vous devez spécifier le chemin du dossier dans lequel seront enregistrés les fichiers images. message box content Geben Sie den Pfad vom Ordner ein, in dem die Bilddateien gespeichert werden. - + Impossible d'écrire dans ce fichier message box title Schreiben in dieser Datei nicht möglich - + Il semblerait que vous n'ayez pas les permissions nécessaires pour écrire dans le fichier %1. message box content Sie haben wahrscheinlich nicht die benötigten Rechte, um in die Datei %1 zu schreiben. - + Aperçu Vorschau - - + + px px @@ -3635,7 +3670,7 @@ Mit dem Import dieser Datei bestätigen Sie, dass: Exporter entièrement le folio - Ganze Folie exportieren + Ganze Seite exportieren @@ -3693,17 +3728,17 @@ Mit dem Import dieser Datei bestätigen Sie, dass: C&réer de nouveaux folios - Neue Folien e&rstellen + Neue Seiten e&rstellen Numérotation automatique des folios sélectionnés - Ausgewählte Folien automatisch nummerieren + Ausgewählte Seiten automatisch nummerieren Nouveaux folios - Neue Folien + Neue Seiten @@ -3723,13 +3758,13 @@ Mit dem Import dieser Datei bestätigen Sie, dass: Numérotation automatique de Folio : - Regel für die Foliennummerierung: + Regel für die Seitennummerierung: Folio Autonumbering title window - Automatische Foliennummerierung + Automatische Seitennummerierung @@ -3746,7 +3781,7 @@ Si le chiffre défini dans le champ Valeur possède moins de digits que le type Le champ "Incrémentation" n'est pas utilisé. help dialog about the folio autonumerotation - In diesem Dialog können Sie die Nummerierungsregel für neu angelegte Folien definieren. + In diesem Dialog können Sie die Nummerierungsregel für neu angelegte Seiten definieren. - Eine Nummerierungsregel beinhaltet mindestens eine Variable. - Variablen können mittels Knöpfe - und + gelöscht bzw. hinzugefügt werden. - Eine Variable beinhaltet: einen Typ, einen Wert und eine Inkrementierung. @@ -3816,9 +3851,9 @@ that you create. Text and number inputs are - %prefix: Gerätekennbuchstabe - %l: Zeilennummer - %c: Spaltennummer - - %F: Foliennummer - - %f oder %id: Seitennummer der Folie - - %total: Anzahl der Folien im Projekt + - %F: Seitennummer + - %f oder %id: Seitennummer der Seite + - %total: Anzahl der Seiten im Projekt Sie können auch beliebige Variablen verwenden, die Sie im Schriftfeld erstellt haben. Texte und Zahlen sind ebenso erlaubt. @@ -3965,26 +4000,26 @@ Texte und Zahlen sind ebenso erlaubt. - + - + - + Par defaut Standard - + - + - + Parcourir... Auswählen... - + (Recharger les collections d'éléments pour appliquer les changements) (Bauteilsammlungen neu laden, um die Änderungen zu übernehmen) @@ -4001,7 +4036,7 @@ Texte und Zahlen sind ebenso erlaubt. Utiliser les numéros de folio à la place de leur position dans le projet - Foliennummern anstelle von Seitennummern für Projektanzeigen verwenden + Seitennummern anstelle von Seitennummern für Projektanzeigen verwenden @@ -4058,7 +4093,7 @@ Hier unten kann der Standardwert dieses Textfeldes für Ihre eigenen Bauteile de Zugriff auf Sammlungen - + Répertoire de la collection commune Pfad zur gemeinsamen Bauteilsammlung @@ -4068,7 +4103,7 @@ Hier unten kann der Standardwert dieses Textfeldes für Ihre eigenen Bauteile de Pfad zur Benutzer-Bauteilsammlung - + Répertoire des cartouches utilisateur Pfad zu den Benutzer-Schriftfeldern @@ -4128,7 +4163,7 @@ Hier unten kann der Standardwert dieses Textfeldes für Ihre eigenen Bauteile de Methode zur Skalierung bei hochauflösenden Bildschirmen (hdpi) (wirksam nach einem Neustart von QElectroTech): - + Répertoire de la collection company Pfad zur Firmen-Bauteilsammlung @@ -4138,7 +4173,7 @@ Hier unten kann der Standardwert dieses Textfeldes für Ihre eigenen Bauteile de Pfad zu Firmen-Schriftfeldern - + Répertoire des Macros utilisateur Pfad zu Benutzer-Vorlagen @@ -4235,7 +4270,7 @@ Hier unten kann der Standardwert dieses Textfeldes für Ihre eigenen Bauteile de max: - + max: @@ -4246,7 +4281,7 @@ Hier unten kann der Standardwert dieses Textfeldes für Ihre eigenen Bauteile de min: - + min: @@ -4271,7 +4306,7 @@ Hier unten kann der Standardwert dieses Textfeldes für Ihre eigenen Bauteile de Autoriser le dézoom au delà du folio - Ansicht verkleinern über die Folie hinaus erlauben + Ansicht verkleinern über die Seite hinaus erlauben @@ -4502,13 +4537,13 @@ Alle Einstellungen außer „Keine Rundung“ können je nach folgenden Faktoren Ceci est un projet QElectroTech, c'est-à-dire un fichier d'extension .qet regroupant plusieurs folios. Il embarque également les éléments et modèles de cartouches utilisés dans ces folios. "What's this" tip - Das ist ein QElectroTech-Projekt: eine *.qet Datei, in der Folien, eingebettete Bauteile und eingebettete Schriftfelder gespeichert sind. + Das ist ein QElectroTech-Projekt: eine *.qet Datei, in der Seiten, eingebettete Bauteile und eingebettete Schriftfelder gespeichert sind. Folio sans titre Fallback label when a diagram has no title - Folie ohne Titel + Seite ohne Titel @@ -4532,7 +4567,7 @@ Alle Einstellungen außer „Keine Rundung“ können je nach folgenden Faktoren Ceci est un modèle de cartouche, qui peut être appliqué à un folio. "What's this" tip - Das ist eine Schriftfeld-Vorlage, die auf eine Folie angewendet werden kann. + Das ist eine Schriftfeld-Vorlage, die auf eine Seite angewendet werden kann. @@ -4606,7 +4641,7 @@ Alle Einstellungen außer „Keine Rundung“ können je nach folgenden Faktoren Ajuster le tableau au folio - Tabelle an Foliengröße anpassen + Tabelle an Seitengröße anpassen @@ -4902,9 +4937,9 @@ Veuillez utiliser l'éditeur avancé pour cela. - - - + + + Police Schriftart @@ -4914,48 +4949,48 @@ Veuillez utiliser l'éditeur avancé pour cela. html Formatierung entfernen - - + + Déplacer un champ texte Textfeld verschieben - + Pivoter un champ texte Textfeld drehen - + Modifier un champ texte Textfeld ändern - + Modifier la taille d'un champ texte Größe eines Textfelds ändern - + Modifier la police d'un champ texte Schriftart eines Textfelds ändern - + Pivoter plusieurs champs texte Mehrere Textfelder drehen - + Modifier la taille de plusieurs champs texte Größe mehrerer Textfelder ändern - + Modifier la police de plusieurs champs texte Schriftart mehrerer Textfelder ändern - + Modifier les propriétés d'un texte Eigenschaften eines Textfelds ändern @@ -5153,13 +5188,13 @@ Veuillez utiliser l'éditeur avancé pour cela. N° de folio - Foliennummer + Seitennummer Label de folio - Folienname + Seitenname @@ -5167,7 +5202,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Titre de folio - Folientitel + Seitentitel @@ -5255,7 +5290,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Report de folio - Folienverweis + Seitenverweis @@ -5322,18 +5357,18 @@ Veuillez utiliser l'éditeur avancé pour cela. N° de folio - Foliennummer + Seitennummer Label de folio - Folienname + Seitenname Titre de folio - Folientitel + Seitentitel @@ -5377,42 +5412,42 @@ Veuillez utiliser l'éditeur avancé pour cela. Anordnung speichern - + Nombre maximal d'esclaves atteint. Die maximale Anzahl an Slaves wurde erreicht. - + Cet élément maître ne peut plus accepter aucun nouveau contact esclave, la limite fixée a été atteinte (Limite: %1). Dieser Master kann keine neuen Slave-Kontakte mehr akzeptieren, da das festgelegte Limit erreicht wurde (Limit: %1). - + Type Typ - + Adresse Adresse - + Fonction Funktion - + Commentaire Kommentar - + Réf. croisée Querverweis - + Coller depuis le presse-papiers Aus der Zwischenablage einfügen @@ -5522,7 +5557,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Folio - Folieneigenschaften + Seiteneigenschaften @@ -5532,7 +5567,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Reports de folio - Folienverweise + Seitenverweise @@ -5548,7 +5583,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Nouveau folio configuration page title - Neue Folie + Neue Seite @@ -5560,90 +5595,90 @@ Veuillez utiliser l'éditeur avancé pour cela. NewElementWizard - + Créer un nouvel élément : Assistant window title Neues Bauteil erstellen: Assistent - + &Suivant > &Weiter > - + Étape 1/3 : Catégorie parente wizard page title Schritt 1/3: übergeordnete Kategorie - + Sélectionnez une catégorie dans laquelle enregistrer le nouvel élément. wizard page subtitle Suchen Sie eine Kategorie aus, in der das neue Bauteil gespeichert wird. - + Étape 2/3 : Nom du fichier wizard page title Schritt 2/3: Dateiname - + Indiquez le nom du fichier dans lequel enregistrer le nouvel élément. wizard page subtitle Geben Sie den Dateinamen ein zum Speichern des neuen Bauteils. - + nouvel_element Neues_Bauteil - + Vous n'êtes pas obligé de préciser l'extension *.elmt. Elle sera ajoutée automatiquement. Sie müssen nicht die Dateierweiterung *.elmt eingeben. Diese wird automatisch eingefügt. - + Étape 3/3 : Noms de l'élément wizard page title Schritt 3/3: Bauteilname - + Indiquez le ou les noms de l'élément. wizard page subtitle Einen oder mehrere Namen für das Bauteil eingeben. - + Nom du nouvel élément default name when creating a new element Name des neuen Bauteils - - - + + + Erreur message box title Fehler - + Vous devez sélectionner une catégorie. message box content Sie müssen eine Kategorie auswählen. - + Vous devez entrer un nom de fichier message box content Sie müssen einen Dateinamen eingeben - + Un élément portant le même nom existe déjà Ein Bauteil mit dem gleichen Namen existiert bereits @@ -5740,7 +5775,7 @@ Veuillez utiliser l'éditeur avancé pour cela. N° folio - Foliennummer + Seitennummer @@ -5748,7 +5783,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Folio - Folie + Seite @@ -5756,7 +5791,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Chiffre 1 - Folio - Zahlenformat 1 - Folie + Zahlenformat 1 - Seite @@ -5764,7 +5799,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Chiffre 01 - Folio - Zahlenformat 01 - Folie + Zahlenformat 01 - Seite @@ -5772,7 +5807,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Chiffre 001 - Folio - Zahlenformat 001 - Folie + Zahlenformat 001 - Seite @@ -5832,7 +5867,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Dynamisches Textfeld - + Déplacer un champ texte Textfeld verschieben @@ -6137,7 +6172,7 @@ Leiterquerschnitt: %1 Veuillez saisir une formule compatible pour ce potentiel. Les variables suivantes sont incompatibles : %sequf_ %seqtf_ %seqhf_ %id %F %M %LM - Die Formel vom neuen Potenzial beinhaltet Variablen, die nicht mit Folienverweisen kompatibel sind. + Die Formel vom neuen Potenzial beinhaltet Variablen, die nicht mit Seitenverweisen kompatibel sind. Bitte tragen Sie eine passende Formel für dieses Potenzial ein. Folgende Variablen sind inkompatibel: %sequf_ %seqtf_ %seqhf_ %id %F %M %LM @@ -6177,34 +6212,34 @@ Folgende Variablen sind inkompatibel: Folios - Folien + Seiten Numérotation auto des folios - Folien-Auto-Nummerierung + Seiten-Auto-Nummerierung - - - - - - - + + + + + + + Sans nom Unbenannt - - - - - - - - - + + + + + + + + + Nom de la nouvelle numérotation Name der neuen Nummerierungsregel @@ -6258,13 +6293,13 @@ Folgende Variablen sind inkompatibel: Ce titre sera disponible pour tous les folios de ce projet en tant que %projecttitle. informative label - Der Titel ist für alle Folien des Projekts als Variable %projecttitle verfügbar. + Der Titel ist für alle Seiten des Projekts als Variable %projecttitle verfügbar. Vous pouvez définir ci-dessous des propriétés personnalisées qui seront disponibles pour tous les folios de ce projet (typiquement pour les cartouches). informative label - Benutzerdefinierte Eigenschaften können erstellt werden. Sie sind für alle Folien des Projekts verfügbar (typischerweise in den Schriftfeldern). + Benutzerdefinierte Eigenschaften können erstellt werden. Sie sind für alle Seiten des Projekts verfügbar (typischerweise in den Schriftfeldern). @@ -6302,7 +6337,7 @@ Folgende Variablen sind inkompatibel: Folios à imprimer : - Zu druckende Folien: + Zu druckende Seiten: @@ -6367,7 +6402,7 @@ Folgende Variablen sind inkompatibel: Adapter le folio à la page - Folie an Seitengröße anpassen + Seite an Seitengröße anpassen @@ -6489,7 +6524,7 @@ Folgende Variablen sind inkompatibel: Folio sans titre - Folie ohne Titel + Seite ohne Titel @@ -6537,7 +6572,7 @@ Voulez-vous enregistrer les modifications ? Supprimer le folio ? message box title - Folie löschen? + Seite löschen? @@ -6581,7 +6616,7 @@ Voulez-vous enregistrer les modifications ? Ajouter un folio - Neue Folie hinzufügen + Neue Seite hinzufügen @@ -6607,12 +6642,12 @@ Voulez-vous enregistrer les modifications ? Ce projet ne contient aucun folio label displayed when a project contains no diagram - Dieses Projekt beinhaltet keine Folie + Dieses Projekt beinhaltet keine Seite <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des onglets de folio :</p> - <p align="center"><b>Öffnen des Projekts...</b><br/>Folienreiter werden erstellt:</p> + <p align="center"><b>Öffnen des Projekts...</b><br/>Seitenreiter werden erstellt:</p> @@ -6632,239 +6667,239 @@ Voulez-vous enregistrer les modifications ? QETApp - + Chargement... Initialisation du cache des collections d'éléments splash screen caption Laden... Initialisiere die Bauteilsammlungen - + Chargement... Éditeur de schéma splash screen caption Laden... Schaltplaneditor - + Chargement... Ouverture des fichiers splash screen caption Laden... Öffne Dateien - + LTR Translate this string to RTL if you are translating to a Right-to-Left language, else translate to LTR LTR - + Cartouches QET title of the title block templates collection provided by QElectroTech QET-Schriftfelder - + Cartouches company title of the company's title block templates collection Firmen-Schriftfelder - + Cartouches utilisateur title of the user's title block templates collection Benutzer-Schriftfelder - + Q Single-letter example text - translate length, not meaning Q - + QET Small example text - translate length, not meaning QET - + Schema Normal example text - translate length, not meaning - Folie + Seite - + Electrique Normal example text - translate length, not meaning Elektrik - + QElectroTech Long example text - translate length, not meaning QElectroTech - + Configurer QElectroTech window title QElectroTech Einstellungen - + Chargement... splash screen caption Lade... - + Chargement... icône du systray splash screen caption Lade... Symbole des Systemsbenachrichtigungsfelds - + QElectroTech systray menu title QElectroTech - + &Quitter &Beenden - + &Masquer &Verstecken - + &Restaurer &Zeigen - + &Masquer tous les éditeurs de schéma &Verstecke alle Schaltplaneditoren - + &Restaurer tous les éditeurs de schéma &Zeige alle Schaltplaneditoren - + &Masquer tous les éditeurs d'élément &Verstecke alle Bauteileditoren - + &Restaurer tous les éditeurs d'élément &Zeige alle Bauteileditoren - + &Masquer tous les éditeurs de cartouche systray submenu entry &Verstecke alle Schriftfeld-Editoren - + &Restaurer tous les éditeurs de cartouche systray submenu entry &Zeige alle Schriftfeld-Editoren - + &Nouvel éditeur de schéma &Neuer Schaltplaneditor - + &Nouvel éditeur d'élément &Neuer Bauteileditor - + Ferme l'application QElectroTech Anwendung QElectroTech schließen - + Réduire QElectroTech dans le systray QElectroTech in Systembenachrichtigungsfeld minimieren - + Restaurer QElectroTech QElectroTech wiederherstellen - + QElectroTech systray icon tooltip QElectroTech - + Éditeurs de schémas Schaltplaneditor - + Éditeurs d'élément Bauteileditor - + Éditeurs de cartouche systray menu entry Schriftfeld-Editor - + <b>Le fichier de restauration suivant a été trouvé,<br>Voulez-vous l'ouvrir ?</b><br> <b>Die folgende Sicherungsdatei wurde gefunden,<br>Möchten Sie sie öffnen?</b><br> - + <b>Les fichiers de restauration suivant on été trouvé,<br>Voulez-vous les ouvrir ?</b><br> <b>Die folgenden Sicherungsdateien wurden gefunden,<br>Möchten Sie sie öffnen?</b><br> - + Fichier de restauration Sicherungsdatei - + Rapport de plantage Absturzbericht - + QElectroTech ne s'est pas fermé correctement lors de sa dernière exécution. Voici les derniers messages enregistrés avant l'arrêt -- vous pouvez les enregistrer pour les joindre à un rapport de bug. QElectroTech wurde bei der letzten Ausführung nicht ordnungsgemäß beendet. Hier sind die letzten Meldungen, die vor dem Beenden aufgezeichnet wurden – Sie können sie speichern, um sie einem Fehlerbericht beizufügen. - + Rapport de diagnostic Diagnosebericht - + Ceci contient les derniers messages de journalisation de cette session. Vérifiez le contenu avant de le joindre à un rapport de bug public. Hier finden Sie die neuesten Protokolleinträge dieser Sitzung. Überprüfen Sie den Inhalt, bevor Sie ihn einem öffentlichen Fehlerbericht beifügen. - + Usage : Verwendung: - + [options] [fichier]... @@ -6873,7 +6908,7 @@ Hier sind die letzten Meldungen, die vor dem Beenden aufgezeichnet wurden – Si - + QElectroTech, une application de réalisation de schémas électriques. Options disponibles : @@ -6890,35 +6925,35 @@ Verfügbare Optionen: - + --common-elements-dir=DIR Definir le dossier de la collection d'elements --common-elements-dir=DIR Setzt Pfad zur Bauteilsammlung - + --common-tbt-dir=DIR Definir le dossier de la collection de modeles de cartouches --common-tbt-dir=DIR Pfad zur Schriftfeld-Sammlung setzen - + --config-dir=DIR Definir le dossier de configuration --config-dir=DIR Setzt Pfad zur Konfiguration - + --data-dir=DIR Definir le dossier de data --data-dir=DIR Setzt Pfad zu den Daten - + --lang-dir=DIR Definir le dossier contenant les fichiers de langue --lang-dir=DIR Setzt Pfad zu den Sprachdateien @@ -6993,7 +7028,7 @@ Verfügbare Optionen: Ce panneau liste les différentes actions effectuées sur le folio courant. Cliquer sur une action permet de revenir à l'état du schéma juste après son application. "What's this" tip - Diese Liste protokolliert alle auf der aktuellen Folie ausgeführten Änderungen. Die Auswahl eines Eintrags führt die Änderungen bis zu diesem Eintrag zurück. + Diese Liste protokolliert alle auf der aktuellen Seite ausgeführten Änderungen. Die Auswahl eines Eintrags führt die Änderungen bis zu diesem Eintrag zurück. @@ -7033,19 +7068,19 @@ Verfügbare Optionen: Propriétés du folio - Folieneigenschaften + Seiteneigenschaften Ajouter un folio - Neue Folie hinzufügen + Neue Seite hinzufügen Supprimer le folio - Folie löschen + Seite löschen @@ -7079,7 +7114,7 @@ Verfügbare Optionen: Enregistre le projet courant et tous ses folios status bar tip - Speichert das aktuelle Projekt und alle seine Folien + Speichert das aktuelle Projekt und alle seine Seiten @@ -7091,25 +7126,25 @@ Verfügbare Optionen: Ajoute une colonne au folio status bar tip - Fügt eine neue Spalte zur Folie hinzu + Fügt eine neue Spalte zur Seite hinzu Enlève une colonne au folio status bar tip - Löscht eine Spalte der Folie + Löscht eine Spalte der Seite Agrandit le folio en hauteur status bar tip - Vergrössert die Höhe der Folie + Vergrössert die Höhe der Seite Rétrécit le folio en hauteur status bar tip - Verkleinert die Höhe der Folie + Verkleinert die Höhe der Seite @@ -7120,7 +7155,7 @@ Verfügbare Optionen: Enlève les éléments sélectionnés du folio status bar tip - Entfernt die ausgewählten Bauteile von der Folie + Entfernt die ausgewählten Bauteile von der Seite @@ -7220,7 +7255,7 @@ Verfügbare Optionen: Zoom adapté - Folie einpassen + Seite einpassen @@ -7271,36 +7306,36 @@ Verfügbare Optionen: Sélectionne tous les éléments du folio status bar tip - Wählt alle Bauteile der Folie aus + Wählt alle Bauteile der Seite aus Désélectionne tous les éléments du folio status bar tip - Wählt alle Bauteile der Folie ab + Wählt alle Bauteile der Seite ab Agrandit le folio status bar tip - Vergrössert die Folie + Vergrössert die Seite Rétrécit le folio status bar tip - Verkleinert die Folie + Verkleinert die Seite Adapte le zoom de façon à afficher tout le contenu du folio indépendamment du cadre - Passt die Ansicht auf den Inhalt der Folie an, unabhängig vom Folienrahmen + Passt die Ansicht auf den Inhalt der Seite an, unabhängig vom Seitenrahmen Adapte le zoom exactement sur le cadre du folio status bar tip - Passt die Ansicht genau auf den Folienrahmen an + Passt die Ansicht genau auf den Seitenrahmen an @@ -7408,7 +7443,7 @@ Verfügbare Optionen: Affiche ou masque la grille des folios - Zeige den Hintergrundsraster der Folien an + Zeige den Hintergrundsraster der Seiten an @@ -7503,7 +7538,7 @@ Verfügbare Optionen: Exporte un ou plusieurs folios du projet courant status bar tip - Eine oder mehrere Folien des aktuellen Projekts exportieren + Eine oder mehrere Seiten des aktuellen Projekts exportieren @@ -7594,37 +7629,37 @@ Verfügbare Optionen: Ajoute un champ de texte sur le folio actuel - Fügt ein Textfeld auf die aktuelle Folie ein + Fügt ein Textfeld auf die aktuelle Seite ein Ajoute une image sur le folio actuel - Fügt ein Bild auf die aktuelle Folie ein + Fügt ein Bild auf die aktuelle Seite ein Ajoute une ligne sur le folio actuel - Fügt eine Linie auf die aktuelle Folie ein + Fügt eine Linie auf die aktuelle Seite ein Ajoute un rectangle sur le folio actuel - Fügt ein Rechteck auf die aktuelle Folie ein + Fügt ein Rechteck auf die aktuelle Seite ein Ajoute une ellipse sur le folio actuel - Fügt eine Ellipse auf die aktuelle Folie ein + Fügt eine Ellipse auf die aktuelle Seite ein Ajoute une polyligne sur le folio actuel - Fügt eine Polylinie auf die aktuelle Folie ein + Fügt eine Polylinie auf die aktuelle Seite ein Ajoute un plan de bornier sur le folio actuel - Klemmenplan auf aktueller Folie einfügen + Klemmenplan auf aktueller Seite einfügen @@ -7785,37 +7820,37 @@ Entfernen Sie die Überbrückung und/oder löschen Sie die Ebenen der betroffene Affiche la couleur de fond du folio en blanc ou en gris Status tip of white/grey background button - Schalte die Hintergrundfarbe der Folien in weiß oder grau um + Schalte die Hintergrundfarbe der Seiten in weiß oder grau um Exporte le folio courant dans un autre format status bar tip - Aktuelle Folie in ein anderes Format exportieren + Aktuelle Seite in ein anderes Format exportieren Imprime un ou plusieurs folios du projet courant status bar tip - Druckt eine oder mehrere Folien des aktuellen Projekts + Druckt eine oder mehrere Seiten des aktuellen Projekts Place les éléments du presse-papier sur le folio status bar tip - Inhalt der Zwischenablage auf Folie einfügen + Inhalt der Zwischenablage auf Seite einfügen Édite les propriétés du folio (dimensions, informations du cartouche, propriétés des conducteurs...) status bar tip - Bearbeitet die Folieneigenschaften (Maße, Schriftfeld-Daten, Leitereigenschaften...) + Bearbeitet die Seiteneigenschaften (Maße, Schriftfeld-Daten, Leitereigenschaften...) Permet de visualiser le folio sans pouvoir le modifier status bar tip - Wechselt in das Ansichtsmodus, in dem die Folie nicht bearbeitet werden kann + Wechselt in das Ansichtsmodus, in dem die Seite nicht bearbeitet werden kann @@ -8192,7 +8227,7 @@ Entfernen Sie die Überbrückung und/oder löschen Sie die Ebenen der betroffene Zoom adapté - Folie einpassen + Seite einpassen @@ -8385,7 +8420,7 @@ veuillez patienter durant l'import... <br><b>Erreur</b> :<br>Les reports de folio doivent posséder une seul borne.<br><b>Solution</b> :<br>Verifier que l'élément ne possède qu'une seul borne - <br><b>Fehler</b>: <br>Folienverweise dürfen nur einen Anschluss haben.<br><b>Lösung</b>: <br>Prüfen, dass das Bauteil nur einen Anschluss hat + <br><b>Fehler</b>: <br>Seitenverweise dürfen nur einen Anschluss haben.<br><b>Lösung</b>: <br>Prüfen, dass das Bauteil nur einen Anschluss hat @@ -8908,7 +8943,7 @@ Was möchten Sie tun? <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des folios</p> - <p align="center"><b>Öffnen des Projekts...</b><br/>Folien werden erstellt</p> + <p align="center"><b>Öffnen des Projekts...</b><br/>Seiten werden erstellt</p> @@ -9146,79 +9181,79 @@ Was möchten Sie tun? Zelleneigenschaften - + [Modifié] window title tag [geändert] - + [Lecture seule] window title tag [schreibgeschützt] - + %1 %2 part of the window title - %1 is the filepath or template name, %2 is the [Changed] or [Read only] tag %1 %2 - + QElectroTech - Éditeur de modèle de cartouche titleblock template editor: base window title QElectroTech - Schriftfeld-Editor - + %1 - %2 window title: %1 is the base window title, %2 is a template name %1 - %2 - + Ouvrir un modèle File > open dialog window title Vorlage öffnen - + Ouvrir un fichier dialog title Datei öffnen - + Modèles de cartouches QElectroTech (*%1);;Fichiers XML (*.xml);;Tous les fichiers (*) filetypes allowed when opening a title block template file - %1 is the .titleblock extension QElectroTech-Schriftfeld-Vorlagen (*%1);;XML-Dateien (*.xml);;Alle Dateien (*) - + Enregistrer le modèle sous dialog window title Vorlage speichern unter - + Enregistrer sous dialog title Speichern unter - + Modèles de cartouches QElectroTech (*%1) filetypes allowed when saving a title block template file - %1 is the .titleblock extension QElectroTech Schriftfeld-Vorlagen (*%1) - + Éditer les informations complémentaires window title Zusätzliche Informationen bearbeiten - + Vous pouvez utiliser ce champ libre pour mentionner les auteurs du cartouche, sa licence, ou tout autre renseignement que vous jugerez utile. Sie können dieses freie Textfeld benutzen, um die Autoren, die Lizenz, oder jede weitere nützliche Information über das Schriftfeld zu speichern. @@ -9270,38 +9305,38 @@ Was möchten Sie tun? %1 löschen - + coller %1 undo caption - %1 is a sentence listing the content to paste %1 einfügen - + couper %1 undo caption - %1 is a sentence listing the content to cut %1 ausschneiden - + déplacer %1 undo caption - %1 is a sentence listing the moved content %1 verschieben - + modifier le texte undo caption Text bearbeiten - + modifier un conducteur undo caption Leiter bearbeiten - + Réinitialiser %1 undo caption - %1 is a sentence listing the reset content %1 zurücksetzen @@ -9313,10 +9348,10 @@ Was möchten Sie tun? Schriftfeld bearbeiten - + modifier les dimensions du folio undo caption - Folienmaße ändern + Seitenmaße ändern @@ -9451,32 +9486,32 @@ Was möchten Sie tun? Text - + Folio sans titre - Folie ohne Titel + Seite ohne Titel - + schema - Folie + Seite - + Conserver les proportions Verhältnis beibehalten - + Réinitialiser les dimensions Größe zurücksetzen - + Aperçu Vorschau - + Exporter vers le presse-papier In die Zwischenablage kopieren @@ -9946,12 +9981,12 @@ Was möchten Sie tun? Position du folio - Seitennummer der Folie + Seitennummer der Seite Numéro de folio - Foliennummer + Seitennummer @@ -9995,7 +10030,7 @@ Der QET-Name dieses Ordners konnte nicht gelesen werden; stattdessen wird der Or Sammlung - + Ajouter %n conducteur(s) add a numbers of conductor one or more @@ -10132,7 +10167,7 @@ Möchten Sie sie ersetzen? Chercher/remplacer les propriétés de folio - Folienneigenschaften suchen/ersetzen + Seitenneigenschaften suchen/ersetzen @@ -10188,17 +10223,17 @@ Möchten Sie sie ersetzen? Nombre de folio - Anzahl der Folien + Anzahl der Seiten Numéro du folio précédent - Nummer der vorherigen Folie + Nummer der vorherigen Seite Numéro du folio suivant - Nummer der nächsten Folie + Nummer der nächsten Seite @@ -10248,7 +10283,7 @@ Möchten Sie sie ersetzen? - + Type Typ @@ -10256,7 +10291,7 @@ Möchten Sie sie ersetzen? - + Adresse Adresse @@ -10264,7 +10299,7 @@ Möchten Sie sie ersetzen? - + Commentaire @@ -10273,7 +10308,7 @@ Möchten Sie sie ersetzen? - + Réf. croisée Querverweis @@ -10281,7 +10316,7 @@ Möchten Sie sie ersetzen? - + @@ -10579,22 +10614,22 @@ Möchten Sie sie ersetzen? Leiter erstellen - + To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br>Requires python 3.5 or above.<br><B><U> First install on Windows</B></U><br>1. Install, if required, python 3.5 or above<br> Visit :<br><a href='https://www.python.org/downloads/'>python.org</a><br>2. pip install qet_tb_generator<br><B><U> Update on Windows</B></U><br>python -m pip install --upgrade qet_tb_generator<br>>>user could launch in a terminal this script in this directory<br> C:\users\XXXX\AppData\Local\Programs\Python\Python36-32\Scripts <br> Installation des Plugins qet_tb_generator:<br>Besuche <br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br>Erfordert Python 3.5 oder höher.<br><B><U> Erstinstallation unter Windows</B></U><br>1. Falls erforderlich, installiere Python 3.5 oder höher<br> Besuche :<br><a href='https://www.python.org/downloads/'>python.org</a><br>2. pip install qet_tb_generator<br><B><U> Aktualisierung unter Windows</B></U><br>python -m pip install --upgrade qet_tb_generator<br>>>Der Benutzer kann in einem Terminal dieses Skript in folgendem Verzeichnis ausführen:<br> C:\users\XXXX\AppData\Local\Programs\Python\Python36-32\Scripts <br> - + To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><B><U> First install on macOSX</B></U><br>1. Install, if required, python 3.11 bundle only, <a href='https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg'>python-3.11.2-macos11.pkg</a><br>2 Run Profile.command script<br>because program use hardcoded PATH for localise qet-tb-generator plugin <br> Visit :<br><a href='https://qelectrotech.org/forum/viewtopic.php?pid=5674#p5674'>howto</a><br>2. pip3 install qet_tb_generator<br><B><U> Update on macOSX</B></U><br> pip3 install --upgrade qet_tb_generator<br> Installation des Plugins qet_tb_generator:<br>Besuche <br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><B><U> Erstinstallation unter macOSX</B></U><br>1. Falls erforderlich, installiere das Python 3.11-Bundle: <a href='https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg'>python-3.11.2-macos11.pkg</a><br>2. Führe das Skript Profile.command aus<br>da das Programm einen festgelegten PATH zur Lokalisierung des Plugins qet-tb-generator verwendet.<br>Besuche :<br><a href='https://qelectrotech.org/forum/viewtopic.php?pid=5674#p5674'>Anleitung</a><br>3. pip3 install qet_tb_generator<br><B><U> Aktualisierung unter macOS</B></U><br> pip3 install --upgrade qet_tb_generator<br> - + To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><br>Requires python 3.5 or above.<br><br><B><U> First install on Linux</B></U><br>1. check you have pip3 installed: pip3 --version<br>If not install with: sudo apt-get install python3-pip<br>2. Install the program: sudo pip3 install qet_tb_generator<br>3. Run the program: qet_tb_generator<br><br><B><U> Update on Linux</B></U><br>sudo pip3 install --upgrade qet_tb_generator<br> Installation des Plugins qet_tb_generator:<br>Besuche <br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><br>Erfordert Python 3.5 oder höher.<br><br><B><U> Erstinstallation unter Linux</B></U><br>1. Überprüfe, ob pip3 installiert ist: pip3 --version<br>Falls nicht, installiere es mit: sudo apt-get install python3-pip<br>2. Installiere das Programm: sudo pip3 install qet_tb_generator<br>3. Starte das Programm: qet_tb_generator<br><br><B><U> Aktualisierung unter Linux</B></U><br>sudo pip3 install --upgrade qet_tb_generator<br> - + Error launching qet_tb_generator plugin Fehler beim Ausführen vom Plugin qet_tb_generator @@ -10614,15 +10649,15 @@ Möchten Sie sie ersetzen? Einfügen + + + - - - this is an error in the code dies ist ein Programmfehler @@ -10956,7 +10991,7 @@ Bitte laden Sie diese über den Link herunter und entpacken Sie sie in den Insta Ajouter un folio undo command text - Neue Folie hinzufügen + Neue Seite hinzufügen @@ -11474,7 +11509,7 @@ Bitte fügen Sie eine neue Tabelle hinzu oder passen Sie die vorhandene Tabelle Folio : - Foliennummer: + Seitennummer: @@ -11509,10 +11544,10 @@ Les variables suivantes sont utilisables : - %total : nombre total de folios dans le projet - %autonum : Folio Auto Numeration In der Schriftfeld-Vorlage als %folio verfügbar. -Folgende Variablen stehen im Feld Folie zur Verfügung: -%id: Seitennummer der Folie im Projekt -%total: Anzahl der Folien im Projekt -%autonum: Automatische Foliennummerierung +Folgende Variablen stehen im Feld Seite zur Verfügung: +%id: Seitennummer der Seite im Projekt +%total: Anzahl der Seiten im Projekt +%autonum: Automatische Seitennummerierung @@ -11558,7 +11593,7 @@ die Variable "volta" kombiniert mit dem Wert "1745" lässt i Label de report de folio - Querverweistext der Folienverweise + Querverweistext der Seitenverweise @@ -11572,8 +11607,8 @@ Créer votre propre texte en vous aidant des variables suivantes : %c : le numéro de colonne Sie können eigene Querverweistexte definieren. Folgende Variablen sind verfügbar: -%f: Seitennummer der Folie -%F: Foliennummer +%f: Seitennummer der Seite +%F: Seitennummer %M: Anlage %LM: Ort %l: Zeilennummer @@ -11615,7 +11650,7 @@ Folgende Variablen sind verfügbar: Champ texte de folio - Textfeld in Folie + Textfeld in Seite @@ -11625,12 +11660,12 @@ Folgende Variablen sind verfügbar: <html><head/><body><p>Définir les propriétés à remplacer dans les folios</p></body></html> - <html><head/><body><p>Zu ersetzende Folieneigenschaften definieren</p></body></html> + <html><head/><body><p>Zu ersetzende Seiteneigenschaften definieren</p></body></html> Folio - Folie + Seite @@ -11710,7 +11745,7 @@ Folgende Variablen sind verfügbar: Folios - Folien + Seiten @@ -11740,7 +11775,7 @@ Folgende Variablen sind verfügbar: Eléments report de folio - Folienverweise + Seitenverweise @@ -11750,17 +11785,17 @@ Folgende Variablen sind verfügbar: Sélectionner les éléments de ce folio - Bauteile auf dieser Folie auswählen + Bauteile auf dieser Seite auswählen Sélectionner les conducteurs de ce folio - Leiter auf dieser Folie auswählen + Leiter auf dieser Seite auswählen Sélectionner les textes de ce folio - Texte auf dieser Folie auswählen + Texte auf dieser Seite auswählen @@ -11867,7 +11902,7 @@ Folgende Variablen sind verfügbar: Folio Autonumérotation title window - Automatische Foliennummerierung + Automatische Seitennummerierung @@ -11884,7 +11919,7 @@ Si le chiffre défini dans le champ Valeur possède moins de digits que le type Le champ "Incrémentation" n'est pas utilisé. help dialog about the folio autonumerotation - In diesem Dialog können Sie die Nummerierungsregel für neu angelegte Folien definieren. + In diesem Dialog können Sie die Nummerierungsregel für neu angelegte Seiten definieren. - Eine Nummerierungsregel beinhaltet mindestens eine Variable. - Variablen können mittels Knöpfe - und + gelöscht bzw. hinzugefügt werden. - Eine Variable beinhaltet: einen Typ, einen Wert und eine Inkrementierung. @@ -11929,10 +11964,10 @@ Vorangestellte Nullen werden hinzugefügt falls der Startwert vom Feld "Wer - Der Typ "Text" steht für einen fixen Text. In diesem Fall wird das Feld "Inkrementierung" ignoriert. -- Der Typ "Foliennummer" steht für die Seitennummer der Folie. +- Der Typ "Seitennummer" steht für die Seitennummer der Seite. Andere Felder werden nicht verwendet. -- Der Typ "Folie" steht für die Foliennummer. +- Der Typ "Seite" steht für die Seitennummer. Andere Felder werden nicht verwendet. @@ -11973,10 +12008,10 @@ Vorangestellte Nullen werden hinzugefügt falls der Startwert vom Feld "Wer - Der Typ "Text" steht für einen fixen Text. In diesem Fall wird das Feld "Inkrementierung" ignoriert. -- Der Typ "Foliennummer" steht für die Seitennummer der Folie. +- Der Typ "Seitennummer" steht für die Seitennummer der Seite. Andere Felder werden nicht verwendet. -- Der Typ "Folie" steht für die Foliennummer. +- Der Typ "Seite" steht für die Seitennummer. Andere Felder werden nicht verwendet. @@ -12145,28 +12180,28 @@ Andere Felder werden nicht verwendet. Stammfunktioneigenschaften bearbeiten - + Modifier le trait d'une forme Linie einer Form ändern - + Modifier le remplissage d'une forme Füllung einer Form ändern - + Fermer le polygone Polygon schliessen - - + + Modifier une forme simple Geometrische Form ändern - + Modifier les propriétés d'une forme simple Eigenschaften einer geometrischen Form ändern @@ -15131,32 +15166,32 @@ Andere Felder werden nicht verwendet. TitleBlockPropertiesWidget - + Modèle par défaut Standardvorlage - + Éditer ce modèle menu entry Vorlage bearbeiten - + Dupliquer et éditer ce modèle menu entry Vorlage kopieren und bearbeiten - + Title block templates actions Aktionen zum Schriftfeld - - + + Créer un Folio Numérotation Auto - Neue auto-nummerierte Folie anlegen + Neue auto-nummerierte Seite anlegen @@ -15171,7 +15206,7 @@ Andere Felder werden nicht verwendet. Folio : - Foliennummer: + Seitennummer: @@ -15241,10 +15276,10 @@ Les variables suivantes sont utilisables : - %total : nombre total de folios dans le projet - %autonum : Folio Auto Numeration In Schriftfeld-Vorlagen als %folio verfügbar. -Folgende Variablen stehen im Feld Folie zur Verfügung: -%id: Seitennummer der Folie im Projekt -%total: Anzahl der Folien im Projekt -%autonum: Automatische Foliennummerierung +Folgende Variablen stehen im Feld Seite zur Verfügung: +%id: Seitennummer der Seite im Projekt +%total: Anzahl der Seiten im Projekt +%autonum: Automatische Seitennummerierung @@ -15254,7 +15289,7 @@ Folgende Variablen stehen im Feld Folie zur Verfügung: <html><head/><body><p>Affiche le cartouche en bas (horizontalement) ou à droite (verticalement) du folio.</p></body></html> - <html><head/><body><p>Zeigt das Schriftfeld unter der Folie (waagerecht) oder rechts davon (senkrecht) an.</p></body></html> + <html><head/><body><p>Zeigt das Schriftfeld unter der Seite (waagerecht) oder rechts davon (senkrecht) an.</p></body></html> @@ -15312,13 +15347,13 @@ die Variable "volta" kombiniert mit dem Wert "1745" lässt i TitleBlockTemplate - + %1 : %2 titleblock content - please let the blank space at the beginning %1: %2 - + %1 %1 @@ -15354,7 +15389,7 @@ die Variable "volta" kombiniert mit dem Wert "1745" lässt i Attention : les bordures des cellules vides n'apparaissent pas lors du rendu final sur le folio. - Achtung: der Rahmen von leeren Zellen wird nicht auf der Folie angezeigt. + Achtung: der Rahmen von leeren Zellen wird nicht auf der Seite angezeigt. @@ -15462,12 +15497,12 @@ die Variable "volta" kombiniert mit dem Wert "1745" lässt i Par défaut, les variables suivantes sont disponibles :<ul><li>%{author} : auteur du folio</li><li>%{date} : date du folio</li><li>%{title} : titre du folio</li><li>%{filename} : nom de fichier du projet</li><li>%{plant} : nom de l'installation (=) dans laquelle se trouve le folio</li><li>%{locmach} : nom de la localisation (+) dans laquelle se trouve le folio</li><li>%{indexrev} : indice de révision du folio</li><li>%{version} : version du logiciel</li><li>%{folio} : numéro du folio</li><li>%{folio-id} : position du folio dans le projet</li><li>%{folio-total} : nombre total de folios dans le projet</li><li>%{previous-folio-num} : numéro du folio précédent</li><li>%{next-folio-num} : numéro du folio suivant</li><li>%{projecttitle} : titre du projet</li><li>%{projectpath} : chemin du projet</li><li>%{projectfilename} : nom du fichier</li><li>%{saveddate} : date d'enregistrement du fichier format local</li><li>%{saveddate-eu} : date d'enregistrement du fichier format dd-MM-yyyy</li><li>%{saveddate-us} : date d'enregistrement du fichier format yyyy-MM-dd</li><li>%{savedtime} : heure d'enregistrement du fichier</li><li>%{savedfilename} : nom du fichier enregistré</li><li>%{savedfilepath} : chemin du fichier enregistré</li></ul> - Standardmäßig sind die folgenden Variablen verfügbar:<ul><li>%{author}: Autor der Folie </li><li>%{date}: Datum der Folie</li><li>%{title}: Titel der Folie</li><li>%{filename}: Dateiname des Projekts</li><li>%{plant}: Name der Anlage (=), zu der die Folie gehört</li><li>%{locmach}: Name des Ortes (+), zu dem die Folie gehört</li><li>%{indexrev}: Revisionsindex der Folie</li><li>%{version}: Softwareversion</li><li>%{folio}: Foliennummer</li><li>%{folio-id}: Seitennummer der Folie</li><li>%{folio-total}: Anzahl der Folien im Projekt</li><li>%{previous-folio-num}: Nummer der vorherigen Folie</li><li>%{next-folio-num}: Nummer der nächsten Folie</li><li>%{projecttitle}: Titel des Projekts</li><li>%{projectpath}: Projektpfad</li><li>%{projectfilename}: Name der Projektdatei</li><li>%{saveddate}: Speicherdatum der Dateim im lokalen Format</li><li>%{saveddate-eu}: Speicherdatum der Datei im Format TT-MM-JJJJ</li><li>%{saveddate-us}: Speicherdatum der Datei im Format JJJJ-MM-TT</li><li>%{savedtime}: Zeitpunkt des Speicherns der Datei</li><li>%{savedfilename}: Name der gespeicherten Datei</li><li>%{savedfilepath}: Pfad zur gespeicherten Datei</li></ul> + Standardmäßig sind die folgenden Variablen verfügbar:<ul><li>%{author}: Autor der Seite </li><li>%{date}: Datum der Seite</li><li>%{title}: Titel der Seite</li><li>%{filename}: Dateiname des Projekts</li><li>%{plant}: Name der Anlage (=), zu der die Seite gehört</li><li>%{locmach}: Name des Ortes (+), zu dem die Seite gehört</li><li>%{indexrev}: Revisionsindex der Seite</li><li>%{version}: Softwareversion</li><li>%{folio}: Seitennummer</li><li>%{folio-id}: Seitennummer der Seite</li><li>%{folio-total}: Anzahl der Seiten im Projekt</li><li>%{previous-folio-num}: Nummer der vorherigen Seite</li><li>%{next-folio-num}: Nummer der nächsten Seite</li><li>%{projecttitle}: Titel des Projekts</li><li>%{projectpath}: Projektpfad</li><li>%{projectfilename}: Name der Projektdatei</li><li>%{saveddate}: Speicherdatum der Dateim im lokalen Format</li><li>%{saveddate-eu}: Speicherdatum der Datei im Format TT-MM-JJJJ</li><li>%{saveddate-us}: Speicherdatum der Datei im Format JJJJ-MM-TT</li><li>%{savedtime}: Zeitpunkt des Speicherns der Datei</li><li>%{savedfilename}: Name der gespeicherten Datei</li><li>%{savedfilepath}: Pfad zur gespeicherten Datei</li></ul> Chaque cellule d'un cartouche affiche une valeur, optionnellement précédée d'un label. Tous deux peuvent être traduits en plusieurs langues.<br/>Comme ce que vous éditez actuellement est un <em>modèle</em> de cartouche, ne saisissez pas directement des données brutes : insérez plutôt des variables sous la forme %{nom-de-variable}, qui seront ensuite remplacées par les valeurs adéquates sur le folio. - Jede Zelle des Schriftfelds zeigt einen Wert und optional einen vorangestelltes Label an. Beide Elemente können in verschiedene Sprachen übersetzt werden.<br/>Gerade wird eine <em>Vorlage</em> für ein Schriftfeld bearbeitet. Tragen Sie keine statischen Daten ein: Nutzen Sie eher Variablen in der Form %{Variablenname}, um deren Werte im Schriftfeld der Folie anzuzeigen. + Jede Zelle des Schriftfelds zeigt einen Wert und optional einen vorangestelltes Label an. Beide Elemente können in verschiedene Sprachen übersetzt werden.<br/>Gerade wird eine <em>Vorlage</em> für ein Schriftfeld bearbeitet. Tragen Sie keine statischen Daten ein: Nutzen Sie eher Variablen in der Form %{Variablenname}, um deren Werte im Schriftfeld der Seite anzuzeigen. @@ -15490,13 +15525,13 @@ die Variable "volta" kombiniert mit dem Wert "1745" lässt i TitleBlockTemplateLocationChooser - + Collection parente used in save as form Zugewiesene Sammlung - + Modèle existant used in save as form Vorhandene Vorlage überschreiben @@ -15556,89 +15591,89 @@ die Variable "volta" kombiniert mit dem Wert "1745" lässt i - + Renommer Umbenennen - + Type : Typ: - + Logo déjà existant Logo schon vorhanden - + Remplacer Ersetzen - + Il existe déjà un logo portant le nom "%1" au sein de ce modèle de cartouche. Voulez-vous le remplacer ou préférez-vous spécifier un autre nom pour ce nouveau logo ? Es existiert bereits ein Logo mit dem Namen "%1" in dieser Schriftfeld-Vorlage. Vorhandenes Logo ersetzen oder neues Logo umbenennen? - + Type : %1 Typ: %1 - + Choisir une image / un logo Logo / Bild auswählen - + Images vectorielles (*.svg);;Images bitmap (*.png *.jpg *.jpeg *.gif *.bmp *.xpm);;Tous les fichiers (*) Vektorbilder (*.svg);;Pixelbilder (*.png *.jpg *.jpeg *.gif *.bmp *.xpm);;Alle Dateien (*) - - + + Erreur Fehler - + Impossible d'ouvrir le fichier spécifié Öffnen der Datei nicht möglich - + Choisir un fichier pour exporter ce logo Datei zum Exportieren vom Logo auswählen - + Tous les fichiers (*);;Images vectorielles (*.svg);;Images bitmap (*.png *.jpg *.jpeg *.gif *.bmp *.xpm) Alle Dateien (*);;Vektorbilder (*.svg);;Pixelbilder (*.png *.jpg *.jpeg *.gif *.bmp *.xpm) - + Impossible d'exporter vers le fichier spécifié Exportieren zur Zieldatei nicht möglich - + Renommer un logo Logo umbenennen - + Vous devez saisir un nouveau nom. Sie müssen einen neuen Namen eingeben. - + Le nouveau nom ne peut pas être vide. Der neue Name darf nicht leer sein. - + Le nom saisi est déjà utilisé par un autre logo. Der angegebene Name ist bereits für ein anderes Logo benutzt. @@ -15742,32 +15777,36 @@ die Variable "volta" kombiniert mit dem Wert "1745" lässt i %1px - + %1px %1px - + Changer la largeur de l'aperçu Breite der Vorschau bearbeiten - + Largeur de l'aperçu : Breite der Vorschau: - - Longueur minimale : %1px -Longueur maximale : %2px + + Attention : la somme des largeurs relatives dépasse 100%% de la largeur totale, ce modèle de cartouche ne peut être satisfait par aucune largeur. - tooltip showing the minimum and/or maximum width of the edited template - Minimale Länge: %1px -Maximale Länge: %2px - + tooltip warning shown when a template's relative-to-total-length columns alone already exceed 100%% of the total width + - + + Attention : les colonnes de largeur fixe ne peuvent pas tenir dans la largeur restante, ce modèle de cartouche ne peut être satisfait par aucune largeur. + + tooltip warning shown when a template's relative-to-total-length columns already consume all available width, leaving no room for its fixed-width columns + + + + Longueur minimale : %1px tooltip showing the minimum width of the edited template @@ -15775,7 +15814,21 @@ Maximale Länge: %2px - + + Longueur maximale : %1px + + tooltip showing the maximum width of the edited template + + + + + Longueur non contrainte. + + tooltip shown when the edited template has neither a minimum nor a maximum width constraint + + + + Largeur totale pour cet aperçu : %1px displayed at the top of the preview when editing a title block template Gesamtbreite der Vorschau: %1px @@ -15986,8 +16039,8 @@ Maximale Länge: %2px %M: Installation %LM: Localisation Folgende Variablen sind verfügbar: -%f: Seitennummer der Folie -%F: Foliennummer +%f: Seitennummer der Seite +%F: Seitennummer %l: Zeilennummer %c: Spaltennummer %M: Anlage @@ -16041,7 +16094,7 @@ Maximale Länge: %2px En bas de page - Im unteren Bereich der Folie + Im unteren Bereich der Seite @@ -16109,7 +16162,7 @@ Maximale Länge: %2px Folio sans titre - Folie ohne Titel + Seite ohne Titel @@ -16154,27 +16207,27 @@ Maximale Länge: %2px qdesigner_internal::RichTextEditorDialog - + Edit text Text bearbeiten - + Rich Text Rich Text - + Source Quelltext - + &OK &OK - + &Cancel Abbre&chen @@ -16244,7 +16297,7 @@ Maximale Länge: %2px B&ild einfügen - + Simplify Rich Text Simplify Rich Text @@ -16279,7 +16332,7 @@ Maximale Länge: %2px Folio - Folie + Seite diff --git a/sources/PropertiesEditor/propertieseditordialog.h b/sources/PropertiesEditor/propertieseditordialog.h index b76b5c422..50cb96aef 100644 --- a/sources/PropertiesEditor/propertieseditordialog.h +++ b/sources/PropertiesEditor/propertieseditordialog.h @@ -46,6 +46,18 @@ class PropertiesEditorDialog : public QDialog PropertiesEditorDialog(T editor, QWidget *parent = nullptr) : QDialog (parent) { + // Without this, a QWidget-modal QDialog with a parent falls + // back to macOS's automatic sheet presentation, which some + // Qt/Cocoa versions render stuck centered on screen and + // non-draggable rather than as a proper attached sheet + // (bugtracker #275). Other dialogs in this codebase already + // opt in explicitly (see ElementDialog, DiagramPropertiesDialog) + // -- this one was missing it. + setWindowModality(Qt::WindowModal); +#ifdef Q_OS_MACOS + setWindowFlags(Qt::Sheet); +#endif + //Set dialog title setWindowTitle(editor->title()); // Reparent the editor, diff --git a/sources/SearchAndReplace/ui/searchandreplacewidget.cpp b/sources/SearchAndReplace/ui/searchandreplacewidget.cpp index 7f76d33f9..af229b0c5 100644 --- a/sources/SearchAndReplace/ui/searchandreplacewidget.cpp +++ b/sources/SearchAndReplace/ui/searchandreplacewidget.cpp @@ -1020,6 +1020,7 @@ void SearchAndReplaceWidget::on_m_tree_widget_currentItemChanged( { m_highlighted_element = elmt; elmt.data()->setHighlighted(true); + elmt.data()->ensureVisible(); } } else if (m_text_hash.contains(current)) @@ -1029,6 +1030,7 @@ void SearchAndReplaceWidget::on_m_tree_widget_currentItemChanged( { text.data()->setSelected(true); m_last_selected = text; + text.data()->ensureVisible(); } } else if (m_conductor_hash.contains(current)) @@ -1038,6 +1040,7 @@ void SearchAndReplaceWidget::on_m_tree_widget_currentItemChanged( { cond.data()->setSelected(true); m_last_selected = cond; + cond.data()->ensureVisible(); } } diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp index ee94b3b77..704be3f35 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp @@ -19,6 +19,7 @@ #include #include +#include namespace TerminalStripDrawer { diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h index 8aa96be35..26de183b4 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h @@ -19,6 +19,7 @@ #define TERMINALSTRIPDRAWER_H #include +#include #include "properties/terminalstriplayoutpattern.h" diff --git a/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp b/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp index fe9c5f809..5ab386c57 100644 --- a/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp +++ b/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp @@ -28,6 +28,8 @@ #include "../terminalstrip.h" #include "../../qetinformation.h" +#include + TerminalStripTreeDockWidget::TerminalStripTreeDockWidget(QETProject *project, QWidget *parent) : QDockWidget(parent), ui(new Ui::TerminalStripTreeDockWidget) diff --git a/sources/TerminalStrip/ui/terminalstriptreedockwidget.h b/sources/TerminalStrip/ui/terminalstriptreedockwidget.h index e611c002b..142d72f97 100644 --- a/sources/TerminalStrip/ui/terminalstriptreedockwidget.h +++ b/sources/TerminalStrip/ui/terminalstriptreedockwidget.h @@ -20,6 +20,7 @@ #include #include +#include class QETProject; class QTreeWidgetItem; diff --git a/sources/editor/ui/dynamictextfieldeditor.cpp b/sources/editor/ui/dynamictextfieldeditor.cpp index 145dd959a..b974ac430 100644 --- a/sources/editor/ui/dynamictextfieldeditor.cpp +++ b/sources/editor/ui/dynamictextfieldeditor.cpp @@ -31,6 +31,7 @@ #include #include #include +#include DynamicTextFieldEditor::DynamicTextFieldEditor(QETElementEditor *editor, PartDynamicTextField *text_field, @@ -141,9 +142,20 @@ void DynamicTextFieldEditor::updateForm() ui -> m_size_sb -> setValue(m_text_field.data() -> font().pointSize()); ui->m_keep_visual_rotation_cb->setChecked(m_text_field.data()->keepVisualRotation()); ui->m_rotation_point_center_cb->setChecked(m_text_field.data()->rotationPointCenter()); -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else - m_color_kpb -> setColor(m_text_field.data() -> color()); + //Block signals while loading the colour into the button. + //KColorButton::changed fires on a programmatic setColor() as well + //as on user interaction, and m_color_kpb_changed() applies the new + //colour to *every* selected part -- so merely showing the first + //part's colour would overwrite the colour of all the others. + //The other widgets above are immune because they are wired to + //user-only signals (editingFinished, clicked), which setValue() + //and setChecked() do not emit. + { + const QSignalBlocker blocker(m_color_kpb); + m_color_kpb -> setColor(m_text_field.data() -> color()); + } #endif ui -> m_width_sb -> setValue(m_text_field.data() -> textWidth()); ui -> m_font_pb -> setText(m_text_field -> font().family()); @@ -170,7 +182,7 @@ void DynamicTextFieldEditor::updateForm() void DynamicTextFieldEditor::setupWidget() { -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else m_color_kpb = new KColorButton(this); m_color_kpb->setObjectName(QString::fromUtf8("m_color_kpb")); diff --git a/sources/editor/ui/dynamictextfieldeditor.h b/sources/editor/ui/dynamictextfieldeditor.h index e2f4662e3..726ff9694 100644 --- a/sources/editor/ui/dynamictextfieldeditor.h +++ b/sources/editor/ui/dynamictextfieldeditor.h @@ -21,7 +21,7 @@ #include "../elementitemeditor.h" #include "../graphicspart/partdynamictextfield.h" -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else # include #endif @@ -79,7 +79,7 @@ class DynamicTextFieldEditor : public ElementItemEditor { QList m_parts; QList m_connection_list; - #ifdef BUILD_WITHOUT_KF5 + #ifdef BUILD_WITHOUT_KF #else KColorButton* m_color_kpb = nullptr; #endif diff --git a/sources/editor/ui/terminaleditor.cpp b/sources/editor/ui/terminaleditor.cpp index 6456978e7..f3d23b7d9 100644 --- a/sources/editor/ui/terminaleditor.cpp +++ b/sources/editor/ui/terminaleditor.cpp @@ -40,7 +40,7 @@ TerminalEditor::TerminalEditor(QETElementEditor *editor, QWidget *parent) : { ui->setupUi(this); -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF m_color_pb = new QPushButton(this); m_color_pb->setMinimumSize(40, 24); connect(m_color_pb, &QPushButton::clicked, this, &TerminalEditor::labelColorClicked); @@ -93,7 +93,7 @@ void TerminalEditor::updateForm() ui->m_label_rotation_sb->setValue(static_cast(m_part->labelRotation())); ui->m_label_frame_cb->setChecked(m_part->labelFrame()); -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF QPixmap px(16, 16); px.fill(m_part->labelColor()); m_color_pb->setIcon(QIcon(px)); @@ -410,7 +410,7 @@ void TerminalEditor::labelColorClicked() if (m_locked) return; m_locked = true; -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF QColor new_color = QColorDialog::getColor(m_part->labelColor(), this); if (new_color.isValid() && m_part->labelColor() != new_color) { auto undo = new QPropertyUndoCommand(m_part, "label_color", m_part->labelColor(), new_color); diff --git a/sources/editor/ui/terminaleditor.h b/sources/editor/ui/terminaleditor.h index d0ebf6098..7c15d9f2c 100644 --- a/sources/editor/ui/terminaleditor.h +++ b/sources/editor/ui/terminaleditor.h @@ -21,7 +21,7 @@ #include #include "../elementitemeditor.h" -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #include #else #include @@ -78,7 +78,7 @@ class TerminalEditor : public ElementItemEditor m_change_connections; PartTerminal *m_part = nullptr; bool m_locked = false; -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF QPushButton *m_color_pb; #else KColorButton *m_color_pb; diff --git a/sources/editor/ui/texteditor.cpp b/sources/editor/ui/texteditor.cpp index fd0b3e74f..db600d147 100644 --- a/sources/editor/ui/texteditor.cpp +++ b/sources/editor/ui/texteditor.cpp @@ -63,7 +63,7 @@ void TextEditor::updateForm() m_rotation_sb -> setValue(m_text -> rotation()); m_size_sb -> setValue(m_text -> font().pointSize()); m_font_pb -> setText(m_text -> font().family()); -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else m_color_pb -> setColor(m_text -> defaultTextColor()); #endif @@ -346,7 +346,7 @@ void TextEditor::setUpWidget(QWidget *parent) m_line_edit->setPlaceholderText(tr("Entrer votre texte ici")); gridLayout->addWidget(m_line_edit, 0, 0, 1, 6); -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else m_color_pb = new KColorButton(parent); m_color_pb->setObjectName(QString::fromUtf8("m_color_pb")); diff --git a/sources/editor/ui/texteditor.h b/sources/editor/ui/texteditor.h index 7dd207eba..dd860ee10 100644 --- a/sources/editor/ui/texteditor.h +++ b/sources/editor/ui/texteditor.h @@ -25,7 +25,7 @@ #include #include #include -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else #include #endif @@ -65,7 +65,7 @@ class TextEditor : public ElementItemEditor { QSpinBox *m_size_sb; QLineEdit *m_line_edit; QPushButton *m_font_pb; -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else KColorButton *m_color_pb; #endif diff --git a/sources/newelementwizard.cpp b/sources/newelementwizard.cpp index afa30fa9e..3cd3870e8 100644 --- a/sources/newelementwizard.cpp +++ b/sources/newelementwizard.cpp @@ -252,4 +252,10 @@ void NewElementWizard::createNewElement() loc_.addToPath(m_chosen_file); edit_new_element -> setLocation(loc_); edit_new_element -> show(); + // Without this, the just-closed wizard can leave the main window + // as the active/key window (bugtracker #281, reported on macOS): + // the new editor is created and shown, but stays behind the main + // window and doesn't surface in the Dock/Windows menu. + edit_new_element -> raise(); + edit_new_element -> activateWindow(); } diff --git a/sources/pdf_links.cpp b/sources/pdf_links.cpp index b4ce86a5e..4e5a7d354 100644 --- a/sources/pdf_links.cpp +++ b/sources/pdf_links.cpp @@ -23,8 +23,8 @@ #include "qetgraphicsitem/element.h" #include "qetgraphicsitem/elementtextitemgroup.h" -// Private Qt PDF engine for drawHyperlink() — not public API, stable since Qt4. -// Requires QT += gui-private in qelectrotech.pro / gui-private in CMake. +// Private Qt PDF engine for drawHyperlink() — not public API. +// Availability of Qt::GuiPrivate is verified at configure time in CMakeLists.txt. #include #include diff --git a/sources/print/projectprintwindow.cpp b/sources/print/projectprintwindow.cpp index b115ad5b7..d064ba574 100644 --- a/sources/print/projectprintwindow.cpp +++ b/sources/print/projectprintwindow.cpp @@ -28,8 +28,8 @@ #include "ui_projectprintwindow.h" -// Private Qt PDF engine for drawHyperlink() — not public API, stable since Qt4 -// Requires QT += gui-private in qelectrotech.pro +// Private Qt PDF engine for drawHyperlink() is not a public API. +// Availability of Qt::GuiPrivate is verified at configure time in CMakeLists.txt. #include #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove @@ -79,10 +79,14 @@ void ProjectPrintWindow::launchDialog(QETProject *project, QPrinter::OutputForma print_dialog.setWindowFlags(Qt::Sheet); #endif print_dialog.setWindowTitle(tr("Options d'impression", "window title")); - // setOptions() is the modern spelling of the Qt4-era - // setEnabledOptions() (removed in Qt 6): replace the enabled - // option set with just PrintShowPageSize, on Qt 5 and 6 alike. - print_dialog.setOptions(QAbstractPrintDialog::PrintShowPageSize); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove + print_dialog.setEnabledOptions(QAbstractPrintDialog::PrintShowPageSize); +#else +#if TODO_LIST +#pragma message("@TODO remove code for QT 6 or later") +#endif + qDebug()<<"Help code for QT 6 or later"; +#endif if (print_dialog.exec() == QDialog::Rejected) { delete printer_; return; @@ -108,7 +112,7 @@ QString ProjectPrintWindow::docName(QETProject *project) { QString doc_name; if (!project->filePath().isEmpty()) { - doc_name = QFileInfo(project->filePath()).baseName(); + doc_name = QFileInfo(project->filePath()).completeBaseName(); } else if (!project->title().isEmpty()) { doc_name = project->title(); doc_name = QET::stringToFileName(doc_name); diff --git a/sources/projectview.cpp b/sources/projectview.cpp index fa348277b..b1bcc5077 100644 --- a/sources/projectview.cpp +++ b/sources/projectview.cpp @@ -345,11 +345,19 @@ QString ProjectView::askUserForFilePath(bool assign) { // if no filepath is provided, return an empty string if (filepath.isEmpty()) return(filepath); - // if the name does not end with the .qet extension and we're _not_ using xdg-desktop-portal, append it - bool usesPortal = - qEnvironmentVariableIsSet("FLATPAK_ID") || - qEnvironmentVariableIsSet("SNAP_NAME"); - if (!filepath.endsWith(".qet", Qt::CaseInsensitive) && !usesPortal) filepath += ".qet"; + // Ensure the path ends with exactly one .qet extension, regardless of + // whether the active file dialog already appended one. Whether it does + // depends on which backend actually shows the dialog (Qt's own vs. the + // xdg-desktop-portal used by sandboxed Snap/Flatpak builds), and that + // isn't reliably predictable from environment variables alone -- an + // earlier attempt at that (only appending when *not* Snap/Flatpak, + // assuming the portal always appends it) left Snap saves with no + // extension at all whenever the portal didn't (bugtracker #270). + // Stripping any existing suffix first and re-appending it once is + // correct either way. + if (filepath.endsWith(".qet", Qt::CaseInsensitive)) + filepath.chop(4); + filepath += ".qet"; if (assign) { // assign the provided filepath to the currently edited project diff --git a/sources/projectview.h b/sources/projectview.h index 2f9b5c92a..dfbd03987 100644 --- a/sources/projectview.h +++ b/sources/projectview.h @@ -35,28 +35,28 @@ public: : QTabWidget(parent) {} - double temp_index = 0; - void wheelEvent(QWheelEvent *event) override { - int index = currentIndex(); - double delta = 0; - double scale_factor = 0.005; // Decrease or increase speed of mouse wheel (0.04 = decrease) - if (event->modifiers() & Qt::ControlModifier) { - if (index != -1) { - delta = event->delta() * scale_factor; // Read and scale the scroll value - if (delta > 0 && (temp_index > -1)) temp_index = temp_index - abs(delta); - if (delta < 0 && (temp_index < count())) temp_index = temp_index + abs(delta); + // Only intercept if Ctrl is held down + if (event->modifiers() & Qt::ControlModifier) { + int index = currentIndex(); + if (index != -1) { + // angleDelta().y() is usually 120 per click. + // Dividing by 120 gives you exactly +1 (scroll up) or -1 (scroll down) + int steps = event->angleDelta().y() / 120; - index = int (temp_index); - qDebug() << "index" << index << "temp_index" << temp_index << " " << event->delta() << delta; + if (steps != 0) { + int newIndex = index - steps; - if (index >= 0 && index < count()) - setCurrentIndex(index); - - // qDebug() << currentIndex(); + if (newIndex >= 0 && newIndex < count()) + setCurrentIndex(newIndex); } } + event->accept(); // Mark event handled so parent widgets don't process it + } else { + // Allow the default QTabWidget wheel behavior to process if Ctrl isn't held + QTabWidget::wheelEvent(event); + } } }; #endif diff --git a/sources/properties/xrefproperties.cpp b/sources/properties/xrefproperties.cpp index be0213c2b..bbb4e8b57 100644 --- a/sources/properties/xrefproperties.cpp +++ b/sources/properties/xrefproperties.cpp @@ -90,7 +90,7 @@ void XRefProperties::fromSettings(const QSettings &settings, m_slave_label = settings.value(prefix % "slave_label", "(%f-%l%c)").toString(); QMetaEnum var = QMetaEnum::fromType(); - m_xref_pos = Qt::AlignmentFlag(var.keyToValue((settings.value(prefix % "xrefpos").toString()).toStdString().data())); + m_xref_pos = Qt::AlignmentFlag(var.keyToValue((settings.value(prefix % "xrefpos", "AlignBottom").toString()).toStdString().data())); for (QString key : m_prefix_keys) { m_prefix.insert(key, settings.value(prefix + key % "prefix").toString()); diff --git a/sources/qetapp.cpp b/sources/qetapp.cpp index 5b7003c57..3baf3c73e 100644 --- a/sources/qetapp.cpp +++ b/sources/qetapp.cpp @@ -50,7 +50,7 @@ #include #include #include -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF # include "ui/nokde/kautosavefile.h" #else # include diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 97c062490..b0008f9f8 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -57,7 +57,7 @@ #include #include #include -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF # include "ui/nokde/kautosavefile.h" #else # include diff --git a/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp b/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp index 7ef031504..abfe1bf01 100644 --- a/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp +++ b/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp @@ -146,7 +146,7 @@ bool ProjectDBModel::setData(const QModelIndex &index, const QVariant &value, in return false; } m_index_0_0_data.insert(role, value); - emit dataChanged(index, index, QVector(role)); + emit dataChanged(index, index, {role}); return true; } @@ -332,7 +332,7 @@ void ProjectDBModel::dataBaseUpdated() auto row = m_record.size(); auto col = row ? m_record.first().count() : 1; - emit dataChanged(this->index(0,0), this->index(row-1, col-1), QVector(Qt::DisplayRole)); + emit dataChanged(this->index(0,0), this->index(row-1, col-1), {Qt::DisplayRole}); } } diff --git a/sources/qetmainwindow.cpp b/sources/qetmainwindow.cpp index 381fe9912..29a9ce619 100644 --- a/sources/qetmainwindow.cpp +++ b/sources/qetmainwindow.cpp @@ -155,6 +155,8 @@ void QETMainWindow::initCommonMenus() connect(settings_menu_, &QMenu::aboutToShow, this, &QETMainWindow::checkToolbarsmenu); help_menu_ = new QMenu(tr("&Aide", "window menu"), this); + help_menu_ -> addAction(diagnostics_action_); + help_menu_ -> addSeparator(); help_menu_ -> addAction(whatsthis_action_); help_menu_ -> addSeparator(); help_menu_ -> addAction(manual_online_); @@ -164,8 +166,6 @@ void QETMainWindow::initCommonMenus() help_menu_ -> addAction(donate_); help_menu_ -> addAction(about_qt_); help_menu_ -> addAction(about_qet_); - help_menu_ -> addSeparator(); - help_menu_ -> addAction(diagnostics_action_); #ifdef Q_OS_WIN32 upgrade_ -> setVisible(true); diff --git a/sources/qetproject.h b/sources/qetproject.h index 3817abad9..5ec4f4ae7 100644 --- a/sources/qetproject.h +++ b/sources/qetproject.h @@ -29,7 +29,7 @@ #include "titleblock/templatescollection.h" #include "titleblockproperties.h" #include "diagram.h" -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF # include "ui/nokde/kautosavefile.h" #else # include diff --git a/sources/shortcutmanager.cpp b/sources/shortcutmanager.cpp index 083c4a44a..a6792159c 100644 --- a/sources/shortcutmanager.cpp +++ b/sources/shortcutmanager.cpp @@ -21,6 +21,7 @@ #include #include #include +#include namespace { const QString SETTINGS_GROUP = QStringLiteral("shortcuts/"); @@ -143,7 +144,7 @@ void ShortcutManager::setSequence(const QString &id, const QKeySequence &sequenc settings.setValue(key, sequence.toString()); } - for (const QPointer &target : qAsConst(it->targets)) { + for (const QPointer &target : std::as_const(it->targets)) { if (target) { target->setProperty("shortcut", QVariant::fromValue(sequence)); } diff --git a/sources/titleblock/qettemplateeditor.cpp b/sources/titleblock/qettemplateeditor.cpp index 9dd025132..3a316f15b 100644 --- a/sources/titleblock/qettemplateeditor.cpp +++ b/sources/titleblock/qettemplateeditor.cpp @@ -776,7 +776,20 @@ bool QETTitleBlockTemplateEditor::saveAs(const TitleBlockTemplateLocation &locat elmt.setAttribute("name", location.name()); doc.appendChild(elmt); - collection -> setTemplateXmlDescription(location.name(), elmt); + if (!collection -> setTemplateXmlDescription(location.name(), elmt)) { + // Report the failure instead of marking the template "saved" + // regardless (bugtracker #251) -- this return value used to + // be discarded here. + QET::QetMessageBox::critical( + this, + tr("Erreur", "message box title"), + tr( + "Impossible d'enregistrer le modèle « %1 ».", + "message box content - %1 is a title block template name" + ).arg(location.name()) + ); + return(false); + } opened_from_file_ = false; location_ = location; @@ -880,6 +893,21 @@ bool QETTitleBlockTemplateEditor::saveAs() if (location.isValid()) { return(saveAs(location)); } + if (!location.name().isEmpty()) { + // The name was rejected (e.g. contains a path separator or + // other filesystem-reserved character) rather than the user + // cancelling the dialog -- say so instead of silently doing + // nothing (bugtracker #251). + QET::QetMessageBox::critical( + this, + tr("Erreur", "message box title"), + tr( + "Le nom « %1 » n'est pas valide : il ne doit pas contenir " + "les caractères suivants : \\ / : * ? \" < > |", + "message box content - %1 is the rejected template name" + ).arg(location.name()) + ); + } return(false); } diff --git a/sources/titleblock/templatelocation.cpp b/sources/titleblock/templatelocation.cpp index 4387d6412..6f01ce591 100644 --- a/sources/titleblock/templatelocation.cpp +++ b/sources/titleblock/templatelocation.cpp @@ -92,7 +92,13 @@ void TitleBlockTemplateLocation::setName(const QString &name) { */ bool TitleBlockTemplateLocation::isValid() const { - return(!name_.isEmpty()); + // The name becomes (part of) a filename on disk (see + // TitleBlockTemplatesFilesCollection::toFileName()). A name containing + // a path separator or another filesystem-reserved character silently + // fails to save instead of erroring, because it turns into an + // unintended subpath rather than a plain filename (bugtracker #251). + static const QRegularExpression invalid_chars_re(QStringLiteral("[\\\\/:*?\"<>|]")); + return(!name_.isEmpty() && !name_.contains(invalid_chars_re)); } /** diff --git a/sources/ui/configpage/shortcutsconfigpage.cpp b/sources/ui/configpage/shortcutsconfigpage.cpp index f5bf58f94..f13f12fe5 100644 --- a/sources/ui/configpage/shortcutsconfigpage.cpp +++ b/sources/ui/configpage/shortcutsconfigpage.cpp @@ -31,6 +31,7 @@ #include #include #include +#include /** @brief ShortcutsConfigPage::ShortcutsConfigPage @@ -198,7 +199,7 @@ void ShortcutsConfigPage::resetRow(int row_index) void ShortcutsConfigPage::resetAllRows() { - for (const Row &row : qAsConst(m_rows)) { + for (const Row &row : std::as_const(m_rows)) { row.edit->setKeySequence(row.default_sequence); } checkConflicts(); @@ -211,7 +212,7 @@ void ShortcutsConfigPage::resetAllRows() */ void ShortcutsConfigPage::applyConf() { - for (const Row &row : qAsConst(m_rows)) { + for (const Row &row : std::as_const(m_rows)) { ShortcutManager::instance().setSequence(row.id, row.edit->keySequence()); } } diff --git a/sources/ui/dynamicelementtextmodel.cpp b/sources/ui/dynamicelementtextmodel.cpp index f33128729..6ad12570a 100644 --- a/sources/ui/dynamicelementtextmodel.cpp +++ b/sources/ui/dynamicelementtextmodel.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include static int src_txt_row = 0; @@ -1595,6 +1596,15 @@ DynamicTextItemDelegate::DynamicTextItemDelegate(QObject *parent) : QStyledItemDelegate(parent) {} +void DynamicTextItemDelegate::commitAndCloseDeferred(QWidget *editor) const +{ + auto *self = const_cast(this); + QTimer::singleShot(0, self, [self, editor]() { + emit self->commitData(editor); + emit self->closeEditor(editor); + }); +} + QWidget *DynamicTextItemDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, @@ -1682,13 +1692,43 @@ QWidget *DynamicTextItemDelegate::createEditor( w->setProperty("ok", ok); } w->setObjectName("font_dialog"); + commitAndCloseDeferred(w); return w; } case DynamicElementTextModel::color: { - QColorDialog *cd = new QColorDialog(index.data(Qt::EditRole).value(), parent); - cd->setObjectName("color_dialog"); - return cd; + /* Like the font case above: run the dialog synchronously via + * its static convenience function and stash the result on a + * plain placeholder widget, rather than handing back the + * QColorDialog itself as the item view's "editor". + * + * The item view's own Enter/Escape handling (the base + * QStyledItemDelegate::eventFilter(), since "color_dialog" + * isn't one of the objectNames special-cased in this + * delegate's own eventFilter() above) treats whatever + * createEditor() returned as a small inline editor it + * commits and destroys directly on a key press. A QColorDialog + * is not that: on Windows it can hand off to the native + * color picker, whose own accept/close path then races the + * view's -- pressing Enter fired both, one tearing down an + * object the other was still using (case #323 on the bug + * tracker: "QObject::installEventFilter(): Cannot filter + * events for objects in a different thread" immediately + * followed by a segfault; clicking the dialog's own OK + * button with the mouse didn't reach the view's key + * handling, so it didn't crash). Resolving the dialog + * before returning removes the second, competing teardown + * path entirely. */ + QColor color = QColorDialog::getColor(index.data(Qt::EditRole).value(), parent); + QWidget *w = new QWidget(parent); + if (color.isValid()) + { + w->setProperty("color", color); + w->setProperty("ok", true); + } + w->setObjectName("color_dialog"); + commitAndCloseDeferred(w); + return w; } case DynamicElementTextModel::pos: { @@ -1788,15 +1828,15 @@ void DynamicTextItemDelegate::setModelData( { if(QStandardItem *qsi = qsim->itemFromIndex(index)) { - QColorDialog *cd = static_cast (editor); - if (cd->result() == QDialog::Accepted) + if (editor->property("ok").toBool() == true) { - qsi->setData(cd->selectedColor(), Qt::EditRole); - qsi->setData(cd->selectedColor(), Qt::ForegroundRole); + QColor color = editor->property("color").value(); + qsi->setData(color, Qt::EditRole); + qsi->setData(color, Qt::ForegroundRole); } return; } - + } } else if (editor->objectName() == "info_text") diff --git a/sources/ui/dynamicelementtextmodel.h b/sources/ui/dynamicelementtextmodel.h index 67b42e23e..013d9318b 100644 --- a/sources/ui/dynamicelementtextmodel.h +++ b/sources/ui/dynamicelementtextmodel.h @@ -155,6 +155,21 @@ class DynamicTextItemDelegate : public QStyledItemDelegate private: QStringList availableInfo(DynamicElementTextItem *deti) const; + /** + @brief commitAndCloseDeferred + Schedule commitData()/closeEditor() for @a editor on the next + event loop iteration. For editors resolved synchronously inside + createEditor() (font/color, both run their picker dialog before + returning) there is no user interaction left to drive the base + QStyledItemDelegate::eventFilter()'s usual Enter/focus-out commit + path, so without this the value sits picked-but-uncommitted + until something unrelated (e.g. clicking elsewhere) happens to + trigger it. Deferred rather than called immediately: the view + only registers the widget createEditor() returns as "the active + editor" *after* createEditor() itself returns, so emitting here + would target an editor the view doesn't know about yet. + */ + void commitAndCloseDeferred(QWidget *editor) const; }; #endif // DYNAMICELEMENTTEXTMODEL_H diff --git a/tests/catch/CMakeLists.txt b/tests/catch/CMakeLists.txt index 78118032c..aa7872bd1 100644 --- a/tests/catch/CMakeLists.txt +++ b/tests/catch/CMakeLists.txt @@ -90,7 +90,7 @@ add_executable( ${QET_DIR}/sources/borderproperties.h ) -if(NOT BUILD_WITH_KF5) +if(NOT BUILD_WITH_KF) target_sources( ${PROJECT_NAME} PRIVATE @@ -109,7 +109,7 @@ target_link_libraries( PUBLIC Catch2::Catch2 PRIVATE - ${KF5_PRIVATE_LIBRARIES} + ${KF_PRIVATE_LIBRARIES} ${QET_PRIVATE_LIBRARIES}) if (DEFINED ENV{CATCH_INCLUDE_DIR}) diff --git a/tests/googlemock/CMakeLists.txt b/tests/googlemock/CMakeLists.txt index db29ef8c9..a8e4dbb76 100644 --- a/tests/googlemock/CMakeLists.txt +++ b/tests/googlemock/CMakeLists.txt @@ -85,6 +85,6 @@ target_link_libraries( PUBLIC gmock gmock_main PRIVATE - ${KF5_PRIVATE_LIBRARIES} + ${KF_PRIVATE_LIBRARIES} ${QET_PRIVATE_LIBRARIES}) diff --git a/tests/googletest/CMakeLists.txt b/tests/googletest/CMakeLists.txt index bcc85b4de..4ed488f57 100644 --- a/tests/googletest/CMakeLists.txt +++ b/tests/googletest/CMakeLists.txt @@ -84,6 +84,6 @@ target_link_libraries( PUBLIC gtest gtest_main PRIVATE - ${KF5_PRIVATE_LIBRARIES} + ${KF_PRIVATE_LIBRARIES} ${QET_PRIVATE_LIBRARIES}) diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index 41137a3e5..6908716ff 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -74,6 +74,6 @@ target_link_libraries( ${PROJECT_NAME} PRIVATE Qt::Test - ${KF5_PRIVATE_LIBRARIES} + ${KF_PRIVATE_LIBRARIES} ${QET_PRIVATE_LIBRARIES})