QT完整實現拖拽示例

2021-10-14 02:00:21 字數 2721 閱讀 1145

1.資料層 實現拖拽先要子類化qstandarditemmodel

2.檢視層 新增tree控制項

3.渲染層 初始化data

setdata 設定拖拽型別

seticon設定圖示

4.業務層 實現拖拽邏輯

dragenterevent 中過濾拖拽物件

const qmimedata *data=event->mimedata();

int type=data->data("type").toint();

if(type>-1)

dropevent 實現拖拽drop邏輯

const qmimedata *data=event->mimedata();

int type=data->data("type").toint(); ///獲取拖拽型別

class model : public qstandarditemmodel

;model::model(qobject *parent):qstandarditemmodel(parent)

qt::itemflags model::flags(const qmodelindex &index) const

return flags;

}qmimedata *model::mimedata(const qmodelindexlist &indexes) const

return 0;

}qstringlist model::mimetypes() const

主窗體新增物件:
model  

model;

qstringlist ctrlslist;//可不加

qlistctrlvalue;//可不加

qstandarditem **ctritems;//可不加

初始化變數
model=new model(this);

ctrlslist.clear();

ctrlvalue.clear();

載入圖示
qicon ico;

ico.addpixmap(qpixmap(":/logo.png"));

qstandarditem * root=model->invisiblerootitem();

載入拖拽物件
/1 按鈕

qstandarditem * i1=new qstandarditem("按鈕");

i1->setdragenabled(false); //禁用拖拽根節點

ctrlslist<<"button"<<"combobox"<<"checkbox"<<"imagebutton"<<"radiobutton";

ctrlvalue<<0<<3<<4<<5<<9;

2 編輯框

qstandarditem * i2=new qstandarditem("編輯框");

i2->setdragenabled(false);

ctrlslist<<"lineedit"<<"textarea";

ctrlvalue<<1<<2;

3 顯示

qstandarditem * i3=new qstandarditem("顯示");

i3->setdragenabled(false);

ctrlslist<<"label"<<"progressbar"<<"slider"<<"treeview"<<"tableview"<<"group";

ctrlvalue<<6<<7<<8<<10<<11<<12;

ctritems=new qstandarditem*[ctrlslist.length()];

///init

for(int i=0;isetdata(qvariant(ctrlvalue[i]),qt::userrole+2);

ctritems[i]->seticon(ico);

}add

繫結資料到檢視
ui->treeview->setmodel(model);
重寫dragenterevent 過濾拖拽物件

const qmimedata *data=event->mimedata();

int type=data->data("type").toint();

if(type>-1)}

重寫dropevent 實現操作

qstringlist retlist=showinput();

if(retlist.length()<3) return;

const qmimedata *data=event->mimedata();

int type=data->data("type").toint(); ///獲取拖拽型別

if(!checkidvalid(type,retlist[0])) return;

btcur=null;

outinfo("新增控制項:"+retlist[0]);

createctrl(type,retlist,event->pos(),qrect(),false);///建立拖拽的物件

建立控制項

widgetbase *newctrl=null;

if(ret)

}else

}

qt禁止拖動 Qt如何實現拖拽功能?

如上圖所示,如何實現通過拖拽的方式交換兩個按鈕的文字?嚴格的說應該叫拖放方式,它包含了拖動和放置兩個部分。拖動通過drag實現,放下通過dropevent事件實現。該例子有點特殊就是拖動和放下的物件都是按鈕,所以拖動和放下都是在同乙個類中實現。具體實現步驟如下 從qpushbutton類派生乙個類,...

Qt實現不同Treewidget之間拖拽

拖拽是程式設計中經常要用到的,我這裡主要是實習了treewidget之間直接拖拽item,按下ctrl鍵的話是copy,不按ctrl則是move。以下是實現 class treeitemmimedata public qmimedata treeitemmimedata void setdragda...

Qt實現拖拽資料的功能

今天在進行qt程式設計的時候,學習了一下如何自定義ui的樣式,有時候,你在修改別人程式的時候,可能會發現別人程式中的某個控制項ui設計是直接拖上去的。這種情況下如果你想增加該控制項的事件處理,比如拖拽功能。不太好辦,今天在書上找到乙個方法,就是使用qt設計師裡面的提公升,將需要增加事件響應的那個控制...