自定义控件封装
- 添加新文件->Qt->设计师界面类(.h .cpp .ui)
- .ui中设计QSpinBox和QSlider两个控件
- Widget中使用自定义控件,拖拽一个widget,点击提升为,点击添加,点击提升
- 实现功能:改变数字,滑动条跟着移动,信号槽监听
- 提供getNum 和 setNum 对外接口
- 测试接口
widget.cpp //点击获取 获取当前控件的值 connect(ui->btn_get,&QPushButton::clicked,[=](){ qDebug() << ui->widget->getNum(); }); //设置到一半 connect(ui->btn_set,&QPushButton::clicked,[=](){ ui->widget->setNum(50); }); smallwidget.cpp //QSpainBox移动 QSlider跟着移动 void(QSpinBox:: * spSignal)(int) = &QSpinBox::valueChanged; connect(ui->spinBox,spSignal,ui->horizontalSlider,&QSlider::setValue); //QSlider滑动 QSpinBox数字跟着改变 connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue); //设置数字 void smallWidget::setNum(int num){ ui->spinBox->setValue(num); } //获取数字 int smallWidget::getNum(){ return ui->spinBox->value(); } smallwidget.h //设置数字 void setNum(int num); //获取数字 int getNum();
Qt中的事件
- 鼠标事件
- 鼠标进入事件 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)
//鼠标进入事件 void enterEvent(QEvent *event); //鼠标离开事件 void leaveEvent(QEvent *); //鼠标移动 virtual void mouseMoveEvent(QMouseEvent * ev); //鼠标按下 virtual void mousePressEvent(QMouseEvent * ev); //鼠标释放 virtual void mouseReleaseEvent(QMouseEvent * ev);
myLabel::myLabel(QWidget *parent) : QLabel(parent) { //设置鼠标追踪状态 setMouseTracking(true); } //鼠标进入事件 void myLabel::enterEvent(QEvent *event){ qDebug() << "鼠标进入了"; } //鼠标离开事件 void myLabel::leaveEvent(QEvent *){ qDebug() << "鼠标离开了"; } //鼠标移动 void myLabel::mouseMoveEvent(QMouseEvent * ev){ //if(ev->buttons() & 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::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){ 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 timerEvent(QTimerEvent * ev)
- 启动定时器 startTimer(1000) 毫秒单位
- timerEvent的返回值是定时器的唯一标识 可以和ev->timerId做比较
定时器2
- 利用定时器类 QTimer
- 创建定时器对象 QTimer * timer = new QTimer(this)
- 启动定时器 timer->start(毫秒)
- 每隔一定毫秒,发送信号 timeout ,进行监听
- 暂停 timer->stop
//重写定时器的事件 void timerEvent(QTimerEvent *); int id1; //定时器1的唯一标识 int id2; //定时器2的唯一标识
//启动定时器 id1 = startTimer(1000); //参数1 间隔 单位 毫秒 id2 = startTimer(2000); //定时器第二种方式 QTimer * timer = new QTimer(this); //启动定时器 timer->start(500); connect(timer,&QTimer::timeout,[=](){ static int num3 = 1; //label4每隔0.5秒+1 ui->label_4->setText(QString::number(num3++)); }); //点击暂停按钮 实现停止定时器 connect(ui->btn,&QPushButton::clicked,[=](){ timer->stop(); }); } void Widget::timerEvent(QTimerEvent * ev){ if(ev->timerId() == id1){ static int num = 1; //label2每隔1秒+1 ui->label_2->setText(QString::number(num++)); } if(ev->timerId() == id2){ //label3每隔2秒+1 static int num2 = 1; ui->label_3->setText(QString::number(num2++)); } }
event事件
- 用途:用于事件的分发
- 也可以做拦截操作,不建议
- bool event(QEvent * e);
- 返回值 如果是true代表用户处理这个事件,不向下分发了
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); }
事件过滤器
1.在程序将事件分发到事件分发器前,可以利用过滤器做拦截
2.步骤
- 给控件安装事件过滤器
- 重写eventFilter函数(obj , ev)
//给label1安装事件过滤器 //步骤1安装事件过滤器 ui->label->installEventFilter(this); //步骤2 重写eventfilter事件 bool Widget::eventFilter(QObject * obj,QEvent * e){ if(obj == ui->label) { //如果是鼠标按下 在event事件分发中拦截操作 if(e->type() == QEvent::MouseButtonPress) { QMouseEvent * ev = static_cast<QMouseEvent *>(e); 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; return true; //true代表用户自己处理这个事件,不向下分发 } } //通知event事件分发器 拦截 鼠标按下事件 bool event(QEvent * e);