1 QPainter
[1]将坐标平移,因为(0,0)点在左上角,所以往往需要进行平移
void QPainter::translate(qreal dx, qreal dy)
[2]消除锯齿,使形状边缘看起来更加圆滑
void QPainter::setRenderHint(QPainter::RenderHint hint, bool on = true)
如果on为真,则在油漆工上设置给定的渲染提示;否则清除渲染提示。
[3]缩放坐标系
void QPainter::scale(qreal sx, qreal sy)
[4]设置轮廓颜色
void QPainter::setPen(const QPen &pen)
设置画家的笔为给定的笔。
void QPainter::setPen(const QColor &color)
void QPainter::setPen(Qt::PenStyle style)
以下类型的笔:
Qt::NoPen
Qt::SolidLine
Qt::DashLine
Qt::DotLine
Qt::DashDotLine
Qt::DashDotDotLine
Qt::CustomDashLine
[5]设置刷子颜色
void QPainter::setBrush(const QBrush &brush)
[6]旋转
void QPainter::rotate(qreal angle)
顺时针旋转坐标系,给定的角度参数以度为单位。
[7]画多边形
void QPainter::drawConvexPolygon(const QPointF *points, int pointCount)
使用当前笔绘制由数组点中的第一个点计数点定义的凸多边形。
[8]画点、线...其余查看文档
void QPainter::drawLine(int x1, int y1, int x2, int y2)
......
[9]恢复当前的油漆工状态(从堆栈中弹出保存的状态)。
void QPainter::restore()
2 经典实例
模拟时钟。
.h核心:
protected:
//重写父类的虚函数virtual void paintEvent(QPaintEvent *event);
void paintEvent(QPaintEvent *event);
//重写鼠标双击事件virtual void mouseDoubleClickEvent(QMouseEvent *event);消息
void mouseDoubleClickEvent(QMouseEvent *event);
signals:
void sendSingal();
public slots:
void getSingal();
private:
Ui::Clock *ui;
//定义时针分针秒针
static const QPoint hour[4];
static const QPoint minute[4];
static const QPoint second[4];
.cpp核心
//全局变量
const QPoint Clock::hour[4] = {QPoint(0,-80),QPoint(14,0),QPoint(0,40),QPoint(-14,0)};
const QPoint Clock::minute[4] = {QPoint(0,-100),QPoint(12,0),QPoint(0,35),QPoint(-12,0)};;
const QPoint Clock::second[4] = {QPoint(0,-120),QPoint(10,0),QPoint(0,30),QPoint(-10,0)};;
this->setWindowFlags(Qt::WindowCloseButtonHint);
QTimer *timer = new QTimer();
connect(timer,SIGNAL(timeout()),
this,SLOT(update()));
timer->start(1000);
connect(this,&Clock::sendSingal,
this,&Clock::getSingal);
void Clock::paintEvent(QPaintEvent *event)
{
//准备一只画笔
QPainter painter(this);
//获取当前时间
QTime time = QTime::currentTime();
//将QPainter坐标进行平移
painter.translate(this->width()/2,this->height()/2);
//消除锯齿,使形状边缘看起来更加圆滑
painter.setRenderHint(QPainter::Antialiasing,true);
int size = this->width() < this->height() ? this->width() : this->height();
//按比例进行绘制
painter.scale(size/480.0,size/480.0);
//秒针
//设置画笔颜色
painter.setPen(Qt::red);
//设置刷子颜色
painter.setBrush(Qt::red);
//保存当前画面的状态,为要进行绘制做参照物
painter.save();
painter.rotate(6.0*time.second());
painter.drawConvexPolygon(Clock::second,4);
painter.restore();
//分针
painter.setPen(Qt::green);
painter.setBrush(Qt::green);
painter.save();
painter.rotate(6.0*time.minute() + time.second()/10.0);
painter.drawConvexPolygon(minute,4);
painter.restore();
//时针
painter.setPen(Qt::blue);
painter.setBrush(Qt::blue);
painter.save();
painter.rotate(30.0*time.hour() + time.minute()/2.0);
painter.drawConvexPolygon(hour,4);
painter.restore();
//表盘的小刻度,共计60个
for(int i=0;i<60;i++)
{
painter.setPen(Qt::black);
painter.rotate(6);
painter.drawLine(0,-130,0,-128);
}
//每隔五分钟画一刻度,并显示数字
for(int i=1;i<13;i++)
{
painter.setPen(Qt::black);
painter.rotate(30);
painter.drawLine(0,-130,0,-124);
painter.drawText(0,-110,QString::number(i));
}
//画出3、6、9、12刻度
for(int i=0;i<4;i++)
{
painter.setPen(Qt::black);
painter.rotate(90);
painter.drawLine(0,-130,0,-120);
}
//画出360*10个点,偏转0.1°,表盘
for(int i=0;i<360*10;i++)
{
painter.setPen(Qt::black);
painter.rotate(0.1);
painter.drawPoint(0,-130);
}
}
//当鼠标双击的时候,发送信号,干别的事情。
void Clock::mouseDoubleClickEvent(QMouseEvent *event)
{
//this->sendSingal(); //ok
emit sendSingal();
}
void Clock::getSingal()
{
QMessageBox::information(this,"系统当前时间",QTime::currentTime().toString("hh:mm:ss"));
}
鼠标双击:
3 其他
3.1 设置窗口flag
void setWindowFlags(Qt::WindowFlags type);
Q_DECLARE_FLAGS(WindowFlags, WindowType)
Q_DECLARE_OPERATORS_FOR_FLAGS(WindowFlags)
enum WindowState {
WindowNoState = 0x00000000,
WindowMinimized = 0x00000001,
WindowMaximized = 0x00000002,
WindowFullScreen = 0x00000004,
WindowActive = 0x00000008
};
enum WindowType {
......
CustomizeWindowHint = 0x02000000,
WindowStaysOnBottomHint = 0x04000000,
WindowCloseButtonHint = 0x08000000,
MacWindowToolBarButtonHint = 0x10000000,
......
};
this->setWindowFlags(Qt::WindowCloseButtonHint);
未设置:
设置后:
3.2 QPoint
QPoint::QPoint(int xpos, int ypos)
用给定的坐标(xpos, ypos)构造一个点。
3.3 发送自己的信号
this->sendSingal();//ok
emit sendSingal();//ok