如何二进制到qpixmap

时间:2012-06-17 07:42:48

标签: qt qpixmap

我发现很难将二进制翻译成图片,我使用的是pixmap。 转换到二进制文件是正确的,但是当我使用这个程序显示实际上不起作用。

这是我的代码:

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

2 个答案:

答案 0 :(得分:1)

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

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);
}

答案 1 :(得分: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"));

请注意,您的代码中充斥着冗余的代码行,导致软件质量不佳。您应该尝试在循环中编写上面的代码或至少移出pixmaps。在一些静态变量或包含类的构造函数中移动pixmap初始化也会带来一些性能提升。

所以你的课程看起来与此类似:(我只包括相关部分,当然,还必须有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'));
    }
};

要将the answer of Kuba Ober与我的相结合,请按照他的建议编写setBinaryNumber函数。这取决于你喜欢哪种二进制转换方法 - 位操作(使用他的方法)或转换为然后使用字节(你的)。