2012-06-17 144 views
0

我发现很难将二进制转换为图片,我使用了一个像素映射。 转换成二进制是正确的,但是当我显示使用此程序实际上不起作用。如何将二进制转换为qpixmap

这是我的代码:

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]不同。 有没有简单的代码给我?

+0

请更具体一点:究竟哪些方法无效? UI元素(我猜他们是QLabels)显示什么? 'binaryNumber'如何初始化? – leemes

+0

@leemes我编辑过。清楚吗? – Majapahit

回答

0

注意QByteArray::number()返回字母数字字符('0' = 48,'1' = 49等等),而不是字符的数值0,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')); 
    } 
}; 

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

1

您使用QByteArray来存储数字的位是不必要的。在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); 
}