0

バイナリを画像に変換するのは難しいと思います。ピックスマップを使用します。バイナリへの転送は正しいですが、このプログラムを使用して表示すると、実際には機能しません。

これは私のコードです:

if (binaryNumber[0]==1)ui->led16->setPixmap(QPixmap("../../picture/ball-yellow.png"));
else ui->led16->setPixmap(QPixmap("../../picture/ball-gray.png"));
if (binaryNumber[1]=1) ui->led15->setPixmap(QPixmap("../../picture/ball-yellow.png"));
else ui->led15->setPixmap(QPixmap("../../picture/ball-gray.png"));
if (binaryNumber[2]==1)ui->led14->setPixmap(QPixmap("../../picture/ball-yellow.png"));
else ui->led14->setPixmap(QPixmap("../../picture/ball-gray.png"));
if (binaryNumber[3]==1)ui->led13->setPixmap(QPixmap("../../picture/ball-yellow.png"));
else ui->led13->setPixmap(QPixmap("../../picture/ball-gray.png"));
if (binaryNumber[4]==1)ui->led12->setPixmap(QPixmap("../../picture/ball-yellow.png"));
else ui->led12->setPixmap(QPixmap("../../picture/ball-gray.png"));


bool ok2 = false;
QByteArray binaryNumber = QByteArray::number(DO.toLongLong(&ok2, 16), 2);



qDebug()<<binaryNumber<<binaryNumber[0]<<binaryNumber[1]<<binaryNumber[2 <<binaryNumber[3];

すなわち

binaryNumber =1011
binaryNumber[0] = 1
binaryNumber[1] = 0
binaryNumber[2] = 1
binaryNumber[3] = 1

でもいつ

binaryNumber =100
binaryNumber[0] = 1
binaryNumber[1] = 0
binaryNumber[2] = 0

したがって、ピックスマップを使用すると、サイズが異なると配列[0]が異なるため、LEDの炎は2進数に対応しません。私のための簡単なコードはありますか?

4

2 に答える 2

1

QByteArray数値のビットを格納するためにaを使用する必要はありません。C / C ++では、マスクを使用してビットごとのAND(&)を実行することにより、ビットに直接アクセスできます。

template <typename T> static QPixmap setPixmap(T * p, int value, int bitNo)
{
  const bool bit = value & (1<<bitNo);
  p->setPixmap(bit ? QPixmap("../../picture/ball-yellow.png")   
                   : QPixmap("../../picture/ball-gray.png"));
}

void Class::setDisplay(int val)
{
  setPixmap(ui->led12, val, 0);
  setPixmap(ui->led13, val, 1);
  setPixmap(ui->led14, val, 2);
  setPixmap(ui->led15, val, 3);
  setPixmap(ui->led16, val, 4);
}
于 2012-06-17T12:55:02.693 に答える
0

は、数値 0、1 などの文字ではなく、QByteArray::number()英数字 ( '0'= 48、 = 49 など)を返すことに注意してください。これは重要な違いです。'1'

これを行うbinaryNumber = QByteArray::number(value, 2)と、たとえば次のようなバイト配列が返されます"1010"。したがって、binaryNumber[0] == '1'、NOT binaryNumber[0] == 1:

if (binaryNumber[0]=='1')ui->led16->setPixmap(QPixmap("../../picture/ball-yellow.png"));
else ui->led16->setPixmap(QPixmap("../../picture/ball-gray.png"));
if (binaryNumber[1]=='1')ui->led15->setPixmap(QPixmap("../../picture/ball-yellow.png"));
else ui->led15->setPixmap(QPixmap("../../picture/ball-gray.png"));
if (binaryNumber[2]=='1')ui->led14->setPixmap(QPixmap("../../picture/ball-yellow.png"));
else ui->led14->setPixmap(QPixmap("../../picture/ball-gray.png"));
if (binaryNumber[3]=='1')ui->led13->setPixmap(QPixmap("../../picture/ball-yellow.png"));
else ui->led13->setPixmap(QPixmap("../../picture/ball-gray.png"));
if (binaryNumber[4]=='1')ui->led12->setPixmap(QPixmap("../../picture/ball-yellow.png"));
else ui->led12->setPixmap(QPixmap("../../picture/ball-gray.png"));

あなたのコードには冗長なコード行がたくさんあり、品質の悪いソフトウェアになることに注意してください。上記のコードをループで記述するか、少なくともピックスマップを移動するようにしてください。一部の静的変数またはそれを含むクラスのコンストラクターでピックスマップの初期化を移動すると、パフォーマンスもいくらか向上します。

したがって、クラスは次のようになります: (関連する部分のみを含めました。もちろん、UI 用のコードも必要です。)

class LEDNumberView
{
private:
    // member variables:
    QPixmap bitOn;
    QPixmap bitOff;

    // helper function
    inline QPixmap getBitPixmap(bool bitVal)
    {
        return bitVal ? bitOn : bitOff;
    }

public: 
    // constructor
    LEDNumberView()
    {
        QString path = "../../picture/ball-%1.png";
        bitOn = QPixmap(path.arg("yellow"));
        bitOff = QPixmap(path.arg("gray"));
    }

    // call whenever you want to change the binary number displayed by the LEDs
    void setBinaryNumber(int value)
    {
        QByteArray binaryNumber = QByteArray::number(value, 2);
        ui->led16->setPixmap(getBitPixmap(binaryNumber[0] == '1'));
        ui->led15->setPixmap(getBitPixmap(binaryNumber[1] == '1'));
        ui->led14->setPixmap(getBitPixmap(binaryNumber[2] == '1'));
        ui->led13->setPixmap(getBitPixmap(binaryNumber[3] == '1'));
        ui->led12->setPixmap(getBitPixmap(binaryNumber[4] == '1'));
        ui->led11->setPixmap(getBitPixmap(binaryNumber[5] == '1'));
    }
};

Kuba Ober の答えと私の答えを組み合わせるにはsetBinaryNumber、彼が提案したように関数を書きます。バイナリ変換のどの方法を好むかはあなた次第です-ビット操作(彼の方法を使用)または変換してからバイト(あなたのもの)で作業します。

于 2012-06-18T08:34:27.573 に答える