#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 для сохранения этого прямоугольника?