Qt——升級系列(Level Seven):事件、文件

目錄

Qt事件

? 事件介紹

? 事件的處理

? 按鍵事件

? 鼠標事件

? 定時器

? 事件分發器

? 事件過濾器

Qt文件

? Qt文件概述

? 輸入輸出設備類

? 文件讀寫類

? 文件和目錄信息類


Qt事件

? 事件介紹

????????事件是應?程序內部或者外部產?的事情或者動作的統稱。在 Qt 中使??個對象來表??個事件。所有的 Qt 事件均繼承于抽象類 QEvent。事件是由系統或者 Qt 平臺本?在不同的時刻發出的。當??按下?標、敲下鍵盤,或者是窗?需要重新繪制的時候,都會發出?個相應的事件。?些事件是在??操作時發出,如鍵盤事件、?標事件等,另?些事件則是由系統本??動發出,如定時器事件。

常?的 Qt 事件如下:

常?事件描述:?

事件名稱
描述
?標事件
?標左鍵、?標右鍵、?標滾輪,?標的移動,?標按鍵的按下和松開
鍵盤事件
按鍵類型、按鍵按下、按鍵松開
定時器事件
定時時間到達
進?離開事件
?標的進?和離開
滾輪事件
?標滾輪滾動
繪屏事件
重繪屏幕的某些部分
顯?隱藏事件
窗?的顯?和隱藏
移動事件
窗?位置的變化
窗?事件
是否為當前窗?
??改變事件
窗???改變
焦點事件
鍵盤焦點移動
拖拽事件
??標進?拖拽

? 事件的處理

????????事件處理?般常?的?法為:重寫相關的 Event 函數。

????????在 Qt 中,?乎所有的 Event 函數都是虛函數,所以可以重新實現。如:在實現?標的進?和離開事件時,直接重新實現 enterEvent() 和 leaveEvent() 即可。

enterEvent() 和 leaveEvent() 函數原型如下:

? 按鍵事件

????????Qt 中的按鍵事件是通過 QKeyEvent 類來實現的。當鍵盤上的按鍵被按下或者被釋放時,鍵盤事件便會觸發。在幫助?檔中查找 QKeyEvent 類如下:

????????查找按鍵事件中所有的按鍵類型:在幫助?檔中輸?:Qt::Key,如下圖: ?

????????單個按鍵的例子

1、單個按鍵的按下事件:?

void MyWidget::keyPressEvent(QKeyEvent *event) 
{if (event->key() == Qt::Key_A) {qDebug() << "按下了 A 鍵";// 執行相應的操作}QWidget::keyPressEvent(event);  // 傳遞事件給父類處理
}

2、單個按鍵的釋放事件:?

void MyWidget::keyReleaseEvent(QKeyEvent *event) 
{if (event->key() == Qt::Key_A) {qDebug() << "釋放了 A 鍵";// 執行相應的操作}QWidget::keyReleaseEvent(event);  // 傳遞事件給父類處理
}

????????組合按鍵的例子

1、同時按下多個鍵的事件:

void MyWidget::keyPressEvent(QKeyEvent *event) 
{if (event->modifiers() & Qt::ControlModifier && event->key() == Qt::Key_C) {qDebug() << "同時按下了 Ctrl + C 鍵";// 執行相應的操作}QWidget::keyPressEvent(event);  // 傳遞事件給父類處理
}

?2、同時釋放多個鍵的事件:

void MyWidget::keyReleaseEvent(QKeyEvent *event) 
{if (event->modifiers() & Qt::ShiftModifier && event->key() == Qt::Key_F) {qDebug() << "同時釋放了 Shift + F 鍵";// 執行相應的操作}QWidget::keyReleaseEvent(event);  // 傳遞事件給父類處理
}

在上述示例中:

  • keyPressEvent()keyReleaseEvent() 函數分別處理按鍵按下和釋放事件。
  • 使用 QKeyEvent 對象的 key() 方法獲取按下或釋放的具體按鍵。
  • 使用 modifiers() 方法可以獲取同時按下的修飾鍵(如 Ctrl、Shift 等)。
  • 在處理完事件后,通常會調用 QWidget::keyPressEvent(event)QWidget::keyReleaseEvent(event) 將事件傳遞給父類處理,以確保其他部分的事件處理邏輯能夠正常運行。

? 鼠標事件

????????在 Qt 中,?標事件是? QMouseEvent 類來實現的。當在窗?中按下?標或者移動?標時,都會產??標事件。

????????利? QMouseEvent 類可以獲取?標的哪個鍵被按下了以及?標的當前位置等信息。在 Qt 幫助?檔中查找QMouseEvent類 如下圖?:

????????鼠標單擊事件的例子

void MyWidget::mousePressEvent(QMouseEvent *event) 
{if (event->button() == Qt::LeftButton) {qDebug() << "左鍵被按下";// 執行相應的操作} else if (event->button() == Qt::RightButton) {qDebug() << "右鍵被按下";// 執行相應的操作}QWidget::mousePressEvent(event);  // 傳遞事件給父類處理
}

????????鼠標釋放事件的例子

void MyWidget::mouseReleaseEvent(QMouseEvent *event) 
{if (event->button() == Qt::LeftButton) {qDebug() << "左鍵被釋放";// 執行相應的操作} else if (event->button() == Qt::RightButton) {qDebug() << "右鍵被釋放";// 執行相應的操作}QWidget::mouseReleaseEvent(event);  // 傳遞事件給父類處理
}

????????鼠標雙擊事件的例子

void MyWidget::mouseDoubleClickEvent(QMouseEvent *event) 
{if (event->button() == Qt::LeftButton) {qDebug() << "左鍵雙擊";// 執行相應的操作} else if (event->button() == Qt::RightButton) {qDebug() << "右鍵雙擊";// 執行相應的操作}QWidget::mouseDoubleClickEvent(event);  // 傳遞事件給父類處理
}

????????鼠標移動事件的例子

void MyWidget::mouseMoveEvent(QMouseEvent *event) 
{qDebug() << "鼠標移動到 (" << event->pos().x() << ", " << event->pos().y() << ")";// 執行相應的操作,例如更新鼠標位置的顯示等QWidget::mouseMoveEvent(event);  // 傳遞事件給父類處理
}

????????鼠標滾輪事件的例子?

void MyWidget::wheelEvent(QWheelEvent *event) 
{if (event->delta() > 0) {qDebug() << "鼠標向上滾動";// 執行相應的操作} else if (event->delta() < 0) {qDebug() << "鼠標向下滾動";// 執行相應的操作}QWidget::wheelEvent(event);  // 傳遞事件給父類處理
}

? 定時器

????????Qt 中在進?窗?程序的處理過程中,經常要周期性的執?某些操作,或者制作?些動畫效果,使?定時器就可以實現。所謂定時器就是在間隔?定時間后,去執?某?個任務。定時器在很多場景下都會使?到,如彈窗?動關閉之類的功能等。

Qt中的定時器分為 QTimerEvent 和 QTimer 這2個類。
????????? QTimerEvent類 ?來描述?個定時器事件。在使?時需要通過 startTimer() 函數來開啟?個定時器,這個函數需要輸??個以毫秒為單位的整數作為參數來表明設定的時間,它返回的整型值代表這個定時器。當定時器溢出時(即定時時間到達)就可以在 timerEvent() 函數中獲取該定時器的編號來進?相關操作。
????????? QTimer類 來實現?個定時器,它提供了更?層次的編程接?,如:可以使?信號和槽,還可以設置只運??次的定時器。

QTimerEvent 類

????????QTimerEvent類是用來描述定時器事件的類。它通常與 QObjecttimerEvent() 函數結合使用,用于處理定時器事件的回調操作。

使用方法:

  1. 啟動定時器: 通過 startTimer() 函數啟動一個定時器,該函數接受一個毫秒為單位的時間間隔作為參數,并返回一個整型值,代表該定時器的唯一標識符(定時器編號)。

  2. 定時器事件處理: 當定時器設定的時間間隔到達時,會觸發 timerEvent() 函數。在 timerEvent() 函數中,可以通過傳入的參數 QTimerEvent *event 來獲取定時器的具體信息,例如定時器的標識符,從而執行相應的操作。

  3. 代碼示例:

    void MyWidget::timerEvent(QTimerEvent *event) 
    {if (event->timerId() == timerId) {qDebug() << "定時器事件觸發,定時器ID:" << event->timerId();// 執行相應的定時操作}QWidget::timerEvent(event);  // 傳遞事件給父類處理
    }
    

QTimer 類

????????QTimer類提供了更高級別的定時器功能,其主要特點是能夠通過信號和槽機制來處理定時器事件,以及提供更多的靈活性和控制選項。

主要功能:

  1. 啟動定時器: 通過 QTimerstart() 函數啟動定時器,該函數接受一個毫秒為單位的時間間隔作為參數,還可以選擇性地設置定時器的單次觸發或重復觸發。

  2. 定時器信號和槽: QTimer 可以通過信號 timeout() 來定期觸發定時器事件。可以通過連接(connect)這個信號到槽函數來處理定時器事件,這使得定時器的使用更加方便和直觀。

  3. 單次運行定時器: 可以使用 setSingleShot(true) 方法設置定時器為只運行一次,適用于需要在一段時間后執行一次任務的場景。

  4. 代碼示例:

    // 創建一個 QTimer 對象
    QTimer *timer = new QTimer(this);// 設置定時器觸發的時間間隔,單位為毫秒
    timer->setInterval(1000); // 1秒// 連接定時器的 timeout() 信號到槽函數
    connect(timer, &QTimer::timeout, [=]() 
    {qDebug() << "定時器觸發";// 執行相應的定時操作
    });// 啟動定時器
    timer->start();
    

區別和選擇:

  • QTimerEvent 和 timerEvent(): 適合在自定義的 QObject 派生類中處理定時器事件,需要手動管理定時器的標識符和事件處理邏輯。

  • QTimer 類: 更高級別的接口,通過信號和槽機制處理定時器事件,適合在需要簡單設置和操作定時器的場景下使用,無需手動管理定時器事件。

? 事件分發器

????????概述

????????在 Qt 中,事件分發器(Event Dispatcher) 是?個核?概念,?于處理 GUI 應?程序中的事件。事件分發器負責將事件從?個對象傳遞到另?個對象,直到事件被處理或被取消。每個繼承? QObject類 或 QObject類 本?都可以在本類中重寫 bool event(QEvent *e) 函數,來實現相關事件的捕獲和攔截。

????????事件分發器?作原理

????????在 Qt 中,我們發送的事件都是傳給了 QObject 對象,更具體點是傳給了 QObject 對象的 event() 函數。所有的事件都會進?到這個函數??,那么我們處理事件就要重寫這個 event() 函數。event() 函數本?不會去處理事件,?是根據 事件類型(type值)調?不同的事件處理函數。事件分發器就是?作在應?程序向下分發事件的過程中,如下圖:

????????如上圖,事件分發器?于分發事件。在此過程中,事件分發器也可以做攔截操作。事件分發器主要是通過 bool event(QEvent *e) 函數來實現。其返回值為布爾類型,若為 ture,代表攔截,不向下分發。

????????Qt 中的事件是封裝在 QEvent類 中,在 Qt 助?中輸? QEvent 可以查看其所包括的事件類型,如下圖示:

????????在Qt中聲明和實現鼠標點擊事件、事件分發器以及攔截事件時,通常會遵循以下步驟。下面是一個基本的示例,分別在頭文件?widget.h 和實現文件?widget.cpp 中展示如何完成這些操作。

widget.h 頭文件中聲明

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMouseEvent>class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();protected:// 聲明鼠標點擊事件處理函數void mousePressEvent(QMouseEvent *event) override;// 聲明事件分發器函數bool event(QEvent *event) override;private:// 聲明攔截事件處理函數bool eventFilter(QObject *watched, QEvent *event) override;
};#endif // WIDGET_H

widget.cpp 實現文件中實現

#include "widget.h"
#include <QDebug>Widget::Widget(QWidget *parent) : QWidget(parent)
{// 安裝事件過濾器,用于攔截事件this->installEventFilter(this);
}Widget::~Widget()
{
}// 實現鼠標點擊事件處理函數
void Widget::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {qDebug() << "左鍵點擊,位置:" << event->pos();// 執行相應的操作} else if (event->button() == Qt::RightButton) {qDebug() << "右鍵點擊,位置:" << event->pos();// 執行相應的操作}// 將事件傳遞給父類處理QWidget::mousePressEvent(event);
}// 實現事件分發器函數
bool Widget::event(QEvent *event)
{if (event->type() == QEvent::MouseButtonPress) {// 處理鼠標按下事件QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);qDebug() << "事件分發器捕獲到鼠標按下事件,位置:" << mouseEvent->pos();// 執行相應的操作return true; // 表示事件已處理}// 其他事件交給父類處理return QWidget::event(event);
}// 實現事件過濾器函數
bool Widget::eventFilter(QObject *watched, QEvent *event)
{if (watched == this && event->type() == QEvent::MouseMove) {// 攔截并處理鼠標移動事件QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);qDebug() << "事件過濾器捕獲到鼠標移動事件,位置:" << mouseEvent->pos();// 執行相應的操作return true; // 表示事件已處理}// 其他事件交給父類處理return QWidget::eventFilter(watched, event);
}

?代碼說明:

  • mousePressEvent 函數: 在該函數中處理鼠標點擊事件。根據 QMouseEventbutton() 方法判斷是左鍵還是右鍵,并可以獲取鼠標點擊的位置信息。

  • event 函數: 這是事件分發器函數,用于捕獲所有類型的事件。在示例中,通過判斷事件的類型 (QEvent::MouseButtonPress) 來處理鼠標按下事件。

  • eventFilter 函數: 這是事件過濾器函數,通過調用 installEventFilter() 函數安裝到對象上。在示例中,通過判斷事件類型 (QEvent::MouseMove) 來處理鼠標移動事件。

? 事件過濾器

????????在 Qt 中,?個對象可能經常要查看或攔截另外?個對象的事件,如對話框想要攔截按鍵事件,不讓別的組件接收到,或者修改按鍵的默認值等。通過上?的學習,我們已經知道,Qt 創建了 QEvent事件對象之后,會調?QObject 的 event()函數 處理事件的分發。顯然,我們可以在 event()函數 中實現攔截的操作。由于 event()函數是 protected 的,因此,需要繼承已有類。如果組件很多,就需要重寫很多個event()函數。這當然相當?煩,更不?說重寫 event()函數還得???堆問題。好在 Qt 提供了另外?種機制來達到這??的:事件過濾器。

????????事件過濾器是在應?程序分發到 event事件分發器 之前,再做?次更?級的攔截。如下圖?:

事件過濾器的?般使?步驟:
?? ?1、安裝事件過濾器;
?? ?2、重寫事件過濾器函數:eventfilter() 。?

????????假設我們有一個 MyWidget 類,它繼承自 QWidget,并希望在該小部件上安裝事件過濾器來攔截按鍵事件。以下是如何在 widget.cpp 中實現這個示例:

#include "widget.h"
#include <QDebug>
#include <QKeyEvent>Widget::Widget(QWidget *parent) : QWidget(parent)
{// 創建一個 QLabel 作為被監視對象QLabel *label = new QLabel("監視對象", this);label->setGeometry(50, 50, 100, 30); // 設置標簽的位置和大小// 安裝事件過濾器到 label 上label->installEventFilter(this);
}bool Widget::eventFilter(QObject *watched, QEvent *event)
{if (watched->objectName() == "監視對象") {if (event->type() == QEvent::KeyPress) {QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);qDebug() << "按鍵事件被攔截:按鍵" << keyEvent->key() << "被按下";// 在此處可以根據需求修改事件或者阻止事件繼續傳遞// 例如,攔截所有按鍵事件,不讓它傳遞給監視對象return true; // 返回 true 表示事件已處理}}// 其他事件交給父類處理return QWidget::eventFilter(watched, event);
}

示例說明:

  1. 安裝事件過濾器:Widget 類的構造函數中,我們創建了一個 QLabel 對象作為被監視對象,并通過 installEventFilter() 函數將當前小部件 (this) 設置為其事件過濾器。

  2. 重寫事件過濾器函數:eventFilter() 函數中,我們對事件進行檢查和處理。在示例中,我們檢查了被監視對象的對象名是否為 "監視對象",如果是,并且事件類型為 QEvent::KeyPress,則我們攔截并處理按鍵事件。在實際應用中,你可以根據需要修改事件內容、記錄日志、阻止事件繼續傳遞等操作。

  3. 返回值解釋: 如果事件被處理了并且不需要傳遞給被監視對象,則返回 true;否則,返回 QWidget::eventFilter(watched, event),以繼續將事件傳遞給父類處理。

Qt文件

? Qt文件概述

?????????件操作是應?程序必不可少的部分。Qt 作為?個通?開發庫,提供了跨平臺的?件操作能?。 Qt提供了很多關于?件的類,通過這些類能夠對?件系統進?操作,如?件讀寫、?件信息獲取、?件復制或重命名等。

? 輸入輸出設備類

????????在 Qt 中,?件讀寫的類為 QFile 。QFile 的?類為 QFileDevice ,QFileDevice 提供了?件交互操作的底層功能。 QFileDevice 的?類是 QIODevice,QIODevice 的?類為 QObject 。

????????QIODevice 是 Qt 中所有輸?輸出設備(input/output device,簡稱 I/O 設備)的基礎類,I/O 設備就是能進?數據輸?和輸出的設備,例如?件是?種 I/O 設備,?絡通信中的 socket 是 I/O 設備, 串?、藍?等通信接?也是 I/O 設備,所以它們也是從 QIODevice 繼承來的。Qt 中主要的?些 I/O 設備類的繼承關系如下圖所?:

上圖中各類的說明如下:
????????? QFile 是?于?件操作和?件數據讀寫的類,使? QFile 可以讀寫任意格式的?件。
????????? QSaveFile 是?于安全保存?件的類。使? QSaveFile 保存?件時,它會先把數據寫??個臨時?件,成功提交后才將數據寫?最終的?件。如果保存過程中出現錯誤,臨時?件?的數據不會被寫?最終?件,這樣就能確保最終?件中不會丟失數據或被寫?部分數據。 在保存?較?的?件或復雜格式的?件時可以使?這個類,例如從?絡上下載?件等。
????????? QTemporaryFile 是?于創建臨時?件的類。使?函數 QTemporaryFile::open() 就能創建?個?件名唯?的臨時?件,在 QTemporaryFile 對象被刪除時,臨時?件被?動刪除。
????????? QTcpSocket 和 QUdpSocket 是分別實現了 TCP 和 UDP 的類。
????????? QSerialPort 是實現了串?通信的類,通過這個類可以實現計算機與串?設備的通信。
????????? QBluetoothSocket 是?于藍?通信的類。?機和平板計算機等移動設備有藍?通信模塊,筆記本電腦?般也有藍?通信模塊。通過QBluetoothSocket類,就可以編寫藍?通信程。如編程實現筆記本電腦與?機的藍?通信。
????????? QProcess 類?于啟動外部程序,并且可以給程序傳遞參數。
????????? QBuffer 以?個 QByteArray 對象作為數據緩沖區,將 QByteArray 對象當作?個 I/O 設備來讀寫。

? 文件讀寫類

????????在 Qt 中,?件的讀寫主要是通過 QFile 類來實現。在 QFile 類中提供了?些?來讀寫?件的?法。對于?件的操作主要有:
????????? 讀數據:QFile 類中提供了多個?法?于讀取?件內容;如 read()、readAll()、readLine()等。
????????? 寫數據:QFile 類中提供了多個?法?于往?件中寫內容;如 write()、writeData()等。
????????? 關閉?件:?件使?結束后必須?函數 close() 關閉?件。

????????訪問?個設備之前,需要使? open()函數 打開該設備,?且必須指定正確的打開模式,QIODevice 中所有的打開模式由 QIODevice::OpenMode 枚舉變量定義,其取值如下:

QIODevice::NotOpen
沒有打開設備
QIODevice::ReadOnly
以只讀?式打開設備
QIODevice::WriteOnly
以只寫?式打開設備
QIODevice::ReadWrite
以讀寫?式打開設備
QIODevice::Append
以追加?式打開設備,數據將寫到?件末尾
QIODevice::Truncate
每次打開?件后重寫?件內容,原內容將被刪除
QIODevice::Text
在讀?件時,?尾終?符會被轉換為 '\n';當寫??件時,?尾終?符會被轉換為 本地編碼。如 Win32上為'\r\n';
QIODevice::Unbuffered
?緩沖形式打開?件,繞過設備中的任何緩沖區
QIODevice::NewOnly
?件存在則打開失敗,不存在則創建?件

? 文件和目錄信息類

????????QFileInfo 是 Qt 提供的?個?于獲取?件和?錄信息的類,如獲取?件名、?件??、?件修改?期等。QFileInfo類中提供了很多的?法,常?的有:
????????? isDir() 檢查該?件是否是?錄;
????????? isExecutable() 檢查該?件是否是可執??件;
????????? fileName() 獲得?件名;
????????? completeBaseName() 獲取完整的?件名;
????????? suffix() 獲取?件后綴名;
????????? completeSuffix() 獲取完整的?件后綴;
????????? size() 獲取?件??;
????????? isFile() 判斷是否為?件;
????????? fileTime() 獲取?件創建時間、修改時間、最近訪問時間等;

代碼示例:

#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 創建一個 QFileInfo 對象,傳入文件路徑或者文件名QFileInfo fileInfo("/path/to/your/file.txt");// 獲取文件名QString fileName = fileInfo.fileName();qDebug() << "文件名:" << fileName;// 獲取文件路徑QString filePath = fileInfo.filePath();qDebug() << "文件路徑:" << filePath;// 獲取文件大小(字節)qint64 fileSize = fileInfo.size(); // 返回 qint64 類型qDebug() << "文件大小:" << fileSize << "bytes";// 獲取文件修改日期和時間QDateTime lastModified = fileInfo.lastModified();qDebug() << "最后修改時間:" << lastModified.toString(Qt::ISODate);// 獲取文件后綴名QString suffix = fileInfo.suffix();qDebug() << "文件后綴名:" << suffix;// 檢查文件是否存在if (fileInfo.exists()) {qDebug() << "文件存在";} else {qDebug() << "文件不存在";}return a.exec();
}

?示例說明:

  1. 包含頭文件: 引入了 QFileInfo 類的頭文件 <QFileInfo>,以及用于調試輸出的 <QDebug>

  2. 創建 QFileInfo 對象: 使用文件路徑或文件名創建一個 QFileInfo 對象,例如 "/path/to/your/file.txt"

  3. 獲取文件信息:

    • 使用 fileName() 獲取文件名。
    • 使用 filePath() 獲取文件路徑。
    • 使用 size() 獲取文件大小,返回 qint64 類型表示文件大小的字節數。
    • 使用 lastModified() 獲取文件最后修改時間,返回 QDateTime 對象。
    • 使用 suffix() 獲取文件后綴名。
  4. 檢查文件存在性: 使用 exists() 函數檢查文件是否存在,并根據結果輸出相應信息。

  5. 輸出信息: 使用 qDebug() 輸出獲取到的文件信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40534.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

工商業光伏項目如何快速開發?

一、前期調研與規劃 1、屋頂資源評估&#xff1a;詳細測量屋頂面積、承重能力及朝向&#xff0c;利用光伏業務管理軟件進行日照分析和發電量預測&#xff0c;確保項目可行性。 2、政策與補貼研究&#xff1a;深入了解當地政府對工商業光伏項目的政策支持和補貼情況&#xff0…

Java面試過程中遇到的問題

Java面試過程中遇到的問題 介紹工作經驗項目 介紹項目 為什么選用這個技術 報表服務怎么實現的 java框架 1、spring clound特性&#xff0c;組件有那些以及作用 springCloud是一套微服務組件&#xff0c; 常用的Eureka&#xff0c;Ribbon&#xff0c;Hystrix&#xff0c;Fe…

第三方支付平臺如何完美契合跨境電商?

在全球化的大潮中&#xff0c;跨境電商"Eurasia Boutique"的創始人艾米麗&#xff0c;帶著她的夢想和手工藝品&#xff0c;踏上了進入中國市場的征程。這是一個充滿挑戰和機遇的旅程&#xff0c;艾米麗和她的企業需要面對和解決一系列復雜的問題。 合規的門檻 艾米…

JVM原理(十四):JVM虛擬機運行時棧幀結構

Java虛擬機已方法作為最基本的執行單位。 棧幀&#xff1a;是支持Java虛擬機進行方法調用和方法執行背后的數據結構。 棧幀存儲了方法的 局部變量表、操作數棧、動態連接和放回地址等信息。 每一個方法的調用開始和執行結束&#xff0c;都對應著一個棧幀在虛擬機棧里面從入棧…

Linux文件與日志

目錄 1. Linux 文件系統 1.1 inode號 1.2 EXT類型文件恢復 1.3 xfs類型文件備份和恢復 2. 日志分析 2.1 日志類型 2.2日志配置文件 2.3 日志分析的重要性 在Linux系統中&#xff0c;文件和日志是管理和維護系統運行所不可或缺的。理解它們的工作原理和如何有效地管理和…

驅動開發:配置Visual Studio驅動開發環境

100編程書屋_孔夫子舊書網 配置驅動開發環境配置驅動開發模板配置驅動雙機調試 在正式開始驅動開發之前&#xff0c;需要自行搭建驅動開發的必要環境&#xff0c;首先我們需要安裝Visual Studio 2013這款功能強大的程序開發工具&#xff0c;在課件內請雙擊ISO文件并運行內部的…

2009-2024年第一季度上市公司華證ESG評級季度數據

2009-2024年第一季度上市公司華證ESG評級季度數據 1、時間&#xff1a;2009-2024年第一季度 2、指標&#xff1a;證券代碼、證券簡稱、評級日期、綜合評級、綜合得分、E評級、E得分、S評級、S得分、G評級、G得分、證監會行業&#xff08;新&#xff09;、同花順行業&#xff…

Visio框圖自動帶填充色原因及如何取消

0 Preface/Foreword Visio&#xff0c;Windows的一個流程圖&框圖制作工具。 1 新建Visio文件 1.1 圖形帶填充 新建Visio時候&#xff0c;如果選擇了模版&#xff0c;那么就后期使用的工具元素會自動填充。 帶來的弊端&#xff0c;在元素編輯文字時&#xff0c;如果此時不…

蘋果公司的Wifi定位服務(WPS)存在被濫用的風險

安全博客 Krebs on Security 2024年5月21日發布博文&#xff0c;表示蘋果公司的定位服務存在被濫用風險&#xff0c;通過 "竊取"WPS 數據庫&#xff0c;可以定位部隊行蹤。 相關背景知識 手機定位固然主要依賴衛星定位&#xff0c;不過在城市地區&#xff0c;密集的…

Perl 語言開發(五):循環語句

目錄 1. 循環語句概述 2. while 循環 2.1 基本語法 2.2 示例 2.3 無限循環 3. until 循環 3.1 基本語法 3.2 示例 3.3 無限循環 4. for 循環 4.1 基本語法 4.2 示例 4.3 嵌套循環 5. foreach 循環 5.1 基本語法 5.2 示例 5.3 遍歷哈希 6. 循環控制語句 6.1 …

新建Vue工程的幾種方法

文章目錄 使用CLI2 : vue-cli使用CLI3 : vue/cli使用 vue3構建 &#xff08;內置Vite&#xff09;直接使用Vite使用parcel (最少配置方案) 使用CLI2 : vue-cli vue-cli是針對構建vue的腳手架CLI2&#xff0c;只能新建vue2工程。 全局安裝vue-cli之后&#xff0c;構建vue2項目的…

03.C1W2.Sentiment Analysis with Na?ve Bayes

目錄 Probability and Bayes’ RuleIntroductionProbabilitiesProbability of the intersection Bayes’ RuleConditional ProbabilitiesBayes’ RuleQuiz: Bayes’ Rule Applied Nave Bayes IntroductionNave Bayes for Sentiment Analysis P ( w i ∣ c l a s s ) P(w_i|clas…

大數據領域的深度分析——AI是在幫助開發者還是取代他們?

在大數據領域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的應用正在迅速擴展&#xff0c;改變了數據科學家和開發者的工作方式。本文將從大數據的專業視角&#xff0c;探討AI工具在這一領域的作用&#xff0c;以及它們是如何幫助開發者而非取代他們的。 1. 大數據…

npm 淘寶鏡像證書過期,錯誤信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更換 npm 證書 問題描述報錯原因更換步驟1 找到 nvm 安裝目錄2 發現證書過期3 更換新地址4 保存后&#xff0c;重新安裝成功 問題描述 在使用 nvm 安裝新版本時&#xff0c;未成功&#xff0c;出現報錯&#xff1a; Could not retrieve https://npm.taobao.org/mirrors/node/l…

【postgresql】表操作

創建表 (CREATE TABLE): CREATE TABLE table_name ( column1 data_type constraint,column2 data_type constraint,... ); 插入數據 (INSERT INTO): INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); 查詢數據 (SELECT): SELECT column1, c…

火山引擎數據飛輪實踐:在電商場景中,如何建設全鏈路數據血緣?

數據作為新型生產要素&#xff0c;正支撐企業的數智化轉型。但企業數字化建設也存在管理成本高、數據產品使用門檻高、數據資產價值不夠的問題&#xff0c;其原因在于業務和數據之間沒有形成雙向良性驅動。 結合新時代企業數字化轉型需求&#xff0c;火山引擎基于字節跳動十余…

IC燒錄員-帶著工程師的夢想遠航!

如果說軟件工程師是代碼程序的創造者&#xff0c;那么IC燒錄員就是把工程師們辛苦敲代碼&#xff0c;日夜辛勞的成果燒錄到芯片里面的實踐者&#xff0c;是他們&#xff0c;讓工程師們的夢想運用到實踐中&#xff0c;是他們帶著工程師的夢想遠航&#xff0c;他們的薪酬或許沒有…

第一節-k8s架構圖

一個Deployment&#xff0c;可以由多個不同Node下的Pod組成&#xff0c;每個Pod又由多個Container組成。 區分Deployment是用Labels(key:value)&#xff0c;區分Pod是用PodName&#xff0c;區分Container是用ContainerName。 一個Node可以包含多個不同Deployment中的pod&…

MySQL-作業1

一、數據庫 1、登陸數據庫 2、創建數據庫zoo 3、修改數據庫zoo字符集為gbk 4、選擇當前數據庫為zoo 5、查看創建數據庫zoo信息 6、刪除數據庫zoo 二、創建表 1、創建一個名稱為db_system的數據庫 2、在該數據庫下創建兩張表&#xff0c;具體要求如下&#xff1a; 員工表 user …

米國政府呼吁拋棄 C 和 C++

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「C的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“888”之后私信回復“888”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01; 很多觀點認為C 或 C永遠不可被…