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

Qt實現(xiàn)拖動單個控件移動的示例代碼

 更新時間:2022年06月21日 11:06:43   作者:中國好公民st  
做慣了靜態(tài)圖,今天來搞一搞動態(tài)圖吧!本文將利用Qt實現(xiàn)拖動單個控件移動效果,文中的示例代碼講解詳細(xì),感興趣的可以動手嘗試一下

做慣了靜態(tài)圖,今天來搞一搞動態(tài)圖吧,首先來個最基礎(chǔ)的功能:如果讓一個控件拖動起來。

展示效果:

按照以往簡單的做法,使用mouseMoveEvent、mousePressEvent、mouseReleaseEvent也是可以實現(xiàn)的。這是最基礎(chǔ)的移動做法。

今天,不使用那種簡單的做法,采用Qt一種特有的拖動方法來實現(xiàn)!

使用QDropEvent實現(xiàn)拖拽事件。

實現(xiàn)控件拖拽的流程,如下:

1:創(chuàng)建一個控件,這里使用QLabel控件。

2:選中需要拖拽的控件

3:重寫拖拽事件。

根據(jù)上述操作流程,來實現(xiàn)一個控件的拖拽吧!

1.設(shè)置窗口拖拽屬性

在Qt中,默認(rèn)是不響應(yīng)拖拽消息的,這跟mouseMoveEvent消息默認(rèn)不響應(yīng)是一樣的,必須明確調(diào)用,告訴窗口,需要響應(yīng)此消息。

this->setAcceptDrops(true);

2.創(chuàng)建初始控件

創(chuàng)建一個初始控件,用于初始拖動使用。

QLabel *labIcon = new QLabel(this);
labIcon->setText("");
labIcon->setPixmap(QPixmap(":/QDragSingleLabel/image/boat.png"));
labIcon->move(10, 10);
labIcon->show();
labIcon->setAttribute(Qt::WA_DeleteOnClose);

偷懶起見,對QLabel控件設(shè)置了窗口關(guān)閉銷毀的功能,很是方便。

3.選中控件進行拖動

鼠標(biāo)在控件上按下,開始做拖動操作;當(dāng)鼠標(biāo)抬起時,不進行拖動操作。

3.1響應(yīng)mousePressEvent事件

需要知道鼠標(biāo)是否點擊到控件上

這里需要特殊注意的是:QLabel是一個靜態(tài)控件,正常情況下是不會響應(yīng)鼠標(biāo)選中效果的。

此時,需要響應(yīng)QWidget鼠標(biāo)按下的事件,將鼠標(biāo)點擊的點轉(zhuǎn)換成是否選中QLabel控件,側(cè)面實現(xiàn)數(shù)據(jù)點擊控件效果。

QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
if(!child)
{
    //不是QLabel控件,不進行處理
    return;
}

QWidget::childAt(const QPoint& p)const;說明:返回窗口小部件自身坐標(biāo)系統(tǒng)中p點處的可見子窗口小部件。

查詢到有效QLabel指針后,創(chuàng)建一個可存儲在剪貼板中的信息,通過拖放機制進行傳輸?shù)?。這里采用:QMimeData類實現(xiàn)。

優(yōu)勢該類可以確保信息在應(yīng)用程序之間安全傳輸,并且可以在相同的應(yīng)用程序內(nèi)復(fù)制。

創(chuàng)建該類并將QLabel中的數(shù)據(jù)傳入到類中,用于做拖拽使用。

QMimeData *mimeData = new QMimeData;
mimeData->setData(qsEnum, itemData);

設(shè)置數(shù)據(jù)。

qsEnum:類型:QString。

在這里可以設(shè)置任意字符串,只要保證在拖拽消息時用的一個字符串就可以。為了方便統(tǒng)一,將該字符串做了統(tǒng)一設(shè)置。

const QString qsEnum = "zhongGuoHaoGongMin";//自定義數(shù)據(jù)類型

itemData:類型:QByteArray。

對QMimeData傳入的數(shù)據(jù),這里存放了QLabel的圖片以及顯示位置。

QPixmap pixmap = *child->pixmap();
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << pixmap << QPoint(event->pos() - child->pos());

上述內(nèi)容準(zhǔn)備就緒后,創(chuàng)建拖拽類,用于數(shù)據(jù)拖拽。

QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos() - child->pos());

將數(shù)據(jù)傳遞給拖動對象,設(shè)置將在操作期間與光標(biāo)一起顯示的像素圖,并定義一個熱點的位置,該熱點將像素圖的位置置于光標(biāo)之下。

繪制拖動的位置,這里采用了QPainter繪制機制

QPixmap tempPixmap = pixmap;
QPainter painter;
painter.begin(&tempPixmap);
painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127));
painter.end();
	
child->setPixmap(tempPixmap);

開始拖動操作,調(diào)用QDrag::exec();

3.2判斷控件拖動

目前只有一個控件可以拖動,那么,當(dāng)創(chuàng)建多個拖動控件時,該如何判斷要拖動哪個呢?

這時候,在創(chuàng)建QMimeData傳入的自定義數(shù)據(jù)類型就起到作用了。

當(dāng)數(shù)據(jù)類型是qsEnum時,進行判斷,如果不是,不進行判斷。

if (event->mimeData()->hasFormat(qsEnum))
{
    //進行判斷
}
else
{
    event->ingnore(); //忽略判斷
}

事件:dragEnterEvent、dragMoveEvent、dropEvent都需要這樣判斷。

3.3事件處理

當(dāng)前是匹配的自定義數(shù)據(jù)類型時,并且是該資源是,接受拖動進入事件,并設(shè)置當(dāng)前為拖動事件。

if (event->source() == this)
{
	event->setDropAction(Qt::MoveAction);
	event->accept();
}

否則設(shè)置執(zhí)行操作并接收該事件

else
{
    event->acceptProposedAction();
}

3.4結(jié)束拖動

結(jié)束拖動,響應(yīng)事件:virtual void dropEvent(QDropEvent *event)override;

除了處理操作3中的事件處理,還需要當(dāng)鼠標(biāo)結(jié)束操作時,需要在新的位置上重新創(chuàng)建QLabel控件。并將鼠標(biāo)按下時創(chuàng)建的QMimeData數(shù)據(jù)獲取出來,顯示到新創(chuàng)建的QLabel控件上。

QByteArray itemData = event->mimeData()->data(qsEnum);
QDataStream dataStream(&itemData, QIODevice::ReadOnly);
QPixmap pixmap;
QPoint offset;
dataStream >> pixmap >> offset;

QLabel *newIcon = new QLabel(this);
newIcon->setPixmap(pixmap);
newIcon->move(event->pos() - offset);
newIcon->show();
newIcon->setAttribute(Qt::WA_DeleteOnClose);

dropEvent消息是什么時候被觸發(fā)呢?

當(dāng)鼠標(biāo)左鍵彈起時,說明結(jié)束了控件拖動事件,需要調(diào)用dropEvent并重新創(chuàng)建控件,顯示新位置。

Qt::DropAction n = drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);
if (n == Qt::MoveAction)
{
    //結(jié)束操作
    child->close();
}
else
{
    //繼續(xù)拖動控件,實時顯示新位置
    child->show();
    child->setPixmap(pixmap);
}

到此這篇關(guān)于Qt實現(xiàn)拖動單個控件移動的示例代碼的文章就介紹到這了,更多相關(guān)Qt拖動控件移動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c語言線程終止練習(xí)示例

    c語言線程終止練習(xí)示例

    這篇文章主要介紹了c語言線程終止練習(xí)示例,需要的朋友可以參考下
    2014-04-04
  • 利用Matlab繪制好看的旋轉(zhuǎn)九邊形

    利用Matlab繪制好看的旋轉(zhuǎn)九邊形

    這篇文章主要為大家介紹了如何利用Matlab繪制超好看的旋轉(zhuǎn)九邊形。文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下
    2022-03-03
  • C++中的explicit關(guān)鍵字詳解

    C++中的explicit關(guān)鍵字詳解

    這篇文章主要介紹了C++中的explicit關(guān)鍵字詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • 解讀C++編程的相關(guān)文件操作

    解讀C++編程的相關(guān)文件操作

    這篇文章主要介紹了解讀C++編程的相關(guān)文件操作,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C++函數(shù)指針和回調(diào)函數(shù)使用解析

    C++函數(shù)指針和回調(diào)函數(shù)使用解析

    這篇文章主要為大家詳細(xì)介紹了C++函數(shù)指針和回調(diào)函數(shù)的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • C語言深入探索數(shù)據(jù)類型的存儲

    C語言深入探索數(shù)據(jù)類型的存儲

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-07-07
  • C++基礎(chǔ)入門教程(一):基礎(chǔ)知識大雜燴

    C++基礎(chǔ)入門教程(一):基礎(chǔ)知識大雜燴

    這篇文章主要介紹了C++基礎(chǔ)入門教程(一):基礎(chǔ)知識大雜燴,本文講解了注釋、頭文件、命名空間等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • 介紹C語言中tolower函數(shù)的實例

    介紹C語言中tolower函數(shù)的實例

    這篇文章主要介紹了介紹C語言中tolower函數(shù)的實例,本文列出了該函數(shù)的頭文件,功能說明等,以及如何使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言簡單實現(xiàn)計算字符個數(shù)的方法

    C語言簡單實現(xiàn)計算字符個數(shù)的方法

    這篇文章主要介紹了C語言簡單實現(xiàn)計算字符個數(shù)的方法,涉及C語言針對字符串的簡單遍歷與判定技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C語言strlen和sizeof在數(shù)組中的使用詳解

    C語言strlen和sizeof在數(shù)組中的使用詳解

    對于 strlen 和 sizeof,相信不少程序員會混淆其功能。雖然從表面上看它們都可以求字符串的長度,但二者卻存在著許多不同之處及本質(zhì)區(qū)別
    2021-10-10

最新評論

嘉荫县| 南皮县| 长武县| 湖州市| 宣汉县| 临桂县| 陇西县| 阿克苏市| 永康市| 永新县| 大方县| 邛崃市| 正宁县| 章丘市| 苍南县| 辽宁省| 兴义市| 临安市| 鹤山市| 丹东市| 丰顺县| 江陵县| 镇沅| 惠州市| 凤山县| 庆城县| 林周县| 米泉市| 中超| 永丰县| 涿鹿县| 商水县| 保德县| 东乡| 定结县| 彰化市| 军事| 石林| 岳普湖县| 玛纳斯县| 马龙县|