Qt绘图事件

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值