QT C++ ile detaylı sistem bilgisi alma

QT C++ ile detaylı sistem bilgisi alma

Herkese merhabalar, Bu yazımızda Qt C++kullanarak detaylı sistem bilgisini almayı göreceğiz. Bu çalışmada QSysInfo, QStorageInfo, QNetworkInterface, QSettings, QProcess sınıflarını kullanacağız.

Hadi başlayalım.

Orjinal içeriğe aşağıdaki linkten ulaşabilirsiniz.
https://thecodeprogram.com/reading-detailed-system-information-with-qt-c--

Bu yazımızda sistemin yazılımsal ve donanımsal bilgilerini okuyabilmek için birkaç farklı yol kullanacağız. İlk olarak QSysInfo sınıfını kullanacağız ve sonrasında Windows Registry den bilgi okuyarak birkaç değer alacağız ve son olarak komut dizini kullanılarak bazı değerleri alacağız.

Bu çalışmada QT C++ ile bir console uygulaması geliştireceğiz.

ilk olarak proje dizinindeki .pro dosyasının içerisine core ve network kütüphanelerini eklememiz gerekmektedir.
Aşağıdaki kod bloğunda nasıl yapıldığını görebilirsiniz:

QT += core
QT += network
Yukarıdaki değişiklikleri .pro dosyasında yaptıktan sonra projemizi yeniden Clean, QMake ve Rebuild yapmayı unutmayın..

Komut dizini için gerekli olan kütüphaneleri ekleyeli. Console ekranına bilgileri yazdırmak için cout komutunu kullanacağız.


#include <iostream>
using namespace std;

Aynı zamanda aşağıdaki kütüphaneleride projemize eklememiz gerekmektedir. Bu sayede ilgili komutları çağırabileceğiz


#include <QSysInfo>
#include <QStorageInfo>
#include <QNetworkInterface>
#include <QSettings>
#include <QProcess>
  • QSysInfo QSysInfo sınıfını kullanarak bazı sistem bilgilerini okuyacağız.
  • QStorageInfo QStorageInfo sınıfını kullanarak takılı olan sabit disklerin bilgilerini okuyacağız.
  • QNetworkInterface QNetworkInterface sınıfını kullanarak geçerli olan network bilgilerine erişeceğiz.
  • QSettings QSettings sınıfı ile WINDOWS işletim sisteminde registry kayılarına erişeceğiz ve orada kayıtlı bazı bilgileri alacağız.
  • QProcess QProcess kullanılarak işletim sisteminde komut dizini çalıştırılacak ve bazı komutlar çağrılacak.

Şimdi ilk olarak QSystemInfo sınıfı ile başlayalım

Ek bilgi: system komutu ve title parametresi kullanarak komut dizini başlığı değiştirilebilir.

QSysInfo sınıfı bazı sistem bilgilerini alabilmek için static methodlara sahiptir. Fakat QSysInfo sistem bilgileri için bütün komutları sağlamaz. Aşağıda QSysInfo tarafından sağlanan sistem bilgi metodlarını inceleyelim.


    system("title SystemInfo_Example - Thecodeprogram");
    cout << "QT C++ System Info" << endl;

    cout << "QSysInfo Class" << endl;
    cout << "CPU Architecture : " << QSysInfo::currentCpuArchitecture().toLocal8Bit().constData() << endl;
    cout << "Product Type : " << QSysInfo::prettyProductName().toLocal8Bit().constData() << endl;
    cout << "Kernel Type : " << QSysInfo::kernelType().toLocal8Bit().constData() << endl;
    cout << "Kernel Version : " << QSysInfo::kernelVersion().toLocal8Bit().constData() << endl;
    cout << "Machine ID : " << QSysInfo::machineHostName().toLocal8Bit().constData() << endl;
    cout << "-----------------------------------------------------------------" << endl;

Aşağıdaki resimde ilgili kod bloğunun çıktısı görülmektedir..

QSysInfo Example Output

Şimdi QStorageInfo sınıfı ile sabit disk bilgilerine erişelim. Bu sayede sabit disklerin name, rootpath, filesystem, ve disk spaces bilgilerini okuyacağız.

Below code block you will see it.

    cout << "QStorageInfo Class" << endl;
    cout << "Mounted Volumes" << endl;
    foreach (const QStorageInfo &storage, QStorageInfo::mountedVolumes()) {
        if (storage.isValid() && storage.isReady()) {
            if (!storage.isReadOnly()) {
                cout << "Name:" << storage.name().toLocal8Bit().constData() <<  " ";
                cout << "Root:" << storage.rootPath().toLocal8Bit().constData() <<  " ";
                cout << "FileSys:" << storage.fileSystemType().constData() <<  " ";
                cout << "Disk Spaces:";
                cout << storage.bytesAvailable()/1000000000 <<  "GB";
                cout << "/";
                cout << storage.bytesTotal()/1000000000 <<  "GB";
                cout <<  endl;
            }
        }
    }

Aşağıdaki görselde yukarıdaki kod bloğunun çıktısını görebilirsiniz.

QStorageInfo Class Example Output

Şimdi ise sistem Network durumunu almaya çalışacağız. QNetworkInterface sınıfı ile cihazın Network bilgilerine erişeceğiz.

With QNetworkInterface sınıfı ile hangi bağlantı arayüz cihazı aktif IP numarası gibi bilgileri alacağız. Aynı zamanda cihazın MAC adresi bilgilerinede erişeceğiz.

Aşağıdaki kod bloğunda kullanım görülmektedir.


    cout << "QNetworkInterface Class" << endl;
    cout << "Connected Network Informations" << endl;

    foreach(QNetworkInterface networkInterface, QNetworkInterface::allInterfaces())
    {
        if (networkInterface.flags().testFlag(QNetworkInterface::IsUp) && !networkInterface.flags().testFlag(QNetworkInterface::IsLoopBack))
        {
            foreach (QNetworkAddressEntry entry, networkInterface.addressEntries())
            {
                if ( entry.ip().toString().contains(".")){
                    cout << "Interface:"<< networkInterface.name().toLocal8Bit().constData() << " ";
                    cout << "IP:"<< entry.ip().toString().toLocal8Bit().constData() << " ";
                    cout << "MAC:"  << networkInterface.hardwareAddress().toLocal8Bit().constData() << endl;
                }
            }
        }
    }

    cout << "-----------------------------------------------------------------" << endl;

Aşağıdaki görselde kod bloğu çıktısı görülmektedir..

QNetworkInterface Class Example Output

Şimdi sıra QSettings sınıfını kullanmanın sırası.

Burada dikkat edilmesi gereken bir durum var. Regedit WINDOWS işletim sisteminde var olan bir durum olduğu için bu kısımegedit olmayan işletim sistemlerinde hata verecektir..

QSettings sınıfı ile system registry'ye erişeceğiz ve bazı bilgileri oradan çekeceğiz. Kayıt defterinde sistem CPU gibi bazı BIOS'a ait bilgiler bulunmaktadır.

Aşağıdaki kod bloğunda kullanımı görebilirsiniz.


    cout << "QSettings Class" << endl;
    cout << "System BIOS informations. ONLY FOR WINDOWS." << endl;

    QSettings settings("HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\BIOS", QSettings::NativeFormat);
    cout << "Base Manufacturer : " << settings.value("BaseBoardManufacturer", "0").toString().toLocal8Bit().constData() << endl;
    cout << "Base Product : " << settings.value("BaseBoardProduct", "0").toString().toLocal8Bit().constData() << endl;
    cout << "BIOS Vendor : " << settings.value("BIOSVendor", "0").toString().toLocal8Bit().constData() << endl;
    cout << "BIOS Release Date : " << settings.value("BIOSReleaseDate", "0").toString().toLocal8Bit().constData() << endl;
    cout << "System Manufacturer : " << settings.value("SystemManufacturer", "0").toString().toLocal8Bit().constData() << endl;
    cout << "Product Name : " << settings.value("SystemProductName", "0").toString().toLocal8Bit().constData() << endl;
    cout << "System SKU : " << settings.value("SystemSKU", "0").toString().toLocal8Bit().constData() << endl;

    cout << "-----------------------------------------------------------------" << endl;

Aşağıdaki görselde yukarıdaki kod bloğunun çıktısını görebilirsiniz.:

Reading System Registry with QSettings in Windows

Son olarak QProcess kullanarak sistem bilgilerini okumaya çalışacağız. Bu yöntemi internette araştırdığınızda C# ile kullanımını göreceksiniz. Burada QT ile kullanacağız, komutlar aynı komut.

Burada wmic komutunu kullanacağız ve ilgili bilgileri alabilmek için gerekli parametreleri göndereceğiz.
winnt ise Windows işletim sisteminin çekirdek bilgilerini getirecek.

Burada CPU adı, GPU adı ve GPU bellek bilgileri alınacak.


    QProcess process_system;
    QString system_output;

    if(QSysInfo::kernelType() == "winnt")
    {
        QString cpuname = "wmic cpu get name";
        process_system.start(cpuname);
        process_system.waitForFinished();
        system_output = process_system.readAllStandardOutput().toUpper();
        cout << "CPU : "  << system_output.toLocal8Bit().constData() << endl;

        QString gpuname = "wmic PATH Win32_videocontroller get VideoProcessor ";
        process_system.start(gpuname);
        process_system.waitForFinished();
        system_output = process_system.readAllStandardOutput();
        cout << "GPU : "  << system_output.toLocal8Bit().constData() << endl;

        QString gpuRam = "wmic PATH Win32_VideoController get AdapterRAM";
        process_system.start(gpuRam);
        process_system.waitForFinished();
        system_output = process_system.readAllStandardOutput();
        cout << "GPU RAM : "  << system_output.toLocal8Bit().constData() << endl;
    }

Eğer Linux kullanıyorsanız aşağıdaki yöntemi kullanabilirsiniz:


    if(QSysInfo::kernelType() == "linux")
    {
        QString linuxcpuname = "cat /proc/cpuinfo | grep 'model name' | uniq";
        process_system.start(linuxcpuname);
        process_system.waitForFinished();
        QString linuxOutput = process_system.readAllStandardOutput();
        cout << "Linux CPU Info : "  << linuxOutput.toLocal8Bit().constData() << endl;
    }

Yukarıdaki kod bloğunun çıktısı aşağıdaki gibi olacaktır:

Usage of wmic and get system hardware information with QT C++

Görüldüğü üzere örneğimiz hazır. Artık sistem bilgilerini alabiliriz. Bu örnekteki kod örneklerini kullanarak ihtiyaçlarınıza göre sistem bilgilerini alabilirsiniz.

Örnek kod dosyasına Github üzerinden aşağıdaki link ile erişebilirsiniz:
https://github.com/thecodeprogram/SystemInfo_Example

Burak Hamdi TUFAN


Tags


Share this Post

Send with Whatsapp

Post a Comment

Success! Your comment sent to post. It will be showed after confirmation.
Error! There was an error sending your comment. Check your inputs!

Comments

  • There is no comment. Be the owner of first comment...