2012-06-17 100 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); 
} 
相關問題