QT 對於按鈕實現的思考

突然想知道按鈕是如何被響應的


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章