一、自定义控件
1、自定义控件封装
1、添加新文件->Qt->设计师界面类(.h .cpp .ui)
2、.ui->设计QSpinBox和QSlider两个控件
3、Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升
4、实现功能,改变数字,滑动条跟着移动,信号槽监听
5、提供getNum和setNum对外接口
6、测试接口
二、Qt中的事件
1、鼠标事件
鼠标进入事件 enterEvent
鼠标离开事件 leaveEvent
鼠标按下 mousePressEvent(QMouseEvent ev)
鼠标释放 mouseReleaseEvent
鼠标移动 mouseMoveEvent
ev->x() x坐标 ev->y() y坐标
ev->button()可以判断所有按键 Qt::LeftButton Qt::RightButton
ev->buttons()判断组合按键 判断move时的左右键 结合&操作符
格式化字符串方式 QString("%1 %2").arg(111).arg(222)
2、定时器1
1、利用事件 timerEvent (QTimerEvent * ev)
2、启动定时器 startTimer(1000) 单位 毫秒
3、timerEvent的返回值是定时器的唯一标识 可以和ev->timerId作比较
if(ev->timerId()==id1)
{
//每隔1秒加1
static int num = 1;
ui->label->setText(QString::number(num++));
}
if(ev->timerId()==id2)
{
//每隔2秒加1
static int num2 = 1;
ui->label_2->setText(QString::number(num2++));
}
2、定时器2
1、利用定时器类 QTimer
2、创建定时器对象 QTimer * timer = new QTimer(this)
3、启动定时器 timer->start(毫秒)
4、每隔一定毫秒,发送信号 timeout 进行监听
5、暂停 timer->stop(毫秒)
QTimer * timer = new QTimer(this);
//启动定时器
timer->start(50);
connect(timer,&QTimer::timeout,[=](){
//每隔0.05秒加1
static int num = 1;
ui->label_3->setText(QString::number(num++));
});
3、Event事件分发器
1、用于事件分发,也可以做操作拦截,但是不建议
2、bool event (QEvent * e);
3、返回值 如果是ture代表用户处理这个事件,不向下分发了
4、e->type() == 鼠标按下 ...
4、事件过滤器
1、在程序将事件分发到事件分发器前 可以利用过滤器做拦截
2、 步骤1:安装事件过滤器
步骤2:重写eventFilter函数(obj , ev)
三、QPainter绘图
1、QPainter绘图
1、绘图事件 void paintEvent()
2、声明一个画家对象 QPainter painter(this) this 指定绘图设备
3、画线、画圆、画矩形、画文字
4、设置画笔QPen 设置画笔宽度 风格
5、设置画刷QBrush 设置画刷风格
2、高级设置
1、抗锯齿 效率低 painter.setRenderHint(QPainter::Antialiasing);
2、对画家进行移动 painter.translate(100,0);
3、保存画家状态painter.save();
4、还原画家状态painter.restore();
5、如果想手动调用绘图事件 利用update
6、利用画家画图片 painter.drawPixmap( x , y , QPixmap(Spider))
3、QPaintDevice绘图设备
1、QPixmap QImage QBitmap(黑白色) QPicture QWidget
2、QPixmap对不同平台做了显示的优化
① QPixmap pix(300,300)
② pix.fill(填充颜色)
③ 利用画家往Pix上画画 QPainter painter(& pix)
④ 保存 pix.save("路径")
3、QImage对像素进行访问
① 使用和QPixmap差不多 QImage img(300,300,QImage::Format_RGB32);
② 其他流程和QPimax一样
③ 可以对像素进行修改 img.setPixel(i,j,value)
4、QPicture 记录和重现 绘图指令
① QPicture pic
② painter.begin(&pic);
③ 保存 pic.save(任意后缀名)
④ 重现 利用画家可以重现painter.drawPicture(0,0,pic);