我编写了一个显示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;
}
}
这很好用。如何实现一个改变被点击的矩形颜色的功能?我应该将该矩形存储在列表中吗?
答案 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();
}
}