2013-05-10 2 views
1

Я пишу тетрис. Это моя реализация стекла. Я просто хочу рисовать то, что внутри. Int означает цвет (int glass_array [10] [22];).Qt: в переменной int я хочу сохранить информацию о цвете

Теперь я хочу узнать, как использовать эти цвета. Для учебных целей я создаю два кубика и хочу, чтобы они были разных цветов. Скажем, красный и зеленый. Но оба они оказались синими.

Не могли бы вы мне помочь?

QtGlass.h

class QtGlass : public QFrame { 
    Q_OBJECT 

public: 
    void paintEvent(QPaintEvent * event); 
    QtGlass(QWidget *parent); 
    bool key_pressed; 
    void keyPressEvent(QKeyEvent* event); 
protected: 
    void glassRedraw(QPainter &painter); 
    int glass_array[10][22]; 
}; 

QtGlass.cpp

QtGlass::QtGlass(QWidget *parent): QFrame(parent) { 

    for (int i = 0; i < 10; i++) { 
     for (int j = 0; j < 22; j++) { 
      glass_array[i][j] = 0; //0 - Default color (grey); 
     } 
    } 

    for (int i = 8; i < 10; i++) { 
     for (int j = 20; j < 22; j++) { 
      glass_array[i][j] = QColor(Qt::green).value(); // green 
     } 
    } 
    for (int i = 0; i < 2; i++) { 
     for (int j = 20; j < 22; j++) { 
      glass_array[i][j] = QColor(Qt::red).value(); // red 
     } 
    }  
} 




void QtGlass::paintEvent(QPaintEvent *event) { 
    QPainter painter(this); 
    Figure Falcon; 

    glassRedraw(painter); 
    painter.setPen(QPen(Qt::red, 4)); 

    for (int i = 0; i < 10; i++) { 
     for (int j = 0; j < 22; j++) { 
      if (glass_array[i][j] > 0) { 
       painter.fillRect(i* 31+ 1, j * 31 + 1, 29, 29, 
         QBrush(QColor(glass_array[i][j]), Qt::SolidPattern)); 
      } 
     } 
    } 
} 
+2

почему не 'QColor glass_array [10] [22]; '? – CapelliC

+0

Я думаю, он хочет сохранить использование памяти, и я думаю, что он не делает это правильно. сохраняя их, поскольку QColor избавит его от создания и уничтожения объекта QColor с каждым событием окраски: D –

ответ

0

Я хотел бы предложить использовать некоторые из С ++ власти, Qt поставить в вашем распоряжении:

If вы объявляете QVector< QVector<QColor> > glass_array;, вы получите больше безопасности: например, после этой декларации

QVector< QVector<QColor> > glass_array(10, QVector<QColor>(22)); 
glass_array[9][21] = Qt::red; // this is OK 
// this causes 
// ASSERT failure in QVector<T>::operator[]: "index out of range", file ../../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qvector.h, line 359 
glass_array[9][22] = Qt::blue; 

Если вы решили идти по этому пути, что заявление члена должно быть 'разбить': в класс QtGlass объявить

QVector< QVector<QColor> > glass_array; 

затем инициализировать в конструкторе:

QtGlass::QtGlass(QWidget *parent): 
    QFrame(parent), 
    glass_array(10, QVector<QColor>(22)) 
{...} 
+0

Как было сказано выше, массив QColor работает отлично. Не могли бы вы уточнить, что есть в вашем методе, который безопаснее? – Trts

+0

Существует поддержка проверки индекса - на время отладки, как я показал с доступом за пределы границ – CapelliC

Смежные вопросы