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];

IE

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]在大小不同时是不同的。有什么简单的代码适合我吗?

4

2 回答 2

1

QByteArray无需使用 a 来存储数字的位。在 C/C++ 中,您可以通过使用掩码执行按位与 (&) 直接访问这些位。

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

请注意,QByteArray::number()返回字母数字字符('0'= 48、'1'= 49 等),而不是具有数值 0、1 等的字符。这是一个重要的区别!

如果这样做binaryNumber = QByteArray::number(value, 2),这将返回一个字节数组,例如"1010"。因此, binaryNumber[0] == '1', 不是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 回答