- 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);