o
ost.vld31 марта 2017 г. 3:26

Узнать заряд батареи ноутбука

Qt, батарея

Здравствуйте, есть ли в Qt классы отвечающие за работу с батареей ноутбука или исправление электропитанием? Гугл не помог.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

15
Evgenii Legotckoi
  • 31 марта 2017 г. 4:03

День добрый.
Таких классов в Qt нет. Информация о заряде батареи в Linux находится в специальных файлах.

Например, в моём ноутбуке эта информация хранится в следующих файлах:

  • /sys/class/power_supply/BAT1/capacity - здесь заряд батареи в процентах
  • /sys/class/power_supply/BAT1/capacity_level - здесь общий статус уровня заряда

Забрать можно следующим образом:

QFile capacityFile("/sys/class/power_supply/BAT1/capacity");
QFile capacityLevelFile("/sys/class/power_supply/BAT1/capacity_level");

if (capacityFile.exists())
{
    capacityFile.open(QIODevice::ReadOnly | QIODevice::Text);
    qDebug() << "LEVEL" << QString(capacityFile.readAll()).toInt() << "%";
}

if (capacityLevelFile.exists())
{
    capacityLevelFile.open(QIODevice::ReadOnly | QIODevice::Text);
    qDebug() << "STATUS" << QString(capacityLevelFile.readAll()).replace("\n", "");
}

Полагаю, что для Windows тоже нечто подобное должно быть. В общем относительно данного user case в qt нет готового решения.

    o
    • 31 марта 2017 г. 5:23

    Нашел библиотеку libacpi, но она написана на си. И в Qt проект ее подключить не получилось. Код смогу скинуть после 6 вечера по Москве.

      Evgenii Legotckoi
      • 31 марта 2017 г. 5:35

      Вы это вообще под какую платформу пытаетесь реализовать? Win - я правильно понял?

        o
        • 31 марта 2017 г. 6:35

        Ubuntu linux

          Evgenii Legotckoi
          • 31 марта 2017 г. 7:44

          Чтобы запустить проект с этой библиотекой libacpi нужно:

          1. установить dev либу:
            sudo apt-get install libacpi-dev
          2. Подключить заголовочный файл в файл исходных кодов, где хотите использовать данную либу. Причем с учётом того, что это C библиотека.
            #ifdef __cplusplus
            extern "C" {
            #endif
            
            #include <libacpi.h>
            
            #ifdef __cplusplus
            }
            #endif
          3. Подключить библиотеку в qmake файле:
            LIBS += -lacpi
            o
            • 31 марта 2017 г. 8:28

            Спасибо. Только я библиотеку не устанавливал, а скачал с гитхаба и кинул в папку с проектом.

              Evgenii Legotckoi
              • 31 марта 2017 г. 8:31

              Ну это вы уже сами себе проблемы создаёте )))

                o
                • 31 марта 2017 г. 17:42

                первый вариант с использованием QFile и без libacpi.h (как показывалось выше, приложен), не взлетел

                #include "mainwindow.h"
                #include "ui_mainwindow.h"
                #include <QDebug>
                #include <QFile>
                
                MainWindow::MainWindow(QWidget *parent) :
                    QMainWindow(parent),
                    ui(new Ui::MainWindow)
                {
                    ui->setupUi(this);
                    ui->progressBar->setValue(0);
                    ui->progressBar_2->setValue(0);
                    QFile capacityFile("/sys/class/power_supply/BAT1/capacity");
                    QFile capacityLevelFile("/sys/class/power_supply/BAT1/capacity_level");
                
                    if (capacityFile.exists())
                    {
                        capacityFile.open(QIODevice::ReadOnly | QIODevice::Text);
                        qDebug() << "LEVEL" << QString(capacityFile.readAll()).toInt() << "%";
                        ui->progressBar->setValue(QString(capacityFile.readAll()).toInt());
                    }
                
                    if (capacityLevelFile.exists())
                    {
                        capacityLevelFile.open(QIODevice::ReadOnly | QIODevice::Text);
                        qDebug() << "STATUS" << QString(capacityLevelFile.readAll()).replace("\n", "");
                        ui->progressBar_2->setValue(QString(capacityFile.readAll()).toInt());
                    }
                }
                
                MainWindow::~MainWindow()
                {
                    delete ui;
                }
                
                
                  o
                  • 31 марта 2017 г. 17:58

                  окно показывает, но показания о батарее не дает.

                    o
                    • 31 марта 2017 г. 18:08

                    вариант второй, с помещенными в папку с проектом libacpi.h и libacpi.c Mainwindow.cpp

                    #include "mainwindow.h"
                    #include "ui_mainwindow.h"
                    #include <cstdlib>
                    #include <QDebug>
                    
                    extern "C"
                    {
                    #if (defined(Q_OS_LINUX))
                    #  include <libacpi.h>
                    #elif (defined(Q_OS_WIN32))
                    #  include <powrprof.h>
                    #endif
                    }
                    
                    MainWindow::MainWindow(QWidget *parent) :
                        QMainWindow(parent),
                        ui(new Ui::MainWindow)
                    {
                        ui->setupUi(this);
                    int acstate, battstate, thermstate, fanstate;
                        global_t *global = malloc (sizeof (global_t));
                        battery_t *binfo;
                        adapter_t *ac = &global->adapt;
                        thermal_t *tp;
                        fan_t *fa;
                    
                        if(check_acpi_support() == NOT_SUPPORTED){
                            printf("No acpi support for your system?\n");
                           }
                    
                        /* initialize battery, thermal zones, fans and ac state */
                        battstate = init_acpi_batt(global);
                        thermstate = init_acpi_thermal(global);
                        fanstate = init_acpi_fan(global);
                        acstate = init_acpi_acadapt(global);
                    
                        free(global);
                        free(binfo);
                        free(ac);
                        free(tp);
                        free(fa);
                    }
                    
                    MainWindow::~MainWindow()
                    {
                    
                        delete ui;
                    }
                    
                    
                    /home/v/job/qt/bat/new/bat/mainwindow.cpp:22: ошибка: invalid conversion from ‘void*’ to ‘global_t*’ [-fpermissive] global_t *global = malloc (sizeof (global_t)); ^
                      Evgenii Legotckoi
                      • 1 апреля 2017 г. 1:26

                      Пройдёмся по обоим вариантам:

                      1. Что значит не взлетел? Вы прилагайте кроме кода ещё пояснение, как не взлетел. Как минимум вывод qDebug() показали бы. Впрочем Вы проверили, что у Вас действительно есть каталог BAT1? Он может называться и BAT0. Я же неспроста написал:
                        Например, в моём ноутбуке эта информация хранится в следующих файлах:
                        1. /sys/class/power_supply/BAT1/capacity - здесь заряд батареи в процентах
                        2. /sys/class/power_supply/BAT1/capacity_level - здесь общий статус уровня заряда
                      2. /home/v/job/qt/bat/new/bat/mainwindow.cpp:22: ошибка: invalid conversion from ‘void*’ to ‘global_t*’ [-fpermissive] global_t *global = malloc (sizeof (global_t)); ^
                        Ну так скастуйте и всё заработает:
                        global_t *global = static_cast<global_t*>(malloc(sizeof(global_t)));
                        battery_t *binfo;
                        
                        init_acpi_batt(global);
                        
                        for(int i=0; i < global->batt_count; i++){
                            read_acpi_batt(i);
                            binfo = &batteries[i];
                            qDebug() << binfo->percentage;
                        }
                        Evgenii Legotckoi
                        • 1 апреля 2017 г. 2:12

                        Интересная либа. Самого заинтересовала.

                          o
                          • 1 апреля 2017 г. 6:00

                          да. удобная либа. в первом варианте, действительно номер батареи не изменил. во втором, пришлось таки установить библиотеку из репозитория. но в целом все заработало. и тут как-то непонятно, какой метод лучше: первый не требует левой либы, второй сохранит время, код уже готов.

                            Evgenii Legotckoi
                            • 1 апреля 2017 г. 10:14

                            Либа тоже работает не идеально. Я проверил её, и местами она всякую ерунду выдаёт.

                              o
                              • 1 апреля 2017 г. 10:17

                              ясно. значит нужно переписать. но не срочно.

                                Комментарии

                                Только авторизованные пользователи могут публиковать комментарии.
                                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                AD

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Результат:50баллов,
                                • Очки рейтинга-4
                                m
                                • molni99
                                • 26 октября 2024 г. 7:37

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Результат:80баллов,
                                • Очки рейтинга4
                                m
                                • molni99
                                • 26 октября 2024 г. 7:29

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Результат:20баллов,
                                • Очки рейтинга-10
                                Последние комментарии
                                i
                                innorwall14 ноября 2024 г. 17:42
                                Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                                i
                                innorwall14 ноября 2024 г. 15:09
                                Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                                i
                                innorwall14 ноября 2024 г. 10:05
                                EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
                                i
                                innorwall14 ноября 2024 г. 10:00
                                PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты) priligy 30mg Am J Obstet Gynecol 171 1488 505
                                Сейчас обсуждают на форуме
                                i
                                innorwall14 ноября 2024 г. 9:39
                                добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                                i
                                innorwall11 ноября 2024 г. 16:55
                                Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                                9
                                9Anonim25 октября 2024 г. 15:10
                                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                                ИМ
                                Игорь Максимов3 октября 2024 г. 10:05
                                Реализация навигации по разделам Спасибо Евгений!

                                Следите за нами в социальных сетях