qt学习第三天

qt学习第三天

1)封装一个新的ui界面,提升到其他界面。从而做到不需要每次都制作同一个界面:
在项目内点击添加新文件->选择qt->qt设计师界面->选择一个界面模板->填写类名->完成添加。
之后在想要添加的界面中放入一个widget模块,对自制界面进行盛放,并点击提升提升。
此界面如下:
在这里插入图片描述
之后进行对界面进行完成的代码:
void(QSpinBox::*sigvaluechanged)(int)=&QSpinBox::valueChanged;//因为valueChanged为重载函数。
connect(ui->spinBox,sigvaluechanged,ui->horizontalSlider,&QSlider::setValue);
connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
QPushButton *p=new QPushButton(“按钮”,this);//按钮进行实时的显示slider和spinbox的值。
p->move(40,10);
p->resize(30,30);
QTextEdit *q=new QTextEdit(“123”,this);
q->resize(100,30);
connect(p,&QPushButton::clicked,q,[=]{
q->setText(QString::number(ui->spinBox->value()));
});
****只有mainwindow才有工具栏状态栏。
2)label的操作,例如鼠标进入,鼠标离开,鼠标按下,鼠标移动,定时器等。
小知识点:
字符串的拼接:例如QString str=QString("%!%2%3").arg(1).arg(“2112”).arg(‘a’);
输出为12112a
%1对应第一个arg如果%1放到第三个位置
输出为2112a1
%!%2%3为占位符
常用代码:

#include "mylabl.h"
#include"QLabel"
#include"QMouseEvent"
#include"QTimer"
MyLabl::MyLabl(QWidget *parent) : QLabel(parent)
{
        p=new QLabel("123",this);
        p->resize(100,100);
        p->setFrameStyle(QFrame::Box);
        this->setMouseTracking(true);//qt自动不追踪
        id=startTimer(100);//第一种定时器利用回调函数,不需要自己调用,如果有两个定时器就会造成回调函数再判断
        QTimer *time=new QTimer(this);
        time->start(100);//第二种定时器
            connect(time, &QTimer::timeout, this, [=]()//每次100秒到了才进行记时间
            {
                static int number = 0;
                this->setText(QString::number(number++));
            });
}
void MyLabl::leaveEvent(QEvent *event)
{
    p->setText("离开");
}
void MyLabl::enterEvent(QEvent *event)
{
    p->setText("进入");
}
void MyLabl::mousePressEvent(QMouseEvent *event)
{
    QString btn;
    if(event->button() == Qt::LeftButton)
    {
        btn = "LeftButton";
    }
    else if(event->button() == Qt::RightButton)
    {
        btn = "RightButton";
    }
    else if(event->button() == Qt::MidButton)
    {
        btn = "MidButton";
    }
    QString str = QString("MousePree[%3]:(%1, %2)").arg(event->x()).arg(event->y()).arg(btn);

    setText(str);
}
void MyLabl::mouseMoveEvent(QMouseEvent *ev)
{
    QString btn;
    if(ev->buttons() & (Qt::LeftButton | Qt::RightButton))
    {
        btn = "LeftButton";
    }
    else if(ev->buttons() & Qt::RightButton)
    {
        btn = "RightButton";
    }
    else if(ev->buttons() & Qt::MidButton)
    {
        btn = "MidButton";
    }
    QString str = QString("MouseMove[%3]:(%1, %2)").arg(ev->x()).arg(ev->y()).arg(btn);

    setText(str);
}
void MyLabl::timerEvent(QTimerEvent *event)
{
//    static int num=0;
//    if(num==100)
//    {
//        killTimer(id);
//    }
//    else{
//        num++;
//         setText(QString::number(num));
//    }
}

3)绘图的工具
画图类:Qpainter
QImage Qpixmap图片 Qpicture不是图片
Qimage不依赖于平台。
Qpixmap依赖于平台
Qpicture(1)只是一个绘图设备1.只保存绘图步骤(一堆数据)2.不是图片二进制文件3.不依赖于平台。
QBitmap是黑白图片,它的父类是Qpixmap
void paintEvent(OPaintEvent *)
1.它是回调函数
2.此函数不需要用户调用,再刷新时自动调用。
什么为刷新?
1.窗口显示的时候
2.最大化最小化的时候
3.窗口被遮挡重新显示的时候
4.用户强制刷新的时候
3.如果使用画家类,一定要在paintEvent函数中完成。
Qpainter p(this)其中this不是父类,而是指定画图设备
联系代码:

#include "widget.h"
#include "ui_widget.h"
#include"QPaintEvent"
#include"QPainter"
#include"QPoint"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    a=new QPushButton("移动",this);
    a->move(100,100);
    a->resize(50,50);
    connect(a,&QPushButton::clicked,this,[=]{
        update();
    });
    ui->setupUi(this);

}

Widget::~Widget()
{
    delete ui;
}
void Widget::paintEvent(QPaintEvent *a)
{
#if 0
   QPainter p(this );
   p.drawPixmap(0,0,QPixmap(":/Image/xks.png"));//画一张图片
   QPen pen;
   pen.setColor(QColor(100,100,100));//设置笔的颜色,里面也可以写参数例如QT::green
   pen.setWidth(10);//设置笔宽
   pen.setStyle(Qt::DashLine);//还有其他几种类型
   p.setPen(pen);//p重新设置画笔
   p.drawLine(QPoint(100,100),QPoint(50,50));//画线


   p.drawEllipse(QPoint(50,50),50,50);//画椭圆
   QBrush brush(Qt::blue);//定义蓝色画刷
   brush.setTextureImage(QImage(":/Image/face.png"));
   p.setBrush(brush);//p的画刷设置为蓝色也可以刷图片
   p.drawRect(100,100,150,150);//画矩形

 QRect q(100,100,200,200);//设置矩形
// p.drawRect(q);
   QRect array[2]={q,QRect(100,100,300,300)};//设置矩形数组
   p.drawRects(array,0);//画一个数组的矩形,后面一个int类型数代表个数,画到数组第几个
   pen.setColor(QColor(0,0,0));
   p.setPen(pen);
   QFont font("正楷",48,75,true);
   p.setFont(font);
   p.drawText(100,100,"哈哈哈哈哈哈");
#endif
   QPainter p(this );
   int static x=20;
   x+=5;
   if(x>this->width())//this->width()为当前窗口的宽度
       {
       x=20;
   }
   p.drawPixmap(x,100,QPixmap(":/Image/Luffy.png"));//画一张图片




}

4)利用Qpicture,Qpixmap,Qimage绘图,并保存
练习代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPicture>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //Qpixmap中画图
    QPixmap pix(300,300);//纸的大小
    pix.fill(Qt::green);
    QPainter p(&pix);//pix为画图设备
    p.setPen(QPen(QColor(150,150,150),10));
    p.drawLine(100,100,50,50);
    p.drawEllipse(150,150,50,50);
    pix.save("D:\\mypixmap.png");
    // 指定绘图设备 1. 构造函数中(参数是绘图设备)
    // 2. begin(参数是绘图设备)
    //    end();
   // 在QImage中画图
    QImage img(300, 300, QImage::Format_RGB32);  // 纸的大小
        img.fill(Qt::red);
        p.begin(&img);
        p.setPen(QPen(Qt::green, 10));
        p.drawRect(10, 10, 280, 280);
        p.drawEllipse(150, 150, 50, 50);
        p.end();
        img.save("D:\\myImage.png");

        // 在QPicture中画图
        // 1. 保存的是绘图步骤 -- 画家类
        // 2. 不是图片, 二进制文件(save保存生成的文件)
        // 3. 不依赖平台
       QPicture pic;  // 纸的大小
       p.begin(&pic);
       p.setPen(QPen(Qt::green, 10));
       p.drawRect(10, 10, 280, 280);
       p.drawEllipse(150, 150, 50, 50);
       p.end();
       pic.save("D:\\mypic.aaa");

}

Widget::~Widget()
{
    delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    //p.drawPixmap(0,0,QPixmap("D:\\myImage.png"));
    QPicture pic;
    pic.load("D:\\mypic.aaa");
    p.drawPicture(100,100,pic);

}

5)利用png图片显示出不规则界面
练习如下:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 加载图片
       pix.load("D:\\sunny.png");
       // 去掉边框
       this->setWindowFlags(Qt::FramelessWindowHint);
       // 设置背景透明
       this->setAttribute(Qt::WA_TranslucentBackground);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *)
{
    // 在窗口中将图片画出来
    QPainter p(this);
    p.drawPixmap(0, 0, pix);
}
void Widget::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton)
    {
        // 求差值 左键按下的点 - 窗口坐上角的点坐标
        pt = e->globalPos() - this->frameGeometry().topLeft();
    }
    else if(e->button() == Qt::RightButton)
    {
        // close windows
        this->close();
    }
}
void Widget::mouseMoveEvent(QMouseEvent *e)
{
    // mvoe x , y 使用的屏幕坐标系
    // e->x() , e->y() 窗口的坐标系 Widget
    this->move(e->globalPos() - pt);
}

重要代码:
// 去掉边框
this->setWindowFlags(Qt::FramelessWindowHint);
// 设置背景透明
this->setAttribute(Qt::WA_TranslucentBackground);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值