欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt實(shí)現(xiàn)拖動(dòng)單個(gè)控件移動(dòng)的示例代碼

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

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

展示效果:

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

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

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

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

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

2:選中需要拖拽的控件

3:重寫拖拽事件。

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

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

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

this->setAcceptDrops(true);

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

創(chuàng)建一個(gè)初始控件,用于初始拖動(dò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);

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

3.選中控件進(jìn)行拖動(dòng)

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

3.1響應(yīng)mousePressEvent事件

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

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

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

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

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

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

優(yōu)勢(shì)該類可以確保信息在應(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è)置任意字符串,只要保證在拖拽消息時(shí)用的一個(gè)字符串就可以。為了方便統(tǒng)一,將該字符串做了統(tǒng)一設(shè)置。

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

itemData:類型:QByteArray。

對(duì)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ù)傳遞給拖動(dòng)對(duì)象,設(shè)置將在操作期間與光標(biāo)一起顯示的像素圖,并定義一個(gè)熱點(diǎn)的位置,該熱點(diǎn)將像素圖的位置置于光標(biāo)之下。

繪制拖動(dòng)的位置,這里采用了QPainter繪制機(jī)制

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

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

3.2判斷控件拖動(dòng)

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

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

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

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

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

3.3事件處理

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

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

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

else
{
    event->acceptProposedAction();
}

3.4結(jié)束拖動(dòng)

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

除了處理操作3中的事件處理,還需要當(dāng)鼠標(biāo)結(jié)束操作時(shí),需要在新的位置上重新創(chuàng)建QLabel控件。并將鼠標(biāo)按下時(shí)創(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消息是什么時(shí)候被觸發(fā)呢?

當(dāng)鼠標(biāo)左鍵彈起時(shí),說明結(jié)束了控件拖動(dòng)事件,需要調(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ù)拖動(dòng)控件,實(shí)時(shí)顯示新位置
    child->show();
    child->setPixmap(pixmap);
}

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

相關(guān)文章

  • 使用VS Code的開發(fā)環(huán)境配置教程圖文詳解

    使用VS Code的開發(fā)環(huán)境配置教程圖文詳解

    這篇文章主要介紹了使用VS Code的開發(fā)環(huán)境配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Qt實(shí)現(xiàn)棋盤游戲

    Qt實(shí)現(xiàn)棋盤游戲

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)棋盤游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++使用fdk-aac實(shí)現(xiàn)將音頻PCM編碼成aac

    C++使用fdk-aac實(shí)現(xiàn)將音頻PCM編碼成aac

    mp4的音頻流通常是aac編碼,我們做音視頻采集的時(shí)候就需要將,采集的音頻PCM編碼成aac,本文就來為大家介紹一下C++如何使用fdk-aac實(shí)現(xiàn)將音頻PCM編碼成aac吧
    2023-11-11
  • C語言實(shí)現(xiàn)三子棋游戲(初級(jí)版)

    C語言實(shí)現(xiàn)三子棋游戲(初級(jí)版)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)三子棋游戲初級(jí)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 使用C語言訪問51單片機(jī)中存儲(chǔ)器的核心代碼

    使用C語言訪問51單片機(jī)中存儲(chǔ)器的核心代碼

    這篇文章主要介紹了使用C語言訪問51單片機(jī)中存儲(chǔ)器的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • C++的缺省參數(shù)你了解嘛

    C++的缺省參數(shù)你了解嘛

    這篇文章主要為大家介紹了C++缺省參數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 大家注意vector, list, set, map成員函數(shù)erase

    大家注意vector, list, set, map成員函數(shù)erase

    set和map是由紅黑樹來實(shí)現(xiàn)的,當(dāng)erase的時(shí)候迭代器就失效了,也就是說我們要在迭代器失效之前保留一個(gè)副本,根據(jù)這個(gè)副本我們才能繼續(xù)遍歷下一個(gè)元素
    2013-09-09
  • C語言數(shù)組越界引發(fā)的死循環(huán)問題解決

    C語言數(shù)組越界引發(fā)的死循環(huán)問題解決

    本文主要介紹了C語言數(shù)組越界引發(fā)的死循環(huán)問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • c++打印封裝每次打印前面加上時(shí)間戳問題

    c++打印封裝每次打印前面加上時(shí)間戳問題

    這篇文章主要介紹了c++打印封裝每次打印前面加上時(shí)間戳問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • C++中函數(shù)使用的基本知識(shí)學(xué)習(xí)教程

    C++中函數(shù)使用的基本知識(shí)學(xué)習(xí)教程

    這篇文章主要介紹了C++中函數(shù)使用的基本知識(shí)學(xué)習(xí)教程,涵蓋了函數(shù)的聲明和參數(shù)以及指針等各個(gè)方面的知識(shí),非常全面,需要的朋友可以參考下
    2016-01-01

最新評(píng)論