单击后如何更改矩形的颜色?

时间:2016-10-17 12:32:49

标签: c++ qt

我编写了一个显示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;
    }
}

这很好用。如何实现一个改变被点击的矩形颜色的功能?我应该将该矩形存储在列表中吗?

1 个答案:

答案 0 :(得分:2)

您需要重新实施

virtual void    mousePressEvent(QMouseEvent * event)

通过事件,您可以获得点击位置并检查哪个框需要换色。之后,您为小部件调用update()。

以下代码会将点击的单元格绘制为绿色,将其他单元格绘制为红色。

widget.h

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