最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt中QDrag實(shí)現(xiàn)靈活的拖放交互的示例代碼

 更新時(shí)間:2026年02月02日 10:03:13   作者:上去我就QWER  
本文深入解析Qt框架中的QDrag類,全面介紹拖放交互的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在圖形用戶界面(GUI)開發(fā)中,拖放(Drag and Drop)是一種極具直觀性的用戶交互方式,廣泛應(yīng)用于文件上傳、數(shù)據(jù)遷移、界面布局調(diào)整等場(chǎng)景。Qt框架作為跨平臺(tái)GUI開發(fā)的主流選擇,提供了完善的拖放機(jī)制支持,而QDrag類正是該機(jī)制中負(fù)責(zé)“拖”操作的核心組件。本文將從基本概念、使用流程、關(guān)鍵API、實(shí)戰(zhàn)案例及常見問題等方面,全面解析QDrag的原理與應(yīng)用,幫助開發(fā)者快速掌握靈活高效的拖放功能實(shí)現(xiàn)方法。

一、QDrag的核心定位與工作原理

1.1 核心定位

QDrag是Qt的Qt Widgets模塊中用于處理拖放操作中“拖動(dòng)”階段的類,它封裝了拖動(dòng)過程中的數(shù)據(jù)傳遞、視覺反饋、拖動(dòng)狀態(tài)管理等核心能力。在拖放交互的完整鏈路中,QDrag扮演著“數(shù)據(jù)載體”和“交互控制器”的雙重角色:一方面,它負(fù)責(zé)存儲(chǔ)需要傳遞的數(shù)據(jù)(如文本、文件路徑、自定義數(shù)據(jù)等);另一方面,它控制著拖動(dòng)過程中的鼠標(biāo)樣式、拖放圖標(biāo)、拖動(dòng)范圍限制等視覺與行為邏輯。

需要注意的是,QDrag的使用需配合Qt拖放機(jī)制的其他關(guān)鍵組件,形成完整的交互閉環(huán):QMouseEvent用于觸發(fā)拖動(dòng)操作(如鼠標(biāo)按下并移動(dòng));QMimeData用于標(biāo)準(zhǔn)化數(shù)據(jù)存儲(chǔ),實(shí)現(xiàn)跨組件、跨應(yīng)用的數(shù)據(jù)兼容;目標(biāo)組件則通過重寫dragEnterEvent、dragMoveEvent、dropEvent等事件處理函數(shù)接收并處理拖放數(shù)據(jù)。

1.2 工作原理

QDrag的工作流程本質(zhì)上是“數(shù)據(jù)封裝-拖動(dòng)觸發(fā)-狀態(tài)傳遞-數(shù)據(jù)釋放”的四階段過程,具體如下:

  • 數(shù)據(jù)封裝階段:開發(fā)者創(chuàng)建QDrag實(shí)例,并將需要傳遞的數(shù)據(jù)封裝到QMimeData對(duì)象中,再通過QDrag的setMimeData()方法關(guān)聯(lián)數(shù)據(jù)。QMimeData支持多種標(biāo)準(zhǔn)MIME類型(如文本text/plain、文件路徑text/uri-list),也可自定義MIME類型以滿足特殊數(shù)據(jù)傳遞需求。
  • 拖動(dòng)觸發(fā)階段:當(dāng)用戶在源組件上執(zhí)行鼠標(biāo)按下并移動(dòng)操作時(shí),源組件通過判斷鼠標(biāo)移動(dòng)距離等條件,調(diào)用QDrag的exec()方法啟動(dòng)拖動(dòng)過程。此時(shí)Qt會(huì)捕獲鼠標(biāo)事件,將后續(xù)的鼠標(biāo)移動(dòng)、釋放等事件交由QDrag處理。
  • 狀態(tài)傳遞階段:拖動(dòng)過程中,QDrag會(huì)實(shí)時(shí)向系統(tǒng)反饋拖動(dòng)狀態(tài),并觸發(fā)目標(biāo)組件的相關(guān)事件。例如,當(dāng)鼠標(biāo)進(jìn)入目標(biāo)組件時(shí),目標(biāo)組件的dragEnterEvent會(huì)被觸發(fā),開發(fā)者可在該事件中判斷MIME數(shù)據(jù)類型是否支持,以決定是否接受拖放;當(dāng)鼠標(biāo)在目標(biāo)組件內(nèi)移動(dòng)時(shí),dragMoveEvent會(huì)被觸發(fā),可用于實(shí)現(xiàn)拖動(dòng)過程中的實(shí)時(shí)反饋(如高亮目標(biāo)區(qū)域)。
  • 數(shù)據(jù)釋放階段:當(dāng)用戶釋放鼠標(biāo)時(shí),若當(dāng)前位置的目標(biāo)組件接受拖放,QDrag會(huì)將關(guān)聯(lián)的QMimeData數(shù)據(jù)傳遞給目標(biāo)組件,目標(biāo)組件在dropEvent中獲取并處理數(shù)據(jù);隨后QDrag的exec()方法會(huì)返回拖放結(jié)果(如Qt::DropAction枚舉值,表示執(zhí)行的拖放操作類型),源組件可根據(jù)該結(jié)果執(zhí)行后續(xù)邏輯(如拖動(dòng)后刪除源數(shù)據(jù))。

二、QDrag的核心API與關(guān)鍵配置

QDrag的API設(shè)計(jì)簡(jiǎn)潔直觀,核心方法圍繞數(shù)據(jù)管理、拖動(dòng)控制、視覺反饋三個(gè)維度展開,以下是常用API的詳細(xì)解析及使用場(chǎng)景說明。

2.1 構(gòu)造與數(shù)據(jù)關(guān)聯(lián)

  • QDrag(QObject *source):構(gòu)造函數(shù),參數(shù)source為拖動(dòng)操作的源組件(如QPushButton、QListWidget等),用于標(biāo)識(shí)拖放的發(fā)起者,Qt會(huì)根據(jù)源組件的位置等信息初始化拖動(dòng)狀態(tài)。
  • void setMimeData(QMimeData *data):設(shè)置拖動(dòng)過程中傳遞的MIME數(shù)據(jù),這是QDrag使用的核心步驟。需注意,QDrag會(huì)接管data的所有權(quán),開發(fā)者無(wú)需手動(dòng)釋放該QMimeData對(duì)象。
  • QMimeData *mimeData() const:獲取當(dāng)前QDrag關(guān)聯(lián)的MIME數(shù)據(jù)對(duì)象,可用于在拖動(dòng)過程中修改數(shù)據(jù)或在源組件中獲取數(shù)據(jù)進(jìn)行預(yù)處理。

2.2 拖動(dòng)控制與結(jié)果獲取

Qt::DropActions exec(Qt::DropActions supportedActions = Qt::CopyAction, Qt::DropAction defaultAction = Qt::CopyAction):?jiǎn)?dòng)拖動(dòng)過程的核心方法,該方法會(huì)阻塞當(dāng)前線程,直到拖放操作完成(用戶釋放鼠標(biāo)或取消拖動(dòng))。參數(shù)說明:

  supportedActions:指定源組件支持的拖放操作類型,如Qt::CopyAction(復(fù)制)、Qt::MoveAction(移動(dòng))、Qt::LinkAction(創(chuàng)建鏈接)等,可通過“|”運(yùn)算符組合多種支持的操作。

  defaultAction:指定默認(rèn)的拖放操作類型,當(dāng)用戶未通過鍵盤修飾鍵(如Ctrl、Shift)指定操作時(shí),將執(zhí)行該默認(rèn)操作。

返回值為實(shí)際執(zhí)行的拖放操作類型,若拖放被取消則返回Qt::IgnoreAction。

void cancel():手動(dòng)取消當(dāng)前的拖動(dòng)操作,調(diào)用后exec()方法會(huì)返回Qt::IgnoreAction。適用于需要根據(jù)特定條件(如拖動(dòng)超出指定范圍)強(qiáng)制終止拖動(dòng)的場(chǎng)景。

2.3 視覺反饋配置

拖放過程中的視覺反饋直接影響用戶體驗(yàn),QDrag提供了豐富的API用于自定義拖動(dòng)圖標(biāo)、鼠標(biāo)樣式等反饋效果:

  • void setPixmap(const QPixmap &pixmap):設(shè)置拖動(dòng)過程中跟隨鼠標(biāo)的圖標(biāo)。默認(rèn)情況下,Qt會(huì)使用源組件的截圖作為拖動(dòng)圖標(biāo),通過該方法可自定義圖標(biāo)(如縮小的文件圖標(biāo)、自定義標(biāo)識(shí)等),提升交互辨識(shí)度。
  • void setHotSpot(const QPoint &hotSpot):設(shè)置拖動(dòng)圖標(biāo)的熱點(diǎn)(即圖標(biāo)與鼠標(biāo)指針的相對(duì)位置)。例如,若設(shè)置hotSpot = QPoint(10, 10),則鼠標(biāo)指針會(huì)位于拖動(dòng)圖標(biāo)的(10,10)坐標(biāo)處,默認(rèn)熱點(diǎn)為圖標(biāo)的左上角。
  • void setDragCursor(const QCursor &cursor, Qt::DropAction action):為不同的拖放操作類型設(shè)置自定義鼠標(biāo)光標(biāo)。例如,為復(fù)制操作設(shè)置Qt::CopyCursor,為移動(dòng)操作設(shè)置Qt::MoveCursor,使用戶能直觀感知當(dāng)前的操作類型。

三、QDrag實(shí)戰(zhàn)案例:實(shí)現(xiàn)列表項(xiàng)拖放功能

理論結(jié)合實(shí)踐是掌握QDrag的關(guān)鍵,本節(jié)將以“QListWidget列表項(xiàng)拖放”為例,完整演示從源組件觸發(fā)拖動(dòng)到目標(biāo)組件接收數(shù)據(jù)的全流程實(shí)現(xiàn),涵蓋數(shù)據(jù)封裝、拖動(dòng)觸發(fā)、目標(biāo)事件處理等核心步驟。

3.1 案例需求

實(shí)現(xiàn)兩個(gè)QListWidget組件(分別命名為sourceList和targetList),支持將sourceList中的列表項(xiàng)拖動(dòng)到targetList中,拖動(dòng)時(shí)自定義拖動(dòng)圖標(biāo),拖動(dòng)完成后在targetList中顯示該列表項(xiàng)的文本內(nèi)容,同時(shí)保留sourceList中的原列表項(xiàng)(即執(zhí)行復(fù)制操作)。

3.2 實(shí)現(xiàn)步驟

步驟1:界面初始化

在Qt項(xiàng)目的主窗口構(gòu)造函數(shù)中,初始化兩個(gè)QListWidget組件并添加測(cè)試數(shù)據(jù),同時(shí)設(shè)置targetList為可接受拖放的組件(默認(rèn)情況下,組件不接受拖放,需手動(dòng)啟用):

#include <QMainWindow>
#include <QListWidget>
#include <QHBoxLayout>
#include <QDrag>
#include <QMimeData>
#include <QPixmap>
#include <QCursor>
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
    {
        // 初始化界面布局
        QWidget *centralWidget = new QWidget(this);
        QHBoxLayout *layout = new QHBoxLayout(centralWidget);
        setCentralWidget(centralWidget);
 
        // 初始化源列表和目標(biāo)列表
        sourceList = new QListWidget(this);
        targetList = new QListWidget(this);
        sourceList->addItems({"Item 1", "Item 2", "Item 3", "Item 4"});
        sourceList->setWindowTitle("源列表");
        targetList->setWindowTitle("目標(biāo)列表");
 
        // 啟用目標(biāo)列表的拖放接受功能
        targetList->setAcceptDrops(true);
        // 源列表無(wú)需接受拖放,但需捕獲鼠標(biāo)事件觸發(fā)拖動(dòng)
        sourceList->setDragEnabled(false); // 禁用默認(rèn)拖動(dòng),手動(dòng)實(shí)現(xiàn)更靈活
 
        layout->addWidget(sourceList);
        layout->addWidget(targetList);
 
        // 關(guān)聯(lián)源列表的鼠標(biāo)按下事件(用于觸發(fā)拖動(dòng))
        connect(sourceList, &QListWidget::itemPressed, this, &MainWindow::onItemPressed);
    }
 
private slots:
    void onItemPressed(QListWidgetItem *item);
 
private:
    QListWidget *sourceList;
    QListWidget *targetList;
};

步驟2:源組件觸發(fā)拖動(dòng)(實(shí)現(xiàn)onItemPressed方法)

當(dāng)用戶按下源列表的列表項(xiàng)時(shí),捕獲鼠標(biāo)位置,在鼠標(biāo)移動(dòng)一定距離后觸發(fā)拖動(dòng)操作,封裝MIME數(shù)據(jù)并配置拖動(dòng)圖標(biāo):

#include <QMouseEvent>
#include <QApplication>
 
void MainWindow::onItemPressed(QListWidgetItem *item)
{
    if (!item) return;
 
    // 記錄鼠標(biāo)按下時(shí)的位置(相對(duì)于源列表)
    QPoint pressPos = sourceList->mapFromGlobal(QCursor::pos());
 
    // 等待鼠標(biāo)移動(dòng),判斷是否觸發(fā)拖動(dòng)(避免點(diǎn)擊時(shí)誤觸發(fā))
    QEventLoop loop;
    connect(qApp, &QApplication::mouseMove, &loop, &QEventLoop::quit);
    connect(qApp, &QApplication::mouseRelease, &loop, &QEventLoop::quit);
    loop.exec();
 
    // 計(jì)算鼠標(biāo)移動(dòng)距離,超過5像素則觸發(fā)拖動(dòng)
    QPoint movePos = sourceList->mapFromGlobal(QCursor::pos());
    if ((movePos - pressPos).manhattanLength() < 5)
        return;
 
    // 1. 封裝MIME數(shù)據(jù)(文本類型)
    QMimeData *mimeData = new QMimeData;
    mimeData->setText(item->text()); // 存儲(chǔ)列表項(xiàng)文本
 
    // 2. 創(chuàng)建QDrag實(shí)例并關(guān)聯(lián)數(shù)據(jù)
    QDrag *drag = new QDrag(sourceList);
    drag->setMimeData(mimeData);
 
    // 3. 自定義拖動(dòng)圖標(biāo)(使用列表項(xiàng)的截圖,縮小為32x32)
    QPixmap itemPixmap = sourceList->itemWidget(item)->grab();
    if (itemPixmap.isNull()) {
        // 若列表項(xiàng)無(wú)自定義組件,創(chuàng)建默認(rèn)圖標(biāo)
        itemPixmap = QPixmap(32, 32);
        itemPixmap.fill(Qt::lightGray);
        QPainter painter(&itemPixmap);
        painter.drawText(itemPixmap.rect(), Qt::AlignCenter, item->text().left(2));
    }
    itemPixmap = itemPixmap.scaled(32, 32, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    drag->setPixmap(itemPixmap);
    drag->setHotSpot(QPoint(16, 16)); // 熱點(diǎn)設(shè)為圖標(biāo)中心
 
    // 4. 設(shè)置支持的拖放操作并啟動(dòng)拖動(dòng)
    Qt::DropAction result = drag->exec(Qt::CopyAction);
 
    // 5. 根據(jù)拖動(dòng)結(jié)果執(zhí)行后續(xù)操作(本例為復(fù)制,源列表無(wú)需修改)
    if (result == Qt::CopyAction) {
        qDebug() << "拖動(dòng)成功:復(fù)制列表項(xiàng)" << item->text();
    } else {
        qDebug() << "拖動(dòng)取消或失敗";
    }
}

步驟3:目標(biāo)組件處理拖放事件

目標(biāo)列表(targetList)需重寫dragEnterEventdragMoveEvent、dropEvent三個(gè)事件處理函數(shù),分別實(shí)現(xiàn)“判斷是否接受拖放”“拖動(dòng)過程反饋”“接收并處理數(shù)據(jù)”的邏輯。由于QListWidget是Qt內(nèi)置組件,需通過繼承自定義子類來(lái)重寫事件:

// 自定義目標(biāo)列表類,重寫拖放事件
class TargetListWidget : public QListWidget
{
    Q_OBJECT
protected:
    void dragEnterEvent(QDragEnterEvent *event) override
    {
        // 判斷MIME數(shù)據(jù)類型是否為文本,是則接受拖放
        if (event->mimeData()->hasText()) {
            event->acceptProposedAction(); // 接受拖放提議
            setStyleSheet("border: 2px dashed #0099ff;"); // 高亮邊框提示
        }
    }
 
    void dragMoveEvent(QDragMoveEvent *event) override
    {
        // 保持接受狀態(tài),可在此實(shí)現(xiàn)更精細(xì)的反饋(如高亮指定行)
        event->acceptProposedAction();
    }
 
    void dragLeaveEvent(QDragLeaveEvent *event) override
    {
        // 鼠標(biāo)離開時(shí)取消高亮
        setStyleSheet("");
        QListWidget::dragLeaveEvent(event);
    }
 
    void dropEvent(QDropEvent *event) override
    {
        // 取消高亮邊框
        setStyleSheet("");
 
        // 獲取MIME數(shù)據(jù)中的文本,添加為新列表項(xiàng)
        QString text = event->mimeData()->text();
        addItem(text);
 
        // 告知系統(tǒng)拖放操作已完成
        event->setDropAction(Qt::CopyAction);
        event->accept();
    }
};
 
// 注意:在MainWindow初始化時(shí),將targetList替換為自定義的TargetListWidget
// targetList = new TargetListWidget(this);

3.3 案例效果與關(guān)鍵說明

運(yùn)行程序后,在sourceList中按下任意列表項(xiàng)并拖動(dòng),鼠標(biāo)會(huì)跟隨一個(gè)32x32的自定義圖標(biāo);當(dāng)拖動(dòng)到targetList時(shí),targetList邊框會(huì)變?yōu)樗{(lán)色虛線高亮提示;釋放鼠標(biāo)后,列表項(xiàng)文本會(huì)被復(fù)制到targetList中,sourceList中的原項(xiàng)保持不變。該案例完整覆蓋了QDrag的核心使用流程,其中兩個(gè)關(guān)鍵細(xì)節(jié)需重點(diǎn)關(guān)注:

  • 拖動(dòng)觸發(fā)條件判斷:通過計(jì)算鼠標(biāo)按下與移動(dòng)的距離(曼哈頓距離),避免了點(diǎn)擊列表項(xiàng)時(shí)的誤觸發(fā),提升了交互穩(wěn)定性。

  • MIME數(shù)據(jù)類型校驗(yàn):在targetList的dragEnterEvent中校驗(yàn)MIME數(shù)據(jù)類型,確保只接受支持的數(shù)據(jù)格式,是拖放交互安全性的重要保障。

四、常見問題與解決方案

在使用QDrag開發(fā)拖放功能時(shí),開發(fā)者常會(huì)遇到拖動(dòng)無(wú)響應(yīng)、數(shù)據(jù)傳遞失敗、視覺反饋異常等問題,以下是高頻問題的原因分析及解決方案。

4.1 拖動(dòng)操作無(wú)法觸發(fā)

常見原因:1. 源組件未正確捕獲鼠標(biāo)事件,或未判斷拖動(dòng)觸發(fā)條件;2. QDrag的exec()方法未調(diào)用,或調(diào)用時(shí)機(jī)錯(cuò)誤;3. 源組件的setDragEnabled(true)與手動(dòng)實(shí)現(xiàn)沖突。

解決方案:1. 確保通過itemPressedmousePressEvent捕獲鼠標(biāo)按下事件,并通過鼠標(biāo)移動(dòng)距離判斷是否觸發(fā)拖動(dòng);2. 確認(rèn)在鼠標(biāo)移動(dòng)后調(diào)用exec()方法,且調(diào)用前已關(guān)聯(lián)MIME數(shù)據(jù);3. 手動(dòng)實(shí)現(xiàn)拖動(dòng)時(shí),設(shè)置setDragEnabled(false)禁用組件默認(rèn)拖動(dòng)邏輯,避免沖突。

4.2 目標(biāo)組件不接受拖放

常見原因:1. 目標(biāo)組件未調(diào)用setAcceptDrops(true)啟用拖放接受;2. dragEnterEvent中未校驗(yàn)MIME數(shù)據(jù)類型,或未調(diào)用acceptProposedAction()接受拖放提議;3. MIME數(shù)據(jù)類型不匹配(如源組件傳遞文件路徑,目標(biāo)組件校驗(yàn)文本類型)。

解決方案:1. 初始化目標(biāo)組件時(shí)調(diào)用setAcceptDrops(true);2. 在dragEnterEvent中通過mimeData()->hasFormat()校驗(yàn)MIME類型,通過后調(diào)用event->acceptProposedAction();3. 統(tǒng)一源組件和目標(biāo)組件的MIME數(shù)據(jù)類型,如需傳遞自定義數(shù)據(jù),使用自定義MIME類型(如"application/x-custom-data")。

4.3 拖動(dòng)圖標(biāo)異常(不顯示或位置偏移)

常見原因:1. 未調(diào)用setPixmap()自定義圖標(biāo),且源組件無(wú)有效截圖;2. setHotSpot()設(shè)置的熱點(diǎn)位置不合理,導(dǎo)致圖標(biāo)與鼠標(biāo)指針偏移;3. 圖標(biāo)尺寸過大或過小,導(dǎo)致顯示異常。

解決方案:1. 無(wú)論是否使用默認(rèn)截圖,建議手動(dòng)調(diào)用setPixmap()設(shè)置圖標(biāo),確保圖標(biāo)有效;2. 根據(jù)圖標(biāo)尺寸設(shè)置熱點(diǎn),通常設(shè)為圖標(biāo)中心(如32x32圖標(biāo)設(shè)為(16,16));3. 將圖標(biāo)縮放至合適尺寸(如32x32、64x64),使用Qt::SmoothTransformation保證縮放質(zhì)量。

4.4 跨應(yīng)用拖放失敗

常見原因:1. 使用了自定義MIME類型,跨應(yīng)用不支持;2. 傳遞的數(shù)據(jù)格式不符合系統(tǒng)標(biāo)準(zhǔn)(如文件拖放需使用text/uri-list類型,存儲(chǔ)文件的QUrl列表)。

解決方案:1. 跨應(yīng)用拖放時(shí),優(yōu)先使用系統(tǒng)標(biāo)準(zhǔn)MIME類型(如文本用text/plain,文件用text/uri-list);2. 傳遞文件時(shí),將文件路徑轉(zhuǎn)換為QUrl列表并存儲(chǔ)到QMimeData中,示例代碼:

// 傳遞文件路徑的MIME數(shù)據(jù)封裝
QMimeData *mimeData = new QMimeData;
QList<QUrl> urls;
urls << QUrl::fromLocalFile("C:/test.txt");
mimeData->setUrls(urls);
drag->setMimeData(mimeData);

五、總結(jié)與擴(kuò)展

QDrag作為Qt拖放機(jī)制的核心組件,其使用核心在于“數(shù)據(jù)封裝-事件交互-視覺反饋”的協(xié)同設(shè)計(jì)。通過本文的講解,開發(fā)者可掌握QDrag的基本原理、核心API及實(shí)戰(zhàn)技巧,實(shí)現(xiàn)從簡(jiǎn)單文本拖放到復(fù)雜自定義數(shù)據(jù)拖放的各類需求。

在實(shí)際開發(fā)中,QDrag的應(yīng)用還可進(jìn)一步擴(kuò)展:例如,結(jié)合QGraphicsView實(shí)現(xiàn)圖形項(xiàng)的拖放;利用QClipboard實(shí)現(xiàn)拖放與剪貼板的聯(lián)動(dòng);通過自定義QMimeData子類傳遞復(fù)雜對(duì)象(需實(shí)現(xiàn)序列化與反序列化)。此外,Qt 5.15及以上版本還提供了QDragManager類,支持更精細(xì)的拖放過程管理,開發(fā)者可根據(jù)項(xiàng)目需求進(jìn)一步探索。

總之,熟練掌握QDrag的使用,能顯著提升Qt應(yīng)用的交互體驗(yàn),為用戶提供更直觀、高效的操作方式,是Qt GUI開發(fā)中不可或缺的重要技能。

到此這篇關(guān)于Qt中QDrag實(shí)現(xiàn)靈活的拖放交互的示例代碼的文章就介紹到這了,更多相關(guān)Qt QDrag拖放交互內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

大兴区| 沅江市| 丰台区| 藁城市| 九江市| 重庆市| 肃北| 贡山| 车险| 清苑县| 延庆县| 边坝县| 巴中市| 汉源县| 蒙自县| 紫阳县| 安康市| 昌乐县| 淮安市| 湟源县| 郑州市| 林甸县| 康保县| 来凤县| 多伦县| 米脂县| 咸阳市| 普宁市| 阳城县| 茂名市| 抚宁县| 荥阳市| 谢通门县| 衡山县| 千阳县| 绥化市| 玉门市| 名山县| 安平县| 十堰市| 县级市|