- QT自定义控件
方法:
第一步 创建一个QTProject,基类为QWidget(勾选ui); 第二步 在.ui界面中创建所需控件; 第三步 在这个Project中点击Project名添加新文件, 添加一个C++ class,继承QWidget; 第四步 在这个的.ui中拖一个Widget控件,然后选择Widget右键提升,输入第一个的类名; 第五步 关联第一个类中的控件之间的联系.
例子:horizintalSlider and spinbox
api(片段):
setRange(0,100) connect(ui->horizontalSlider,&QSlider::valueChanged,[=](int value){ ui->spinBox->setValue(value); connect(ui->spinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), ui->horizontalSlider,&QSlider::setValue);
拓展:
set two PushButtons and one can get the value of the horizontalSlider, the another one can set the value of the horizontalSlider.
Mind:
在第一个创建的自定义Widget中给出2个函数, int get_value()----the first PushButton和void set_value(int value)---the second PushButton, 最后通过按钮的槽函数就可以实现了.
- 常用事件处理
方法: 在所有组件的父类 QWidget 中,定义了很多事件处理的函数,如
◼ keyPressEvent():键盘按键按下事件
◼ keyReleaseEvent():键盘按键松开事件
◼ mouseDoubleClickEvent():鼠标双击事件
◼ mouseMoveEvent():鼠标移动事件
◼ mousePressEvent():鼠标按键按下事件
◼ mouseReleaseEvent() : 鼠标按键松开事件
◼ 等等
这些函数都是 protected virtual 的,也就是说,我们可以在子类中重新实
现这些函数。
例子:
第一步 创建一个QTProject,基类为QWidget(勾选ui); 第二步 在.ui中拖一个Label的控件; 第三步 在这个Project中点击Project名添加新文件, 添加一个C++ class,继承QLabel; 第四步 把窗口的Label控件提升为第三步创建的类; 第五步 在新建类中重写方法中的虚函数.
api(片段):
头文件 #include<QMouseEvent>//设置一开始就有鼠标跟踪setMouseTracking(true)void mousePressEvent(QMouseEvent *e):e->x;e->y;int button=e->button();if( button==Qt::LeftButton);.. button==Qt::RightButton;.. button==Qt::RightButton;..//Label支持html的写法QString str=QString("<h1><center>pressed[%1,%2]</center></h1>").arg(x).arg(y);this->setText(str);void mouseMoveEvent(QMouseEvent *e):其他同上,补充如下int button=e->buttons();..if(buttons & Qt::LeftButton)..if(buttons & Qt::RightButton)..if(buttons & Qt::MidButton)
3.事件分发器(事件分发函数)
作用: 分发各种事件到事件处理函数中.
方法:
第一步 创建一个QTProject,基类为QWidget(勾选ui); 第二步 在.ui中拖一个Label的控件; 第三步 在这个Project中点击Project名添加新文件, 添加一个C++ class,继承QLabel; 第四步 把窗口的Label控件提升为第三步创建的类; 第五步 在新建类中重写事件分发函数.
api:
//事件分发函数 bool myLabel::event(QEvent *e) {//如果返回值是true, 表示事件被处理了//如果返回值是false,表示事件没有被处理比如:if(e->type()==QEvent::MouseMove){ return true;}//让其他事件传递下去return QLabel::event(e);}
4.事件过滤器
作用:
1.事件到达窗口之前要经过事件过滤器 与事件分发器不同的地方: 如果窗口中有多个label,那么点击多个label,这时,多个label都可以接收到鼠标点击事件, 如果要截取鼠标点击事件,那么可以从事件过滤器中统一截取; 2.事情过滤器是一个object的对象或子类的对象; 3.事件过滤器需要安装; 4.在object的对象或子类对象中重写事件过滤器函数.
方法一:
第一步 创建一个QTProject,基类为QWidget(勾选ui); 第二步 在.ui中拖一个Label的控件; 第三步 在这个Project中点击Project名添加新文件, 添加一个C++ class,继承QLabel; 第四步 把窗口的Label控件提升为第三步创建的类; 第五步 在这个新建的类中重写了事件过滤器函数.
api:
//重写事件过滤器函数bool myLabel::eventFilter(QObject *watched, QEvent *event){//返回值是true,表示该事件受到拦截,不会到达窗口//返回值是false,表示该事件没有受到拦截if(event->type()==QEvent::MouseButtonPress){ return true;}return false;}Finally://新建的Label类构造函数中,安装事件过滤器 this->installEventFilter(this);
方法二:
第一步 创建一个QTProject,基类为QWidget(勾选ui); 第二步 在.ui中拖一个Label的控件; 第三步 在这个Project中点击Project名添加新文件, 添加一个C++ class,继承QLabel; 第四步 把窗口的Label控件提升为第三步创建的类; 第五步 再创建一个类,继承Object; 第六步 在该类中重写了事件过滤器函数;
api:
#include<QEvent>//事件过滤器的头文件bool myEvent::eventFilter(QObject *watched, QEvent *event){//返回值是true,表示该事件受到拦截,不会到达窗口//返回值是false,表示该事件没有受到拦截if(event->type()==QEvent::MouseButtonPress){ //return true;}return false;}Finally://安装事件过滤器,在新建的继承Label的类中myEvent *filter=new MyEvent(this);this->installEventFilter(filter);