3-文件与绘图操作

1.自定义控件的封装

1.1 控件封装与调用
//1.创建一个新的QT设计师界面类Form
	//1.在Form的ui界面中,自定义组合控件Tool Box和Slider
	//2.通过widget控件,将自定义控件进行封装
//2.在widget源文件中调用新控件
	//1.ui界面中添加一个widget控件
	//2.将该控件提升为Form类
//3.运行即可将Form类的组合控件当作widget类的控件输出
1.2控件的关联
//Slider随spinBox改变
void (QSpinBox::*change)(int) = &QSpinBox::valueChanged;
connect(ui->spinBox, change, ui->horizontalSlider, &QSlider::setValue);
//spinBox随Slider改变
connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox,  &QSpinBox::setValue);
1.3 设置/获取封装控件数值
//1.在Form类中定义设置/获取的成员函数
	//1.设置spinBox的值
void Form::Changed()
{

    ui->spinBox->setValue(50);
}
	//2.获取spinBox的值
int Form::getvalue()
{
    return ui->spinBox->value();
}

//2.在Widget类中调用组合控件接口
	//1.调用组合控件的接口,获取值
    connect(ui->pushButton, &QPushButton::clicked, this, [=]()
    {
        qDebug() << ui->widget->getvalue();
    });
    //2.调用组合控件的接口,设置值
    connect(ui->pushButton_2, &QPushButton::clicked, this, [=]()
    {
        ui->widget->Changed();
    });

2. 鼠标事件

//1.将建一个label控件用于挂载鼠标事件
	//1.ui界面添加一个label控件
	//2.创建一个Mylabel类
	//3.将label控件提升为Mylabel类
//2.在Mylabel类中定义重写鼠标事件
	//1.鼠标进入
void MyLabel::enterEvent(QEvent *event)
{
    qDebug() << "鼠标进入";
}
	//2.鼠标离开
void MyLabel::leaveEvent(QEvent *event)
{
    qDebug() << "鼠标离开";

}
	//3.鼠标点击
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
    	//1.若点击的是左键
    if(ev->button() == Qt::LeftButton)
    {
       	//2.打印点击的坐标
        QString str = QString("鼠标点击 x = %1, y = %2").arg(ev->x(), ev->y());
        qDebug() << str;
    }
}
	//4.鼠标释放
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    if(ev->button() == Qt::LeftButton)
    {
        QString str = QString("鼠标释放 x = %1, y = %2").arg(ev->x(), ev->y());
        qDebug() << str;
    }
}
	//5.鼠标移动
void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
    	//1.设置自动捕捉鼠标,无需判断是否点击
//    this->setMouseTracking(true);

    if(ev->buttons() & Qt::LeftButton)   
    {
        QString str = QString("鼠标移动 x = %1, y = %2").arg(ev->x(), ev->y());
        qDebug() << str;
    }
}

3.定时器事件

//1.构造函数中启动定时器
	//定时器的时间,传出定时器的id
m_id1 = startTimer(1000);
m_id2 = startTimer(500);


//2.重写定时器事件
void Widget::timerEvent(QTimerEvent *event)
{
    //1.根据定时器id判断是哪一个定时器
    if(event->timerId() == m_id1)
    {
    //2.label控件的名字++
        static int num = 0;
        ui->label_2->setText(QString().number(num++));
    }
    
    if(event->timerId() == m_id2)
    {
        static int num = 0;
        ui->label_3->setText(QString().number(num++));
    }

}

4.定时器类

//1.创建定时器对象  
QTimer *timer = new QTimer(this);

//2.启动定时器,并设置时间
timer->start(2000);

//3.时间到,产生timeout信号,定义槽函数
connect(timer, &QTimer::timeout, this, [=]()
{
	static int num = 0;
	ui->label_4->setText(QString().number(num++));
});

//4.时间停止
connect(ui->pushButton, &QPushButton::clicked, timer, &QTimer::stop);

//5.若想在创建一个定时器,就再创建一个定时器对象即可

5. event事件分发器

鼠标点击、移动、释放、定时器事件,其中有些手动触发有些自动触发

事件由谁触发?触发—APP—event事件分发器-事件处理函数

event事件分发器也可以重写,可以拦截部分发给事件处理函数,但不建议[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-obJ2dyae-1595034157809)(C:\Users\10139\AppData\Roaming\Typora\typora-user-images\1586139325688.png)]

/*创建事件分发器函数*/	
bool MyLabel::event(QEvent *e)
{	
    //1.判断参数是否是要拦截的事件
	if(e->type == 拦截的事件)
	{
        
    //2.若是,则执行相关逻辑,并返回ture
		打印/输出等相关逻辑
		return true
	}
    //3.将不拦截的事件交给父类处理
	return QLabel::event(e);	
}

6. 事件过滤器

在APP—事件分发器之间在做一层拦截,就是事件过滤器。

//1.给安装事件过滤器
ui->控件->installEventFilter(this);

//2.重写事件过滤函数
bool MyWidget::eventFilter(QObject *obj, QEvent *ev)
{
	//1.判断控件是否要拦截的控件
    if(obj == ui->控件)
    {
    //2.判断事件是否要拦截的事件
        if(ev->type() == 拦截的事件)
        {
    //3.拦截事件处理逻辑, 并返回true        
            拦截事件处理逻辑;
            return true;          
        }
    }
    //4.不拦截的交给父类
    return QWidget::eventFilter(obj, ev);
}

7.绘图基本设置

绘图事件painterEvent事件,在窗体中用父类QWidget。

//1.重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    //this代表绘图的设置,让画家在当前的窗口中绘图
    QPainter painter(this);
    
//2.设置画笔
    //设置画笔
    QPen pen(QColor(255, 0, 0));
    //设置笔的宽度
    pen.setWidth(3);
    //设置笔的风格
    pen.setStyle(Qt::SolidLine);
    //让画家拿起画笔
    painter.setPen(pen);
    
//3.设置画刷       
    //设置画刷 给封闭图案填充颜色
    QBrush brush(Qt::green);
    brush.setStyle(Qt::Dense2Pattern);
    //画家拿起画刷
    painter.setBrush(brush); 
    brush.setStyle(Qt::Dense2Pattern);
    
//4.进行画图 
    //划线
    painter.drawLine(QPoint(0, 0), QPoint(100,100));
    //画圆
    painter.drawEllipse(QPoint(100, 100), 50, 50);
    //画矩形
    painter.drawRect(QRect(50, 50, 50, 50));
    //画文字
    painter.drawText(QRect(10, 200, 100, 50), "好好学习,天天向上");
}

8.绘图的高级设置

//抗锯齿效果, 效果好,效率低 	
	painter.drawEllipse(QPoint(100, 100), 50, 50);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(250, 100), 50, 50);
    
    painter.drawRect(QRect(20, 20, 50, 50));
    //移动画家坐标   
    painter.translate(100, 0);
    //保存状态
    painter.save();
    painter.drawRect(QRect(20, 20, 50, 50));
    painter.translate(100, 0);
    //读取状态
    painter.restore();
    painter.drawRect(QRect(20, 20, 50, 50));
    

9. 绘制图片

9.1 绘制图片
//1.添加QT图片资源
//2.调用成员函数,将图片添加
painter.drawPixmap(m_posx, 0, QPixmap(":/Image/Luffy.png"));
9.2 点击按钮移动图片
//1.创建按钮
//2.将按钮信号与移动图片坐标函数想关联
connect(ui->pushButton, &QPushButton::clicked, this, [=]()
{
	m_posx += 10;
    //1.判断移动的坐标是否还在当前窗口中
    if(m_posx > this->width())
    {
        m_posx = 0;
    }
    //2.手动调用绘图时间
    update();
});

10. Qfile读文件

//点击打开,创建对话框打开文件
connect(ui->pushButton, &QPushButton::clicked, this, [=]()
{
    //1.显示路径
   		 //1.创建一个对话框
    QString ret = QFileDialog::getOpenFileName(this, "打开文件", "F:\\03-绘图与文件操作\\Doc", "(*.txt)");   
   		 //2.显示路径
    ui->lineEdit->setText(ret);
    //2.显示内容
    	//1.创建文件对象
    QFile file(ret);
    	//2.打开文件
    file.open(QIODevice::ReadOnly);
    	//3.读取内容
    QByteArray arr =  file.readAll();
   	 	//4.显示内容
    ui->textEdit->setText(arr);
   		//5.关闭文件
    file.close();
    //3.写文件
        file.open(QIODevice::Append);
        file.write("啊啊啊啊啊");
        file.close();

    //4.获取文件信息
        //1.创建文件信息对象
        QFileInfo info(ret);
        //2.获取文件信息
        qDebug() << "后缀名:"<<info.suffix() << "文件名:"<<info.fileName()
         << "文件路径:"<<info.filePath()<<"文件大小:"<<info.size();
        //3.获取时间
        qDebug() <<"创建日期:" << info.created().toString("yy/MM/dd hh:ss:ss");

});

");
file.close();

//4.获取文件信息
    //1.创建文件信息对象
    QFileInfo info(ret);
    //2.获取文件信息
    qDebug() << "后缀名:"<<info.suffix() << "文件名:"<<info.fileName()
     << "文件路径:"<<info.filePath()<<"文件大小:"<<info.size();
    //3.获取时间
    qDebug() <<"创建日期:" << info.created().toString("yy/MM/dd hh:ss:ss");

});


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值