国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件

這篇具有很好參考價(jià)值的文章主要介紹了【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本章要實(shí)現(xiàn)的整體效果如下:

【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件,《QT開發(fā)筆記-基礎(chǔ)篇》,qt,c++,事件,無(wú)邊框窗口

QEvent::MouseButtonPress

? 鼠標(biāo)按下時(shí),觸發(fā)該事件,它對(duì)應(yīng)的子類是 QMouseEvent

QEvent::MouseMove

? 鼠標(biāo)移動(dòng)時(shí),觸發(fā)該事件,它對(duì)應(yīng)的子類是 QMouseEvent

QEvent::MouseButtonRelease

? 鼠標(biāo)釋放時(shí),觸發(fā)該事件,它對(duì)應(yīng)的子類是 QMouseEvent


本節(jié)通過(guò)兩個(gè)案例來(lái)講解這 3 個(gè)事件:

  • 按下、移動(dòng)、釋放事件的基本使用
  • 拖動(dòng)一個(gè)標(biāo)簽,使之移動(dòng)位置

1. 按下、移動(dòng)、釋放事件的基本使用

同樣使用上一節(jié)自定義的標(biāo)簽 LabelX,來(lái)進(jìn)行講解

1.1 鼠標(biāo)按下、釋放事件

首先,來(lái)到 labelx.h,聲明這 3 個(gè)函數(shù):

class LabelX : public QLabel
{
protected:
    void mousePressEvent(QMouseEvent* ev);
    void mouseReleaseEvent(QMouseEvent* ev);
    void mouseMoveEvent(QMouseEvent* ev);
};

然后,來(lái)到 labelx.cpp 實(shí)現(xiàn)這 3 個(gè)函數(shù):

void LabelX::mousePressEvent(QMouseEvent* ev)
{
    // qDebug() << "mousePressEvent: " << ev->button() << ev->pos() << ev->globalPos();
    if ( ev->button() == Qt::LeftButton ) {
        qDebug() << "左鍵按下: " << "x=" << ev->x() << ", y=" << ev->y();
    }
}

void LabelX::mouseReleaseEvent(QMouseEvent* ev)
{
    // qDebug() << "mouseReleaseEvent: " << ev->button() << ev->pos() << ev->globalPos();
    if ( ev->button() == Qt::LeftButton ) {
        qDebug() << "左鍵釋放: " << "x=" << ev->x() << ", y=" << ev->y();
    }
}

void LabelX::mouseMoveEvent(QMouseEvent* ev)
{
}

最后,來(lái)到 press_move_release_widget.cpp,在構(gòu)造函數(shù)中添加 LabelX 控件,如下:

#include "labelx.h"

PressMoveReleaseWidget::PressMoveReleaseWidget(QWidget* parent) : QWidget{parent}
{
    QVBoxLayout* verticalLayout = new QVBoxLayout(this);
    verticalLayout->setSpacing(0);
    verticalLayout->setContentsMargins(0, 0, 0, 0);

    // 1. 添加一個(gè)自定義的標(biāo)簽 LabelX
    LabelX* lblX = new LabelX(this);
    lblX->setText("");
    lblX->setFrameShape(QFrame::Box);
    lblX->setFixedHeight(50);
    lblX->setAlignment(Qt::AlignCenter);
    lblX->setStyleSheet("background-color: blue;color: white;font-size: 25px");
    verticalLayout->addWidget(lblX);
}

此時(shí)運(yùn)行程序,在標(biāo)簽上點(diǎn)擊時(shí),就會(huì)在控制臺(tái)打印按下還是釋放,并顯示點(diǎn)擊的位置:

【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件,《QT開發(fā)筆記-基礎(chǔ)篇》,qt,c++,事件,無(wú)邊框窗口


1.2 鼠標(biāo)移動(dòng)事件

鼠標(biāo)移動(dòng),與鼠標(biāo)按下和釋放,在判斷按鍵時(shí)有些許不同

如果 mouseMoveEvent 實(shí)現(xiàn)如下:

void LabelX::mouseMoveEvent(QMouseEvent* ev)
{
    qDebug() << "mouseMoveEvent: " << ev->button() << ev->pos() << ev->globalPos();
}

運(yùn)行結(jié)果如下:

【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件,《QT開發(fā)筆記-基礎(chǔ)篇》,qt,c++,事件,無(wú)邊框窗口

我明明按下的是左鍵,但是打印的卻是沒有按鍵按下

因?yàn)?,此時(shí)不能使用 ev->button(),而是要使用 ev->buttons(),如下:

void LabelX::mouseMoveEvent(QMouseEvent* ev)
{
    // 而是要用buttons()方法
    qDebug() << "mouseMoveEvent: " << ev->buttons() << ev->pos() << ev->globalPos();
}

此時(shí),就可以正確打印了,如下:

【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件,《QT開發(fā)筆記-基礎(chǔ)篇》,qt,c++,事件,無(wú)邊框窗口

可見,剛開始移動(dòng)只按左鍵,移動(dòng)過(guò)程中又按下了右鍵,也是可以識(shí)別到的。

在移動(dòng)過(guò)程中,判斷有左鍵按下的代碼,如下:

void LabelX::mouseMoveEvent(QMouseEvent* ev)
{
    if ( ev->buttons() & Qt::LeftButton ) {
        qDebug() << "左鍵移動(dòng)中: " << "x=" << ev->x() << ", y=" << ev->y();
    }
}

這樣,鼠標(biāo)按下、移動(dòng)、釋放的整體效果,如下:

【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件,《QT開發(fā)筆記-基礎(chǔ)篇》,qt,c++,事件,無(wú)邊框窗口


1.3 鼠標(biāo)跟蹤

以上,需要鼠標(biāo)保持按下的狀態(tài)下,系統(tǒng)才會(huì)調(diào)用 mouseMoveEvent,實(shí)際工作中往往有這么一種需求:

鼠標(biāo)懸浮在控件上,而不是按下,就觸發(fā) mouseMoveEvent 事件,這怎么實(shí)現(xiàn)呢?

答案:設(shè)置鼠標(biāo)跟蹤,默認(rèn)情況下鼠標(biāo)跟蹤是關(guān)閉的,需要開啟


首先,來(lái)到 labelx.cpp 中,設(shè)置標(biāo)簽使能鼠標(biāo)跟蹤,如下:

LabelX::LabelX(QWidget* parent) : QLabel{parent}
{
    this->setMouseTracking(true);
}

然后,在 mouseMoveEvent 中添加打印,如下:

void LabelX::mouseMoveEvent(QMouseEvent* ev)
{
    qDebug() << "mouseMoveEvent: " << ev->buttons() << ev->pos() << ev->globalPos();
    if ( ev->buttons() & Qt::LeftButton ) {
        qDebug() << "左鍵移動(dòng)中: "
                 << "x=" << ev->x() << ", y=" << ev->y();
    }
}

此時(shí),在標(biāo)簽上懸浮移動(dòng)時(shí),也可以跟蹤到鼠標(biāo),如下:

【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件,《QT開發(fā)筆記-基礎(chǔ)篇》,qt,c++,事件,無(wú)邊框窗口


2. 鼠標(biāo)事件移動(dòng)標(biāo)簽

接下來(lái),實(shí)現(xiàn)一個(gè)小案例:拖動(dòng)標(biāo)簽來(lái)移動(dòng)標(biāo)簽的位置

2.1 界面上添加標(biāo)簽

首先,在 press_move_release_widget.h 中添加成員變量:

#include <QLabel>

class PressMoveReleaseWidget : public QWidget
{
private:
    QLabel* lbl;
    QWidget* widget;
};

QLable 外邊套一層 QWidget,是為了讓標(biāo)簽在這個(gè) widget 范圍內(nèi)移動(dòng)


然后,在 press_move_release_widget.cpp 的構(gòu)造中添加一個(gè)標(biāo)簽:

PressMoveReleaseWidget::PressMoveReleaseWidget(QWidget* parent) : QWidget{parent}
{
	// ...
    
    // 2. 添加一個(gè) QLabel
    widget = new QWidget(this);
    lbl = new QLabel(widget);
    lbl->setText("");
    lbl->setFrameShape(QFrame::Box);
    lbl->setFixedSize(100, 100);
    lbl->setStyleSheet("background-color: red;");
    verticalLayout->addWidget(widget);
}

此時(shí),運(yùn)行效果如下:

【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件,《QT開發(fā)筆記-基礎(chǔ)篇》,qt,c++,事件,無(wú)邊框窗口


2.2 為 QLabel 安裝事件過(guò)濾器

PressMoveReleaseWidget::PressMoveReleaseWidget(QWidget* parent) : QWidget{parent}
{
   	// ...
    lbl->installEventFilter(this);
}

2.3 重寫 eventFilter() 函數(shù)

重寫當(dāng)前窗口的 eventFilter() 函數(shù)

首先,在 press_move_release_widget.h 文件中聲明該函數(shù),

同時(shí)聲明記錄窗口位置和鼠標(biāo)按下位置的變量,如下:

class PressMoveReleaseWidget : public QWidget
{
protected:
    bool eventFilter(QObject* watched, QEvent* event);
    
private:
    QPoint pressPos;
    QPoint wndPos;
};

然后,在 press_move_release_widget.cpp 文件中實(shí)現(xiàn)該函數(shù),如下:

#include <QEvent>
#include <QMouseEvent>
#include <QDebug>
bool PressMoveReleaseWidget::eventFilter(QObject* watched, QEvent* event)
{
    if ( watched != lbl ) {
        return QWidget::eventFilter(watched, event);
    }

    if ( event->type() == QEvent::MouseButtonPress ) {
        qDebug() << "MouseButtonPress";
        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
        pressPos = mouseEvent->globalPos();
        wndPos = lbl->pos();
        qDebug() << wndPos;
    } else if ( event->type() == QEvent::MouseMove ) {
        qDebug() << "MouseMove";
        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
        QPoint dstPos = wndPos + (mouseEvent->globalPos() - pressPos);
        lbl->move(dstPos);
        // 超出了最左邊
        if ( lbl->pos().x() < 0 ) {
            lbl->move(0, dstPos.y());
        }
        // 超出了最右邊
        if ( lbl->pos().x() > widget->width() - lbl->width() ) {
            lbl->move(widget->width() - lbl->width(), dstPos.y());
        }
        // 超出了最上邊
        if ( lbl->pos().y() < 0 ) {
            lbl->move(dstPos.x(), 0);
        }
        // 超出了最下邊
        if ( lbl->pos().y() > widget->height() - lbl->height() ) {
            lbl->move(dstPos.x(), widget->height() - lbl->height());
        }
    } else if ( event->type() == QEvent::MouseButtonRelease ) {
        qDebug() << "MouseButtonRelease";
    }
}

這里有些實(shí)現(xiàn)細(xì)節(jié),說(shuō)明如下:

  • 如果不是 lbl 的事件,直接調(diào)用父類處理 return QWidget::eventFilter(watched, event)
  • 在鼠標(biāo)按下時(shí),記錄 lbl 的位置和鼠標(biāo)按下位置,作為窗口移動(dòng)時(shí)的參考
  • 當(dāng) lbl 超出 widget 邊界時(shí),讓它等于邊界值

此時(shí),就可以通過(guò)鼠標(biāo)拖動(dòng)標(biāo)簽,在 widget 范圍內(nèi)移動(dòng)了,如下:

【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件,《QT開發(fā)筆記-基礎(chǔ)篇》,qt,c++,事件,無(wú)邊框窗口文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-719954.html

到了這里,關(guān)于【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標(biāo)按下、移動(dòng)、釋放事件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 王道計(jì)網(wǎng) 第四章筆記

    王道計(jì)網(wǎng) 第四章筆記

    生活在網(wǎng)絡(luò)層的“工人”是路由器,他負(fù)責(zé)各種異構(gòu)網(wǎng)絡(luò)的連接,但是因?yàn)樗簧钤谇叭龑铀詮木W(wǎng)絡(luò)層之上的東西他不能管理,所以網(wǎng)路層之上的數(shù)據(jù)對(duì)于路由器來(lái)說(shuō)必須是相同的、透明的。 常見的網(wǎng)絡(luò)層協(xié)議有IP 和 ICMP TCP IP傳輸層協(xié)議 FTP應(yīng)用層協(xié)議 一句話區(qū)分IP和M

    2024年02月14日
    瀏覽(20)
  • python筆記:第四章使用字典

    說(shuō)白了就是鍵值對(duì)的映射關(guān)系 不會(huì)丟失數(shù)據(jù)本身關(guān)聯(lián)的結(jié)構(gòu),但不關(guān)注數(shù)據(jù)的順序 是一種可變類型 鍵的類型:字典的鍵可以是任何不可變的類型,如浮點(diǎn)數(shù),字符串,元組 可以從其他映射或鍵值對(duì)創(chuàng)建字典 將字符串格式設(shè)置功能用于字典 使用format_map將兩者結(jié)合起來(lái) 就地

    2024年02月13日
    瀏覽(69)
  • 西瓜書學(xué)習(xí)筆記---第四章 決策樹

    西瓜書學(xué)習(xí)筆記---第四章 決策樹

    目錄 一、題目要求 二、數(shù)據(jù)集介紹 ?三、決策樹模型 3.1 決策樹模型介紹 3.2?決策樹算法原理 3.2.1 決策樹的建立 3.2.2 決策樹的劃分(1)—信息增益ID3 3.2.3 決策樹的劃分(2)—Gini指數(shù)CART 3.2.4 預(yù)剪枝pre-pruning 3.2.5 后剪枝post-pruning 3.3?決策樹算法核心代碼解釋 四、運(yùn)行結(jié)果

    2024年02月04日
    瀏覽(26)
  • 操作系統(tǒng)-筆記-第四章-文件管理

    操作系統(tǒng)-筆記-第四章-文件管理

    一、第一章——操作系統(tǒng)的概念 二、第二章——【進(jìn)程】 二、第二章——【線程】?編輯 二、第二章——【進(jìn)程調(diào)度】 二、第二章——【進(jìn)程同步與互斥】 二、第二章——【鎖】 三、第三章——內(nèi)存管理 四、第四章——文件管理 五、第五章——輸入輸出管理 ???學(xué)習(xí)心

    2024年02月11日
    瀏覽(19)
  • 第四章:前端框架Vue基礎(chǔ)入門

    第四章:前端框架Vue基礎(chǔ)入門

    本章學(xué)習(xí)目標(biāo): 了解Vue框架架構(gòu)思想 掌握Vue核心指令 掌握計(jì)算屬性與監(jiān)視 掌握組件化開發(fā)模式 官方文檔:https://cn.vuejs.org/guide/introduction.html. 文檔可選擇使用optionsAPI(選項(xiàng)式API)閱讀,或者CompositionApi(組合式API)閱讀。選項(xiàng)式API更適合平滑從vue2過(guò)渡,以下示例均以Compositi

    2024年02月12日
    瀏覽(24)
  • 計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)第四章

    計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)第四章

    主要任務(wù)是把 分組 從源端傳到目的端,為分組交換網(wǎng)上的不同主機(jī)提供通信服務(wù)。網(wǎng)絡(luò)層傳輸單位是 數(shù)據(jù)報(bào) 。 功能一:路由選擇與分組轉(zhuǎn)發(fā)( 最佳路徑 ) 功能二:異構(gòu)網(wǎng)絡(luò)互聯(lián) 功能三:擁塞控制(若所有結(jié)點(diǎn)都來(lái)不及接受分組,而要丟棄大量分組的話,網(wǎng)絡(luò)就處于 擁塞

    2024年02月16日
    瀏覽(22)
  • JAVA學(xué)習(xí)筆記——第四章 運(yùn)算符

    JAVA學(xué)習(xí)筆記——第四章 運(yùn)算符

    ?? 博客主頁(yè) :?A_SHOWY ?? 系列專欄 :力扣刷題總結(jié)錄?數(shù)據(jù)結(jié)構(gòu)??云計(jì)算??數(shù)字圖像處理??力扣每日一題_?運(yùn)算符是一種特殊的符號(hào),用于表示數(shù)據(jù)的運(yùn)算、賦值和比較 取模 %的本質(zhì): a - (int)a / b * b//當(dāng)a是小數(shù)時(shí) 自增 獨(dú)立語(yǔ)句使用時(shí),++i和i++沒有區(qū)別的。但是如果作

    2024年01月20日
    瀏覽(31)
  • 計(jì)算機(jī)網(wǎng)絡(luò)-筆記-第四章-網(wǎng)絡(luò)層

    計(jì)算機(jī)網(wǎng)絡(luò)-筆記-第四章-網(wǎng)絡(luò)層

    一、第一章——計(jì)算機(jī)網(wǎng)絡(luò)概述 二、第二章——物理層 三、第三章——數(shù)據(jù)鏈路層 四、第四章——網(wǎng)絡(luò)層 五、第五章——運(yùn)輸層 六、第六章——應(yīng)用層 目錄 ??????? 四、第四章——網(wǎng)絡(luò)層 1、網(wǎng)絡(luò)層概述 (1)虛電路服務(wù)——面向連接 (2)虛電路服務(wù)——無(wú)連接

    2024年02月11日
    瀏覽(25)
  • 第四章--Redis基礎(chǔ)知識(shí)和面試題

    第四章--Redis基礎(chǔ)知識(shí)和面試題

    Redis 是一個(gè)基于內(nèi)存的k-v結(jié)構(gòu)數(shù)據(jù)庫(kù) 基于內(nèi)存存儲(chǔ),讀寫性能高 適合存儲(chǔ)熱點(diǎn)數(shù)據(jù)(熱點(diǎn)商品, 資訊, 新聞) 企業(yè)應(yīng)用廣泛 Redis入門 簡(jiǎn)介: 應(yīng)用場(chǎng)景 ?緩存 任務(wù)隊(duì)列 消息隊(duì)列 分布式鎖 數(shù)據(jù)類型 常用命令 redis常用命令鏈接 redis.net.cn java中操作redis 介紹 :::info redis啟動(dòng)默認(rèn)有16個(gè)

    2024年02月07日
    瀏覽(23)
  • 西瓜書讀書筆記整理(五)—— 第四章 決策樹

    西瓜書讀書筆記整理(五)—— 第四章 決策樹

    4.1.1 什么是決策樹算法 決策樹算法 是一種通過(guò)構(gòu)建 樹形結(jié)構(gòu) 進(jìn)行分類和回歸的機(jī)器學(xué)習(xí)算法。 決策樹由結(jié)點(diǎn) (node) 和有向邊 (directed edge) 組成。結(jié)點(diǎn)有兩種類型:內(nèi)部結(jié)點(diǎn) (internal node) 和葉結(jié)點(diǎn) ( leaf node)。內(nèi)部結(jié)點(diǎn)表示一個(gè)特征或?qū)傩?,葉結(jié)點(diǎn)表示一個(gè)類。 4.1.2 決策樹學(xué)習(xí)

    2024年02月13日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包