Как изменить цвет прямоугольника после щелчка?

#c #qt

#c #qt

Вопрос:

Я написал код, который отображает прямоугольник размером 5×5:

 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:

Вам нужно повторно реализовать

 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 QPointamp; 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 amp;amp; 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 amp;point)
{
    int x = point.x() - 20;
    int y = point.y() - 20;

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

Комментарии:

1. Да, он у меня есть, но я не знаю, как сохранить весь прямоугольник, затем удалить цвет и создать другой цвет.

2. Правильно. Обратите внимание, что update() вызывает paintEvent . Итак, если приведенный выше код (paintEvent()) переопределен для обновления, он, скорее всего, будет иметь циклические обновления. — Просто реализуйте в mousePressEvent, как сказал Санджай.

3. @lukassz проверьте обновленный код, он покрасит выбранную ячейку в зеленый цвет, другую ячейку в красный. Я надеюсь, что это решит вашу проблему. Если решаемая, пожалуйста, отметьте ее решаемой.

4. @sanjay хорошо, это работает, но я хотел бы щелкнуть много прямоугольников, например, 2 или 5, а не только один, и после повторного нажатия на выбранный прямоугольник изменить цвет обратно на красный, может быть, QMap для сохранения этого прямоугольника?