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

原创粉丝点击