Перейти к содержанию
    

Переключение языка ввода и внешний вид программы на Qt

 Приветствую, уважаемые!

Использую плату Raspberry Pi3, на Qt.5.15.11, в QT Creatore написал тестовое приложение на основе QWidget - кнопочка, EditBox, TextLabel, короче, хелловорлд. Компилировал на ПК в Ubuntu с помощью cross-compile toolchain.

На Raspberry крутится Linux на основе Debian с графическим интерфейсом LXDE. Qt скомпилировано  c поддержкой OpenGL.

При запусках моей программки обнаружил следующее:

1. Если запустить программу от имени пользователя (Pi), то текст с клавиатуры можно вводить и по русски и по английски, переключение языка ввода нормально работает. Но если запустить от имени администратора (sudo), то печатает только английскими буквами и на нажатие комбинации переключения языка ввода (у меня Alt+Shift),программа не реагирует.

2. Внешний облик программы также зависит от того, запущена она с правами пользователя или с помощью sudo.

Подскажите пожалуйста, как настроить ввод русских букв при запуске программы от имени администратора?

А также, от чего зависит внешний вид программы Qt (разеры окна, вид рамки, высота шрифтов...), при запуске от имени различных пользователей?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, grebenkoff сказал:

Подскажите пожалуйста, как настроить ввод русских букв при запуске программы от имени администратора?

Найти - какая комбинация клавиш установлена для переключения языка в профиле администратора? Видимо она другая чем у вас.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Небось, у рута LC_ALL=C, как и положено?

Кстати, запускать графический софт от рута нельзя ни в коем случае!

А внешний вид зависит от культяпной темы, в хомяке смотрите, что у вас там понастроено (~/.qt/qtrc, кажись  - я к культяпкам крайне негативно отношусь)…

Изменено пользователем Eddy_Em

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, jcxz said:

Найти - какая комбинация клавиш установлена для переключения языка в профиле администратора? Видимо она другая чем у вас.

А где бы это посмотреть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел ответ вот тут:

https://askubuntu.com/questions/872792/what-is-xdg-runtime-dir

В двух словах, запуская приложение как пользователь и как root, мы запускаем его с разным окружением.

Чтобы программа запущенная от имени root работала с окружением пользователя, нужно это делать так:

sudo -E MyApp

Да, и еще, я знаю, что запуская свою программу от имени администратора я поступаю очень и очень плохо. Но на данный момент, чтобы получить доступ к регистрам управления GPIO Raspberry Pi я использую библиотеку bcm2835, а она может добыть нужные адреса только когда работает как root. Может кто-нибудь знает, как обойти данную проблему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, grebenkoff сказал:

Может кто-нибудь знает, как обойти данную проблему?

Внимательно изучите документацию на библиотеку, там это описано:

Цитата

If the library runs with any other effective UID (ie not root), then bcm2835_init() will attempt to open /dev/gpiomem, and, if successful, will only permit GPIO operations. In particular, bcm2835_spi_begin() and bcm2835_i2c_begin() will return false and all other non-gpio operations may fail silently or crash.

 

If your program needs acccess to /dev/mem but not as root, and if you have the libcap-dev package installed on the target, you can compile this library to use libcap2 so that it tests whether the exceutable has the cap_sys_rawio capability, and therefore permission to access /dev/mem. To enable this ability, uncomment the #define BCM2835_HAVE_LIBCAP in bcm2835.h or -DBCM2835_HAVE_LIBCAP on your compiler command line. After your program has been compiled:

 

sudo setcap cap_sys_rawio+ep *myprogname*

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, makc said:

Внимательно изучите документацию на библиотеку, там это описано:

 

Спасибо, попробую!

А ведь я уже читал это, но почему-то, при первом прочтении упустил из виду, что нужно сначала установить libcap-dev.

Видимо, для меня мало просто читать документацию, ее еще надо понимать ))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть же и через /sys/ интерфейс возможность доступа к GPIO. Понятно, что это намного медленней, чем через DMA, но если сотни килогерц не нужны, вполне оправдано. Была какая-то библиотечка, wiredpi, что ли...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда надо управлять не из root теми ресурсами которые только root может я пишу демона с ограниченными возможностями. Ну чтобы только те команды, которые нужны для работы.
Скажем, если надо писать по нескольким адресам, то только по этим адресам он и может писать.
Запискаю демона из root,  а с демоном уже из своей программы разговариваю. По pipe  или socket. Можно через файл, но немного кривовато получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/14/2021 at 10:15 PM, Eddy_Em said:

Есть же и через /sys/ интерфейс возможность доступа к GPIO. Понятно, что это намного медленней, чем через DMA, но если сотни килогерц не нужны, вполне оправдано. Была какая-то библиотечка, wiredpi, что ли...

Спасибо за совет. Я начинающий линуксоид, поэтому подскажите пожалуйста, где найти пример кода, в котором можно посмотреть как это сделать? Скорость не проблема, в моем случае нужно поднять ножку, подержать 1 секунду, опустить и т.п.

On 10/15/2021 at 5:54 AM, Tarbal said:

Когда надо управлять не из root теми ресурсами которые только root может я пишу демона с ограниченными возможностями. Ну чтобы только те команды, которые нужны для работы.
Скажем, если надо писать по нескольким адресам, то только по этим адресам он и может писать.
Запискаю демона из root,  а с демоном уже из своей программы разговариваю. По pipe  или socket. Можно через файл, но немного кривовато получается.

Благодарю за ответ, а можете скинуть какой-нибудь пример или ссылку дать, где про это с примерами кода написано?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/16/2021 at 9:41 AM, grebenkoff said:

Благодарю за ответ, а можете скинуть какой-нибудь пример или ссылку дать, где про это с примерами кода написано?

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

Конфигурация программы зависит от нескольких факторов, которые отличаются для админа и пользователя. В самой апликации может стоять переключение и разная реакция.
Есть настройки, которые индивидуальны для каждого пользователя. Они в основном устанавливаются в .profile и .bashrc (Точка перед именем обязательна. Так в Линуксе делают скрытые файлы.) Это набор переменных оболочки.
Команда printenv покажет вам их.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, Tarbal said:

Это набор переменных оболочки.

За внешний вид отвечают настройки в директориях ~/.qt и ~./config.

У ТС проблема с переключением локали. Здесь явно не передается ENV от пользователя к руту. Поэтому рутовская настройка локали (LC_MESSAGES и т.п.), если она — C, POSIX или en_EN, не позволяет менять язык при переключении (хоткей ни от каких настроек не зависит, т.к. он — "общекутешный". Если у рута локаль прописана в /root/.bashrc, то никак это изменить не получится (сразу после логина хоть с su -l, хоть с sudo -E этот файл читается).

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

Да, для того, чтобы работать с DMA, необязательно от рута утилиты запускать! Можно сделать эдакий "прокси", установить ему SUID-бит, да гонять от обычного пользователя. Открыли локальный сокет, записали данные - "прокси" выполнил требуемое и вернул ответ. Понятно, что сетевые службы от рута тоже некомильфо запускать, но то, что сокет локальный, спасет от доступа извне. К нему смогут подключиться лишь локально зашедшие на комп тем или иным способом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14.10.2021 в 19:50, grebenkoff сказал:

Да, и еще, я знаю, что запуская свою программу от имени администратора я поступаю очень и очень плохо. Но на данный момент, чтобы получить доступ к регистрам управления GPIO Raspberry Pi я использую библиотеку bcm2835, а она может добыть нужные адреса только когда работает как root. Может кто-нибудь знает, как обойти данную проблему?

Нельзя использовать эту библиотеку в линуксе, система будет сбоить и зависать, изредка. Используйте штатное средство,- драйвер /dev/gpiochip0 через библиотеку libgpiod

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, gridinp said:

Нельзя использовать эту библиотеку в линуксе, система будет сбоить и зависать, изредка. Используйте штатное средство,- драйвер /dev/gpiochip0 через библиотеку libgpiod

Спасибо за совет! Подскажите, где можно посмотреть примеры кода с использованием этих средств?

1 minute ago, grebenkoff said:

Спасибо за совет! Подскажите, где можно посмотреть примеры кода с использованием этих средств?

Сам спросил, сам ответил:

https://embeddedbits.org/new-linux-kernel-gpio-user-space-interface/

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...