在窗口的正中央绘制一个6*6的单元格的方阵,其中:(1)每个单元格的宽和高分别为50,边线为黑色,内部用蓝色填充;(2)用户在单元格方阵内点击鼠标时,被点击单元格的填充色变为红色,用户连续点击单元格内的不同的单元格,只有当前被点击的单元格的填充色为红色,其它单元格的填充色依然为蓝色。
图(a)程序启动后的界面 图(b)用户点击的单元格变色示意
图2 计算单元对话框
提示:
- 重载paintEvent函数用于绘图;重载mousePressEvent函数用于响应鼠标消息;
- 使用QPainter类的对象绘图,用setBrush函数设置画刷颜色,用setPen用于设置画笔的颜色,用drawRect函数绘制单元格;
- 调用update函数迫使窗口重绘。
1.Mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<qpainter.h>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setFixedSize ( int w, int h )
{
setFixedSize(400,400);
}
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 设置画笔颜色
painter.setPen(QColor(0,0,0));
// 反走样
painter.setRenderHint(QPainter::Antialiasing, true);
// 设置画笔颜色、宽度
// 设置画刷颜色
painter.setBrush(QColor(Qt::blue));
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
painter.drawRect(50+j*50, 50+i*50, 50, 50);
}
}
painter.setPen(QColor(0,0,0));
painter.setBrush(QColor(255, 0, 0));
int xx=(x-50)/50+1;
int yy=(y-50)/50+1;
painter.drawRect(xx*50, yy*50, 50, 50);
}
void MainWindow::mousePressEvent(QMouseEvent *e)
{
x=e->x();
y=e->y();
update();
}
2.MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QMouseEvent>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *e);
void setFixedSize(int w, int h);
int x;
int y;
};
#endif // MAINWINDOW_H