Programowanie C++ Qt4 w systemie Gnu-Linux/QVariant
QVariant to klasa służąca do przechowywania zmiennych różnych typów. Poniższy krótki będzie to przykład wykorzystania klasy QVariant, w krótkim programie;
Uwaga!
|
Na początek własny typ, który z założenia będzie tablicą bitową. Tablica ma rozmiar szesnastu bitów(WORD) i ma być możliwość odczytania każdego bitu z osobna za pomocą operatora []. Operator [] to drugi po "<<" którego przeładowanie zrobiłem. Wcześniej to zagadnienie wydawało Mi się zbędne. Ale jak widać w stosunku do tych dwóch operatorów przeładowanie się prydaje
#ifndef PLCBITSARRAY_H
#define PLCBITSARRAY_H
typedef unsigned short WORD; //Word nie jest standardowym typem C++
//definiujemy klasę tablicaBitowa
class plcBitsArray
{
WORD data; //składnik klasy
public:
//poniżej konstruktor funkcja uruchamiana automatycznie przy tworzeniu obiektu
//nie robi nic poza wpisaniem 0 do pola daty
plcBitsArray(int _data=0){data=_data;}
//poniżej funkcja która ustawi pole data; robi to samo co konstruktor tyle że numer już ma wartość zadaną
void fromNumer(int numer){data=numer;}
//najważniejsza funkcja przeładowany operator.
//Zadaniem funkcji jest sprawdzenie stanu bita o zadanym numerze
bool operator[](int bitNumer){
return data&1<<bitNumer;
/* krok po kroku rozpiszę tą funkcję
WORD maska=1<<bitNumer; // maska to zmienna, która ma jdynkę przesuniętą o liczbę pól określoną w zmiennej bitnumer.
WORD temp = data&maska; //robimy AND zmienej data z maską. Wynikiem iloczynu pola data z maską jest 0 lub 1. W zależności od tego jaki jest stan ma bit w słowie data.
return temp; // 0 to false 1 to true;
*/
}
};
Q_DECLARE_METATYPE(plcBitsArray); //to trzeba zrobić by można było załadować obiekt własnego typu do zmiennej QVariant
#endif // PLCBITSARRAY_H
Więc napisaliśmy własną prostą klasę bitArray przystosowaną do współpracy z klasą QVariant. Poniżej przedstawię kod funkcji main()
#include "plcBitsArray.h"
#include <QDebug>
#include<QVariant>
int main()
{
QVariantList blok={QVariant::fromValue(plcBitsArray(0)),QVariant::fromValue(WORD(0)),QVariant::fromValue(int(0))};
//QList<QVariant>block jest równoznaczne z QVariantList blok;
//blok to kontener który zawiera 3 elementy
foreach (const QVariant& zm, blok) {
qDebug()<<zm.typeName();
}
//wypisanie bitu 1 na konsole z kontenera blok;
qDebug()<< blok[0].value<plcBitsArray>()[1]<<" -pierwszy element tablicy bitowej";
}
W funkcji pętla foreach przegląda kontener i zwraca na konsole typ zmiennej przechowywany w kontenerze. Wynik działania programu!!
plcBitsArray ushort int false -pierwszy element tablicy bitowej