Wie erzwinge ich, dass die Qt-Anwendung über sudo ausgeführt wird, um die Konfiguration von Benutzerthemen / Schriftarten zu verwenden?

1139
HeliTux

jeder.

Ich entwickle Anwendungen in Qt5, aber es erfordert Hardware-Zugriff auf niedriger Ebene und muss daher als Root ausgeführt werden. Meine Zielbetriebssysteme sind Debian (ARM) und Ubuntu (x86).

Das Problem ist, dass alle Apps, die als root (über sudo) ausgeführt werden, root-Einstellungen und die Umgebung verwenden.

Ich muss Qt App irgendwie dazu zwingen, dasselbe Design und dieselben Zeichensätze wie normale Benutzer auszuführen.

Ist das irgendwie möglich? Wie das Ausführen über ein Shell-Skript mit zusätzlichen Ausführungsparametern und Befehlen?

Hier sind Screenshots, um den Unterschied zu zeigen:

Qt App läuft als root via sudo

Qt App läuft als Benutzer

0
Bessere Lösung IMHO: Hardwareabhängige Komponente abspalten, API einwickeln und als separaten Prozess als Root ausführen. Dann kann der Qt-GUI-Teil als Benutzer ausgeführt werden. Dies erleichtert auch das Hinzufügen weiterer UIs, z. B. der Befehlszeile. dirkt vor 6 Jahren 2
Ich bin der zweite Vorschlag von Dirkt. Alternativ können Sie der ausführbaren Datei die erforderlichen POSIX-Funktionen (z. B. "CAP_SYS_RAWIO") hinzufügen und die Funktion nur in den Programmteilen aktivieren, in denen sie wirklich benötigt wird. Siehe "Man 7-Fähigkeiten". Das Ausführen von GUI-Programmen als root wird im Allgemeinen als schlechte Idee betrachtet, da sie eine riesige Menge an Software (z. B. Qt) enthalten, die für diese Art von Verwendung nicht geprüft wurde. Johan Myréen vor 6 Jahren 0
Nun, ich bin kein großartiger Entwickler, um alles in API umzusetzen. Ich habe einige Jahre lang C ++ - CLI-Apps entwickelt, aber für Qt-Implementierungen noch recht neu. Ich verwende die hidapi-Bibliothek von signal11, das ist die Hauptimplementierung auf HW-Ebene (mit meinen kleinen Anpassungen). Meine erste Idee war, irgendwie alle USB-HID-Geräte als Benutzer über so etwas wie udev zu öffnen, aber noch keine zu "generische" Lösung gefunden zu haben ... HeliTux vor 6 Jahren 0

2 Antworten auf die Frage

0
harrymc

Ihre Benutzerthemen befinden sich in ~/.themesIhrem Home-Verzeichnis, wo root nicht hinschaut. Systemweite Themen funktionieren immer einwandfrei /usr/share/themes.

Sie könnten Ihr Terminal öffnen und Folgendes eingeben:

sudo ln -s ~/.themes /root/.themes 

Auf diese Weise teilen Stammbenutzer und normale Benutzer das Designverzeichnis.

Bei Bedarf können Sie dasselbe für die Voreinstellungen für Schrift und Symbole tun:

sudo ln -s ~/.icons /root/.icons sudo ln -s ~/.fonts /root/.fonts 

Der einzige Nachteil ist, dass Sie keinen visuellen Hinweis haben, um Sie daran zu erinnern, wenn Sie die Anwendung mit Root-Berechtigungen ausführen.

Leider hat dies keinen Effekt. Es sieht so aus, als würde Qt woanders nach Themendaten suchen. Ich überlege vielleicht noch einmal, dieses Questing im Stackoverflow zu posten, da es vielleicht mehr Qt-Code gibt. HeliTux vor 6 Jahren 0
Dies können keine Designs sein, sondern eher Qt-Stile. Diese befinden sich in etwas wie ~ / .config / QtProject / qtcreator / styles` - überprüfen Sie dies besser auf Ihrem Computer. Wenn dies tatsächlich der richtige Ordner ist, wiederholen Sie den obigen Vorgang für `~ / .config`. harrymc vor 6 Jahren 0
0
HeliTux

Leider scheint es, dass es in neueren Qt-Versionen in den letzten Distributionen nicht möglich ist. Das Problem wird in diesem Link für Arch beschrieben, die vorgeschlagene Problemumgehung funktioniert jedoch nicht unter Ubuntu / Debian.

Aber gefundene Problemumgehung, das ist wahrscheinlich viel besser, wenn Sie 100% statisches Design (auf allen Computern) in der Root-Qt-Anwendung haben möchten.

Sie müssen ein benutzerdefiniertes Qt-Stylesheet und einen benutzerdefinierten Stil für die Anwendung angeben:

sudo ./QtApplication -style Adwaita -stylesheet=./stylesheet.css 

Die verfügbaren Styles des Systems befinden sich in / usr / lib / x86_64-linux-gnu / qt5 / plugins / styles /. In meinem Fall sind verfügbare Modelle Adwaita, Breeze und Oxygen. Diese Stile wirken sich nur auf den Stil von UI-Elementen aus, z. B. Drucktasten, Listen, Wählscheiben usw. Um benutzerdefinierte Farben und Schriftarten der Benutzeroberfläche anzuwenden, habe ich ein benutzerdefiniertes Stylesheet verwendet. Ich habe mein eigenes geschrieben, basierend auf diesem benutzerdefinierten Stylesheet, das für QtCreator gedacht ist

Ich weiß nicht genau, wie ich das Icon-Theme anwenden soll, aber das ist in meinem Fall keine große Sache.

Dies bewirkt, dass die App mit einem vollständig benutzerdefinierten Design ausgeführt wird, unabhängig davon, wie der lokale Stil und die Schriftarten eingerichtet sind. Es kann für Benutzer und root verwendet werden