Как заставить приложение Qt, запущенное через sudo, использовать конфигурацию пользовательских тем / шрифтов?

1076
HeliTux

каждый.

Я занимаюсь разработкой приложений на Qt5, но для этого требуется низкоуровневый доступ к оборудованию, и, следовательно, его нужно запускать как root Моими целевыми операционными системами являются Debian (ARM) и Ubuntu (x86).

Проблема в том, что все приложения, которые выполняются от имени root (через sudo), используют настройки и среду root.

Мне нужно как-то заставить приложение Qt работать с той же темой и шрифтами, что и у обычного пользователя.

Можно ли как-то этого добиться? Как выполнить через сценарий оболочки с дополнительными параметрами выполнения и командами?

Вот скриншоты, чтобы показать разницу:

Приложение Qt, работающее от имени root через sudo

Приложение Qt работает как пользователь

0
Лучшее решение ИМХО: отделить аппаратно-зависимую часть, обернуть в API и выполнить как отдельный процесс как root. Затем часть Qt GUI может запускаться от имени пользователя. Это также облегчает добавление других пользовательских интерфейсов, например командной строки. dirkt 6 лет назад 2
Я второе предложение Диркта. Или, в качестве альтернативы, добавьте требуемые возможности POSIX (например, `CAP_SYS_RAWIO`) в исполняемый файл и включите возможность только в тех частях программы, где это действительно необходимо. См. «Человек 7 способностей». Запуск программ с графическим интерфейсом от имени root обычно считается плохой идеей, поскольку они содержат огромное количество программного обеспечения (например, Qt), которое не проверялось для такого использования. Johan Myréen 6 лет назад 0
Ну, я не настолько великий разработчик, чтобы переопределить все в API. Я разрабатывал C ++ CLI-приложения несколько лет, но довольно плохо знаком с реализациями Qt. Я использую библиотеку hidapi от signal11, это основная реализация уровня HW (с моими небольшими изменениями). Моя первая идея состояла в том, чтобы как-то разрешить открывать все устройства USB HID как пользователь с помощью чего-то вроде правила udev, но пока не нашел слишком «общего» решения ... HeliTux 6 лет назад 0

2 ответа на вопрос

0
harrymc

Ваши пользовательские темы находятся в ~/.themesвашем домашнем каталоге, где root не будет искать. Общесистемные темы всегда будут работать нормально /usr/share/themes.

Вы можете открыть свой терминал и ввести:

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

Таким образом, root и обычные пользователи будут делиться каталогом темы.

При необходимости вы также можете сделать то же самое для параметров шрифта и значка:

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

Единственный недостаток заключается в том, что у вас не будет визуальных подсказок, напоминающих вам о запуске приложения с привилегиями root.

К сожалению, это имеет нулевой эффект. Похоже, Qt ищет данные темы где-то еще. Я, возможно, пересмотрю, чтобы опубликовать этот квест в стеке потока, потому что, возможно, это связано с кодом Qt .... HeliTux 6 лет назад 0
Это могут быть не темы, а стили Qt. Они находятся в чем-то вроде `~ / .config / QtProject / qtcreator / styles` - лучше проверьте это на своем компьютере. Если это действительно правильная папка, попробуйте повторить приведенное выше для `~ / .config`. harrymc 6 лет назад 0
0
HeliTux

К сожалению, кажется, что это невозможно в более новой версии Qt на последних дистрибутивах. Проблема описана в этой ссылке для Arch, но предложенный обходной путь не работает на Ubuntu / Debian.

Но нашел обходной путь, который, вероятно, будет намного лучше, если вы хотите 100% статического проектирования (на всех машинах) в корневом приложении Qt.

Вам нужно указать пользовательскую таблицу стилей Qt и пользовательский стиль для приложения:

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

Доступные для системы стили находятся в / usr / lib / x86_64-linux-gnu / qt5 / plugins / styles /. В моем случае доступны следующие стили: Adwaita, Breeze и Oxygen. Эти стили влияют только на стиль элементов пользовательского интерфейса - например, кнопок, списков, циферблатов и так далее. Чтобы применить пользовательские цвета и шрифты пользовательского интерфейса, я использовал пользовательскую таблицу стилей. Я написал свой собственный на основе этой пользовательской таблицы стилей, предназначенной для QtCreator

Не уверен, как применить значок темы, но это не имеет большого значения в моем случае.

Это заставит приложение работать с полностью индивидуально заданным дизайном, независимо от того, как настроены локальный стиль и шрифты. Может использоваться пользователем и пользователем root