QT 对于按钮实现的思考
来源:互联网 发布:mac地址表老化时间 编辑:程序博客网 时间:2024/05/18 03:29
突然想知道按钮是如何被响应的
1.
在操作系统中假设两个应用窗口重叠了一部分
例如:
此时我点击后面一个窗体 就会将后面的窗体置前
使用射线技术,也就是说 ,以鼠标当前坐标(鼠标中断,传入坐标和按下的按钮(左键,右键,扩展键)) 发出射线,进行碰撞检测,例如3D世界的子弹碰到后返回碰撞窗体,控件的句柄,直接往句柄上发送点击消息,若该控件不处理则往上传递消息
然后我是根据一个栈,例如应用程序栈,从栈顶开始搜索,如果当前窗体被点击,即将被点击的窗体移动至栈顶,刷新屏幕,不再往下传递点击事件(因为已经碰撞了)
那么按钮是不是也是这样做的呢
首先 窗体必然知道自己有的所有控件(包含按钮控件)
同时维护一个控件栈
当鼠标移动事件中断产生时,中断给操作系统,操作系统给对应应用程序(例如某窗体)
这是窗体对自己的控件从栈顶开始遍历 如果某个控件被选中,则触发鼠标移入效果,移出产生移出效果
点击时则控件点击事件(将被点击的控件移动至栈顶,调用点击响应函数,刷新屏幕),不再往下传递点击事件
QT中实验的方法是
某控件.raise();//将某个控件移动至顶端
#include <QApplication>#include <QWidget>#include <QDebug>#include <QPushButton>int main(int argc, char *argv[]){ QApplication a(argc, argv); QWidget *use = new QWidget(); QPushButton *button1 = new QPushButton(use); button1->setGeometry(10,10,200,50); QPushButton *button2 = new QPushButton(use); button2->setGeometry(100,100,200,50); QObjectList q = use->children(); qDebug() << q.length(); for(int i=0;i<q.length();i++) { QObject* o = q.at(i); if (o->inherits("QPushButton")) { QPushButton* b = qobject_cast<QPushButton*>(o); b->setText(QString::number(i,10)); } //end if } //end for QObject::connect(button1, &QPushButton::pressed, [=]() { button1->raise(); QObjectList q = use->children(); qDebug() << q.length(); for(int i=0;i<q.length();i++) { QObject* o = q.at(i); if (o->inherits("QPushButton")) { QPushButton* b = qobject_cast<QPushButton*>(o); b->setText(QString::number(i,10)); } //end if } //end for }); use->show(); return a.exec();}
阅读全文
0 0
- QT 对于按钮实现的思考
- QT实现按钮的三态
- 对于大盘的思考
- 对于工作的思考
- 对于未来的思考
- 对于管理者的思考
- 对于模式的思考
- 对于nginx的思考
- 对于学习的思考
- 对于POJ3264的思考
- 对于人工智能的思考
- 对于测试的思考
- 对于时间的思考
- QT实现透明效果的按钮
- Qt 按钮如何实现背景图片的加载
- Qt按钮的文字变化实现
- Qt 按钮如何实现背景图片的加载
- Qt 按钮如何实现背景图片的加载
- 自己用心开始写的第一篇博客
- 习题3.11
- 反射和正则基础
- 简单理解委托和事件
- IO(输入输出)(一)字节流
- QT 对于按钮实现的思考
- CentOS7使用YUM安装Adobe Flash Player
- 16. 3Sum Closest
- 模拟
- 2017
- Linux 安装redis以及redis扩展
- 初识线程1---入门1
- Linux 文件目录 ls 文件类型
- 回文树