2016-10-17 14 views
0

私は5x5の矩形を表示するコードを書いた:クリック後に矩形の色を変更する方法は?

void PrintRectangle::paintEvent(QPaintEvent *) 
{ 
    QPainter p(this); 
    int xpos=20; 
    int ypos=20; 
    int recWidth=50; 
    int recHeight=50; 
    int y=20; 

    for(int i=0; i<5; i++) 
    { 
     ypos=20; 
     p.fillRect(xpos,ypos,recWidth,recHeight,Qt::red); 

     for(int j=0; j<5; j++) 
     { 
      p.fillRect(xpos,ypos,recWidth,recHeight,Qt::red); 
      ypos+=60; 
     } 
     xpos+=60; 
    } 
} 

これが正常に動作します。どのようにクリックした矩形の色を変更する関数を実装するには?その矩形をリストに格納する必要がありますか?

答えて

2

は、あなたがクリックした位置を取得し、ボックスの色の変化を必要としている確認することができます

virtual void mousePressEvent(QMouseEvent * event) 

イベントで再実装する必要があります。その後、ウィジェットのupdate()を呼び出します。

次のコードは、クリックされたセルを緑色に塗りつぶし、その他は赤色で塗りつぶします。

#ifndef WIDGET_H 
#define WIDGET_H 

#include <QWidget> 

class Widget : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit Widget(QWidget *parent = 0); 
    ~Widget(); 

protected: 
    void paintEvent(QPaintEvent *); 
    void mousePressEvent(QMouseEvent* ev); 

private: 
    void resetClickedIndex(); 
    void updateIndexFromPoint(const QPoint& point); 
private: 
    int mXIndex; 
    int mYIndex; 
}; 

#endif // WIDGET_H 

widget.cpp

#include "widget.h" 

#include <QPainter> 
#include <QMouseEvent> 

Widget::Widget(QWidget *parent) : 
QWidget(parent) 
{ 
    resetClickedIndex(); 
} 

Widget::~Widget() 
{ 
} 

void Widget::paintEvent(QPaintEvent *) 
{ 
    QPainter p(this); 
    int xpos=20; 
    int ypos=20; 
    int recWidth=50; 
    int recHeight=50; 
    int y=20; 

    for(int i=0; i<5; i++) 
    { 
     ypos=20; 
     for(int j=0; j<5; j++) 
     { 
      QColor color = Qt::red; 
      if(i == mXIndex && j == mYIndex) 
      { 
       color = Qt::green; 
      } 
      p.fillRect(xpos,ypos,recWidth,recHeight,color); 
      ypos+=60; 
     } 
     xpos+=60; 
    } 
} 

void Widget::mousePressEvent(QMouseEvent *ev) 
{ 
    QPoint point = ev->pos(); 
    updateIndexFromPoint(point); 
    update(); 
} 

void Widget::resetClickedIndex() 
{ 
    mXIndex = -1; 
    mYIndex = -1; 
} 

void Widget::updateIndexFromPoint(const QPoint &point) 
{ 
    int x = point.x() - 20; 
    int y = point.y() - 20; 

    if(((x >= 0) && (x <= 300)) && ((y >= 0) && (y <= 300))) 
    { 
     mXIndex = x/60; //rec width + spacing 
     mYIndex = y/60; //rec height + spacing 
    } 
    else 
    { 
     resetClickedIndex(); 
    } 
} 
+0

widget.h

はい、私はそれを持っているが、私はすべての四角形、次の削除の色を保存し、別の色を作る方法を知られていません。 – lukassz

+0

右。 update()はpaintEventを呼び出します。したがって、上記のコード(paintEvent())が更新するために再実装された場合、周期的な更新が行われる可能性が高くなります。 - sanjayのようにmousePressEventに実装するだけです。 –

+0

@lukassz更新されたコードをチェックすると、クリックされたセルが緑色にペイントされ、他のセルは赤色にペイントされます。それがあなたの問題を解決することを願っています。解決したら、解決してください。 – sanjay

関連する問題