突然想知道按鈕是如何被響應的
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();
}