qt中關於拖曳類的理解

2021-06-06 00:01:41 字數 2776 閱讀 9679

在《qt4精彩例項分析》中最後一章介紹了關於拖曳類的例程,但是有些不好理解。下面是我個人看完後的一些總結:

首先,關於拖曳有乙個拖曳的物件,還要有乙個盛拖曳物件的容器。所以至少要有兩個類。然後,要在拖曳物件中實現兩個事件:void

mousepressevent

(qmouseevent

*);

void

mousemoveevent

(qmouseevent

*);在這兩個事件中,分別對拖曳物件做相應的處理。事件處理中,有這麼幾個任務:

1.一般是要記錄物件拖曳的位置,物件本身的屬性資訊。這個過程要可能使用的類qbytearray,qdatastream,qmimedata;
eg:qbytearray

data

;qdatastream

stream

(&data

,qiodevice

::writeonly

);

stream

<<

pix<<

qpoint(e

->pos()-rect().topleft());

qmimedata

*mimedata

=new

qmimedata

;

mimedata

->setdata(

"drag-icon"

,data

);

2.使用qdrag,使用建立的拖曳物件能夠產生拖曳事件。
eg:qdrag

*drag

=new

qdrag

(this

);drag

->setmimedata(

mimedata

);

drag

->sethotspot(

qpoint(e

->pos()

-rect().topleft()));

drag

->setpixmap(

pix);

qt

::dropaction

dropaction

=drag

->start(

qt::

copyaction|qt

::moveaction

);//這是關鍵語句

3.處理拖曳時,拖曳物件原位置的顯示問題
hide();

qt::

dropaction

dropaction

=drag

->start(

qt::

copyaction|qt

::moveaction

);

if(

dropaction

==qt

::moveaction

)

close();

else

show();
在拖曳時一般要隱匿原來位置的物件,所以先要呼叫hide();然後根據拖曳容器返回的拖曳動作,決定是接著隱匿還是將原來
位置的影象顯示出來。例如如果去掉if後面的語句,會造成原位置的物件不管怎麼樣,都不能顯示在原來的位置。
接著就是有關於盛放拖曳物件的容器
它一般要實現這麼三個事件:	void

dragenterevent

(qdragenterevent

*);void

dragmoveevent

(qdragmoveevent

*);

void

dropevent

(qdropevent

*);

乙個是當有新的拖曳物件進入容器時,乙個是當容器內有拖曳物件移動時,乙個是當拖曳物件到新位置時滑鼠停下或鬆開時。按照《qt4精彩例項分析》
中的處理前兩個事件只是簡單的返回給拖曳類乙個拖曳動作,這樣好讓拖曳物件知道原位置的物件要不要再顯示。
eg:void

dragwidget

::dragenterevent

(qdragenterevent*e

)

else

e->acceptproposedaction();

}

}
但在dropevent

(qdropevent

*)函式中它比上面的函式多了乙個任務,就是把拖曳物件在新位置中顯示出來。借助於qdropevent

類的例項攜帶的引數

可以輕鬆完成這個任務
eg:	void

dragwidget

::dropevent

(qdropevent*e

)

else

e->acceptproposedaction();

}

else

e->ignore();

}
以上是我的一些粗淺直觀的認識,希望以後可以更深入更詳細地了解qt的拖曳類。

關於C 類中 this指標的理解

先要理解class的意思。class應該理解為一種型別,象int,char一樣,是使用者自定義的型別。雖然比int char這樣build in型別複雜的多,但首先要理解它們一樣是型別 用這個型別可以來宣告乙個變數,比如int x,myclass my等等。這樣就像變數x具有int型別一樣,變數my...

QT中關於JSON處理的幾個類

原文 qjsonobject類封裝了乙個json物件。乙個json物件是乙個包含了許多key value pair的列表。這裡的key都是unique string,而value都是qjsonvalue.乙個qjsonobject可以被轉換成乙個qvariantmap.可以用size 來獲得key ...

理解Qt多執行緒類

point 1 qthread類的例項與普通類的例項沒什麼不同,只是執行著的run 函式會不同 例1 在mdialog中,使用 在mdialog中使用 1.connect this,signal sigdialogsignal mythread,slot slotthreadslot 當emit s...