摘要:自定义控件方法第一步创建一个基类为勾选第二步在界面中创建所需控件第三步在这个中点击名添加新文件添加一个继承第四步在这个的中拖一个控件然后选择右键提升输入第一个的类名第五步关联第一个类中的控件之间的联系例子片段拓展在第一个创建的自定
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(&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//设置一开始就有鼠标跟踪 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(" "). 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)
pressed[%1,%2]
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//事件过滤器的头文件 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);
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/114696.html
摘要:热门编程语言特点包罗万物精细对底层知识涉列广泛。特点语法简单可移植性良好。编写代码的工具建议新手先使用编程工具,学习两个月后再尝试其他的编译器,推荐使用大后期熟练掌握,因为实际开发环境多在上进行。 热门编程语言 1、C++: 特点:包罗万物、精细、对底层知识...
摘要:首发于我的博客线程池进程池网络编程之同步异步阻塞非阻塞后端掘金本文为作者原创,转载请先与作者联系。在了解的数据结构时,容器可迭代对象迭代器使用进行并发编程篇二掘金我们今天继续深入学习。 Python 算法实战系列之栈 - 后端 - 掘金原文出处: 安生 栈(stack)又称之为堆栈是一个特殊的有序表,其插入和删除操作都在栈顶进行操作,并且按照先进后出,后进先出的规则进行运作。 如...
摘要:也是可以设置使用静态库的温馨提示对兼容性比较好,因此推荐使用编译器。下安装编译器温馨提示如果中已经安装编译器,则该安装步骤可以跳过。 00. 目录 文章目录 00...
阅读 3405·2021-11-24 09:39
阅读 1796·2021-11-17 09:33
阅读 3502·2021-10-12 10:12
阅读 5018·2021-09-22 15:51
阅读 1111·2019-08-30 13:11
阅读 3570·2019-08-30 10:59
阅读 563·2019-08-30 10:48
阅读 1311·2019-08-26 13:48