【五天时间】Qt从入门到实战:第三天
第一天
https://blog.csdn.net/qq_40507857/article/details/125730739
第二天
https://blog.csdn.net/qq_40507857/article/details/125863093
第三天
3.1 自定义控件封装
- 添加新文件 - Qt - 设计师界面类 - (.h, .cpp, .ui)
- .ui中设计QSpinBox和QSlider
- Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升
- 实现功能,改变数字,滑动条跟着移动,信号和槽监听
- 提供getNum和setNum对外接口
- 测试接口
3.2 Qt中的鼠标事件
- 鼠标进入事件 enterEvent
- 鼠标离开事件 leaveEvent
- 鼠标按下
- 鼠标释放
- 鼠标移动
- ev->x() x坐标 ev->y() y坐标
- ev->button() 可以判断所有的按键 Qt::LeftButton Qt::RightButton
- ev-buttons() 判断组合按键
- 格式化字符串 QString(“%1 %2”).arg(111).arg(222);
//鼠标进入事件
void myLabel::enterEvent(QEvent *event){
// qDebug()<<"鼠标进入事件";
}
//鼠标离开事件
void myLabel::leaveEvent(QEvent *event){
// qDebug()<<"鼠标离开事件";
}
//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev){
if(ev->button()==Qt::LeftButton){
QString str = QString("鼠标按下 x=%1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
}
//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent *ev){
qDebug()<<"鼠标释放";
}
//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev){
qDebug()<<"鼠标移动";
}
3.3 定时器
定时器1
- 利用事件 void timerEvent(QTimerEvent *event)
- 启动定时器 startTimer(1000) 毫秒单位
- timerEvent的返回值是定时器的唯一标识,可以和event->timerId做比较
定时器2
- 利用定时器类 QTimer
- 创建定时器对象 QTimer *timer = new QTimer(this)
- 启动定时器 timer->start(毫秒)
- 每隔一定的毫秒,发送信号 timeout,进行监听
- 暂停 timer->stop
3.4 Event事件分发器
- 用途:用于事件的分发,也可以做拦截(不建议)
- bool event(QEvent * e)
- 返回值 如果是true,代表用户处理这个事件,不需要向下分发
- e->type()==鼠标按下事件类型
//通过Event事件分发器 拦截 鼠标按下事件
bool myLabel::event(QEvent *e){
//如果是鼠标按下事件,在Event事件分发中做拦截操作
if(e->type()==QEvent::MouseButtonPress){
QMouseEvent *ev=static_cast<QMouseEvent *>(e);
QString str = QString("Event函数:鼠标按下 x=%1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
return true;//true代表用户自己处理这个事件,不向下分发
}
//其他事件 交给父类处理 默认处理
return QLabel::event(e);
}
3.5 事件过滤器
- 在程序将事件分发到事件分发器前,可以利用过滤器做拦截
- 步骤:
- 给控件安装事件过滤器
- 重写eventFilter函数
3.6 QPainter
- 绘图事件 void paintEvent()
- 声明一个画家对象 QPainter painter(this) this 指定绘图设备
- 画线、画圆、画矩形、画文字
- 设置画笔QPen、设置画笔宽度、风格
- 设置画刷QBrush 设置画刷风格
void Widget::paintEvent(QPaintEvent *event){
//实例化画家对象 this指定的是绘图设备
QPainter painter(this);
//设置画笔
QPen pen(QColor(255,0,0));
//设置画笔宽度
pen.setWidth(3);
//设置画笔的风格
pen.setStyle(Qt::DotLine);
//让画家使用这个笔
painter.setPen(pen);
//设置画刷
QBrush brush(Qt::cyan);
//让画家使用画刷
painter.setBrush(brush);
//画线
painter.drawLine(QPoint(0,0),QPoint(100,100));
//画圆(椭圆)
painter.drawEllipse(QPoint(100,100),50,50);
//画矩形
painter.drawRect(QRect(20,20,50,50));
//画文字
painter.drawText(QRect(10,200,150,50),"好好学习,天天向上!");
}
- 抗锯齿导致效率低
- 对画家进行移动、保存状态、还原状态
3.7 绘图设备
- QPainterDevice绘图设备:QPixmap,QImage,QBitmap(黑白),QPicture,QWidget
- QPixmap对不同平台做了显示的优化
- QImage可以对像素进行访问
- QPicture记录和重现绘图指令
3.8 QFile对文件的读写操作
- QFile file(path)
- 读文件file.open(打开方式)
- 全部读取 file.readAll()
- 按行读取 file.readLine()
- 判断是否读到文件尾 file.atEnd()
- 利用编码格式类指定读取格式 QTextCodeC
- 写文件 file.open(QIODevice::writeOnly/Append)
- file.write(内容)
//点击选取文件按钮,弹出文件对话框
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString path = QFileDialog::getOpenFileName(this,"打开文件");
//将路径放入到lineEdit中
ui->lineEdit->setText(path);
//读取内容 放入到textEdit中
QFile file(path);
//设置打开方式
file.open(QIODevice::ReadOnly);
// QByteArray array=file.readAll();
QByteArray array;
while (!file.atEnd()) {
array+=file.readLine();//按行读取
}
//文件对象关闭
file.close();
//进行写文件
file.open(QIODevice::Append);//用追加方式进行写
file.write("这是追加的内容!");
file.close();
//QFileInfo 文件信息类
QFileInfo info(path);
qDebug()<<"大小:"<<info.size()<<"后缀:"<<info.suffix()<<"名称:"<<info.fileName()<<"路径:"<<info.filePath();
qDebug()<<"创建日期:"<<info.created().toString("yyyy-MM-dd hh:mm:ss");
qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");