日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt学习之路(52): 拖放技术之一

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt学习之路(52): 拖放技术之一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
拖放 Drag and Drop,有時又被稱為 DnD,是現代軟件開發中必不可少的一項技術。它提供了一種能夠在應用程序內部甚至是應用程序之間進行信息交換的機制,并且,操作系統與應用程序之間進行剪貼板的內容交換,也可以被認為是 DnD 的一部分。 DnD 其實是由兩部分組成的:Drag 和 Drop。Drag 是將被拖放對象“拖動”,Drop 是將被拖放對象“放下”,前者一般是一個按下鼠標的過程,而后者則是一個松開鼠標的過程,這兩者之間鼠標一直是被按下的。當然,這只是一種通常的情況,其他情況還是要看應用程序的具體實現。對于 Qt 而言,widget既可以作為 drag 對象,也可以作為 drop 對象,或者二者都是。 下面的一個例子來自 C++ GUI Programming with Qt 4, 2nd Edition。在這個例子中,我們創建一個程序,可以將系統中的文本文件拖放過來,然后在窗口中讀取內容。 mainwindow.h
  • #ifndef?MAINWINDOW_H ?
  • #define?MAINWINDOW_H ?
  • ?
  • #include?<QtGui> ?
  • ?
  • class?MainWindow?:?public?QMainWindow ?
  • { ?
  • ????Q_OBJECT ?
  • ?
  • public: ?
  • ????MainWindow(QWidget?*parent?=?0); ?
  • ????~MainWindow(); ?
  • ?
  • protected: ?
  • ????void?dragEnterEvent(QDragEnterEvent?*event); ?
  • ????void?dropEvent(QDropEvent?*event); ?
  • ?
  • private: ?
  • ????bool?readFile(const?QString?&fileName); ?
  • ????QTextEdit?*textEdit; ?
  • }; ?
  • ?
  • #endif?//?MAINWINDOW_H?
  • mainwindow.cpp
  • #include?"mainwindow.h" ?
  • ?
  • MainWindow::MainWindow(QWidget?*parent) ?
  • ????:?QMainWindow(parent) ?
  • { ?
  • ????textEdit?=?new?QTextEdit; ?
  • ????setCentralWidget(textEdit); ?
  • ?
  • ????textEdit->setAcceptDrops(false); ?
  • ????setAcceptDrops(true); ?
  • ?
  • ????setWindowTitle(tr("Text?Editor")); ?
  • } ?
  • ?
  • MainWindow::~MainWindow() ?
  • { ?
  • } ?
  • ?
  • void?MainWindow::dragEnterEvent(QDragEnterEvent?*event) ?
  • { ?
  • ????if?(event->mimeData()->hasFormat("text/uri-list"))?{ ?
  • ????????event->acceptProposedAction(); ?
  • ????} ?
  • } ?
  • ?
  • void?MainWindow::dropEvent(QDropEvent?*event) ?
  • { ?
  • ????QList<QUrl>?urls?=?event->mimeData()->urls(); ?
  • ????if?(urls.isEmpty())?{ ?
  • ????????return; ?
  • ????} ?
  • ?
  • ????QString?fileName?=?urls.first().toLocalFile(); ?
  • ????if?(fileName.isEmpty())?{ ?
  • ????????return; ?
  • ????} ?
  • ?
  • ????if?(readFile(fileName))?{ ?
  • ????????setWindowTitle(tr("%1?-?%2").arg(fileName,?tr("Drag?File"))); ?
  • ????} ?
  • } ?
  • ?
  • bool?MainWindow::readFile(const?QString?&fileName) ?
  • { ?
  • ????bool?r?=?false; ?
  • ????QFile?file(fileName); ?
  • ????QTextStream?in(&file); ?
  • ????QString?content; ?
  • ????if(file.open(QIODevice::ReadOnly))?{ ?
  • ????????in?>>?content; ?
  • ????????r?=?true; ?
  • ????} ?
  • ????textEdit->setText(content); ?
  • ????return?r; ?
  • }?
  • main.cpp
  • #include?<QtGui/QApplication> ?
  • #include?"mainwindow.h" ?
  • ?
  • int?main(int?argc,?char?*argv[]) ?
  • { ?
  • ????QApplication?a(argc,?argv); ?
  • ????MainWindow?w; ?
  • ????w.show(); ?
  • ????return?a.exec(); ?
  • }?
  • 這里的代碼并不是很復雜。在MainWindow中,一個QTextEdit作為窗口中間的widget。這個類中有兩個protected的函數:dragEnterEvent() 和 dropEvent(),這兩個函數都是繼承自 QWidget,看它們的名字就知道這是兩個事件,而不僅僅是signal。 在構造函數中,我們創建了 QTextEdit 的對象。默認情況下,QTextEdit 可以接受從其他的應用程序拖放過來的文本類型的信息。如果用戶把一個文件拖到這里面,那么就會把文件名插入到文本的當前位置。但是我們希望讓MainWindow 讀取文件內容,而不僅僅是插入文件名,所以我們在MainWindow中對 drop 事件進行了處理,因此要把QTextEdit的setAcceptDrops()函數置為false,并且把MainWindow的setAcceptDrops()置為true,以便讓MainWindow對 drop 事件進行處理。 當用戶將對象拖動到組件上面時,dragEnterEvent()函數會被回調。如果我們在事件處理代碼中調用 acceptProposeAction() 函數,我們就可以向用戶暗示,你可以將拖動的對象放在這個組件上。默認情況下,組件是不會接受拖放的。如果我們調用了這樣的函數,那么Qt會自動地以光標來提示用戶是否可以將對象放在組件上。在這里,我們希望告訴用戶,窗口可以接受拖放。因此,我們首先檢查拖放的MIME類型。MIME類型為 text/uri-list 通常用來描述一個 URI 的列表。這些 URI 可以是文件名,可以是 URL或者其他的資源描述符。MIME類型由 Internet Assigned Numbers Authority (IANA) 定義,Qt 的拖放事件使用MIME類型來判斷拖放對象的類型。關于 MIME類型的詳細信息,請參考?http://www.iana.org/assignments/media-types/. 當用戶將對象釋放到組件上面時,dropEvent() 函數會被回調。我們使用 QMimeData::urls()來或者 QUrl 的一個list。通常,這種拖動應該只用一個文件,但是也不排除多個文件一起拖動。因此我們需要檢查這個list是否為空,如果不為空,則取出第一個。如果不成立,則立即返回。最后我們調用 readFile() 函數讀取文件內容。關于讀取操作我們會在以后的章節中詳細說明,這里不再贅述。 好了,至此我們的小程序就解釋完畢了,運行一下看看效果吧! 對于拖動和脫離,Qt 也提供了類似的函數:dragMoveEvent() 和 dragLeaveEvent(),不過對于大部分應用而言,這兩個函數的使用率要小得多。

    本文轉自 FinderCheng 51CTO博客,原文鏈接:http://blog.51cto.com/devbean/280052
    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的Qt学习之路(52): 拖放技术之一的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 自拍偷在线精品自拍偷无码专区 | 中文字幕人妻丝袜乱一区三区 | 日本欧美一级片 | 豆国产97在线 | 亚洲 | 一区二区视频在线观看 | 葵司有码中文字幕二三区 | 瑟瑟综合| 日日夜夜精品免费 | av在线手机观看 | 99re6在线精品视频免费播放 | av美国 | 亚洲一卡二卡 | 久久青青草视频 | 国产香蕉一区二区三区 | 亚洲人成无码www久久久 | 一区二区三区国产在线观看 | 黄色污污网站 | 中文在线最新版天堂 | 91国产精品一区 | 国产黄在线 | 麻豆91在线 | 日韩色视频在线观看 | 日本不卡免费在线 | 天天干天天干天天操 | 关之琳三级全黄做爰在线观看 | 久久精品午夜福利 | 成人区精品一区二区婷婷 | 国产成人精品综合 | 波多野结衣一区二区三区四区 | 精品乱码一区二区三四区视频 | 亚洲23p | 91精品综合| 夜色在线视频 | 免费观看黄色一级视频 | 日韩成人精品视频 | 少妇一级淫片免费观看 | 超级砰砰砰97免费观看最新一期 | 欧美性大战久久久久久久 | www.五月.com | 欧美性猛交69 | 欧美乱码精品一区二区三区 | 91看片国产| 有码一区| 日韩午夜在线观看 | 神马电影久久 | 黄色在线视频观看 | 午夜天堂精品久久久久 | 亚洲国产黄色av | 91无打码| 日韩欧美视频免费在线观看 | 欧美hdse| 成人禁污污啪啪入口 | 真人毛片97级无遮挡精品 | 环太平洋3:泰坦崛起 | 日本黄色免费网站 | 爱爱一区二区三区 | 亚洲国产成人精品久久久 | 好吊在线视频 | 樱花草涩涩www在线播放 | 久久久久久久毛片 | 久久久久久影视 | 日韩精品影视 | av手机版| av免费观看入口 | 亚洲操片 | 乱淫67194| 久久精品国产亚洲AV成人雅虎 | 9999re| 美日韩丰满少妇在线观看 | 亚洲成a | 国精产品一区 | 国产巨乳在线观看 | 91爱爱影院 | 亚洲 欧美 激情 小说 另类 | 国偷自产av一区二区三区麻豆 | 麻豆高清 | 丝袜老师扒开让我了一夜漫画 | 四虎成人在线视频 | 日韩三级在线 | 俺来也在线视频 | 免费毛片视频 | 91美女在线视频 | 亚洲成av人影院 | av网站在线看| 欧美色图俺去了 | 一区二区三区免费在线 | 国产精品一区二区三区久久久 | 欧美顶级metart裸体全部自慰 | 亚洲国产精一区二区三区性色 | 美女扒开尿口给男人捅 | 青草视频在线观看免费 | 色播导航 | 久久嫩 | 激情欧美一区二区三区 | 国产色在线| 中国丰满熟妇xxxx性 | freesex性hd公交车上 | 国产成人午夜高潮毛片 | 欧美性生活一区二区三区 |