QAbstractItemModel支持拖拽

接受拖放

繼承QAbstractItemModel(根據(jù)自己實際情況可繼承其他Model)后腰根,重寫以下函數(shù)(注:需要在view(QTableView等)中開啟接受拖放setAcceptDrops(true))

Qt::ItemFlags MyModel::flags(const QModelIndex& index) const
{
    auto defaultFlags = QAbstractTableModel::flags(index);
    return defaultFlags | Qt::ItemIsDropEnabled;      //開啟接受拖放
}

QStringList MyModel::mimeTypes() const
{
    return QStringList() << "type1" << "type2";    //支持的拖放數(shù)據(jù)(MIME)類型
}

//判斷是否支持拖放的數(shù)據(jù)類型
bool MyModel::canDropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) const
{
    if (!parent.isValid())
        return false;

    QStringList mimeFmts = data->formats();
    for (const QString& fmt : mimeFmts)
    {
        if (fmt.contains("type1") || fmt.contains("type2"))
        {
            return true;
        }
    }
    return QAbstractItemModel::canDropMimeData(data, action, row, column, parent);
}

//返回支持的數(shù)據(jù)操作
Qt::DropActions MyModel::supportedDropActions() const
{
    return Qt::CopyAction | Qt::MoveAction;
}

//處理拖放的數(shù)據(jù)
bool MyModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent)
{
    QStringList mimeFmts = data->formats();
    for (const QString& fmt : mimeFmts)
    {
        if (fmt.contains("type1"))
        {
            //添加處理
        }
        else if (fmt.contains("type2"))
        {
            //添加處理
        }
    }   
    return QAbstractItemModel::dropMimeData(data, action, row, column, parent);
}

支持拖拽

繼承QAbstractItemModel(根據(jù)自己時間情況可繼承其他Model)后,重寫以下函數(shù)(注:需要在view(QTableView等)中開啟接受拖放setDragEnabled(true))

Qt::ItemFlags MyModel::flags(const QModelIndex& index) const
{
    auto defaultFlags = QAbstractTableModel::flags(index);
    return defaultFlags | Qt::ItemIsDragEnabled;  //開啟拖拽
}

繼承QStyledItemDelegate(根據(jù)自己時間情況可繼承其他Model)后颖杏,重寫以下函數(shù)

bool MyDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    static QPoint _dragStartPos;
    if (event->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
        if (mouseEvent->buttons() & Qt::LeftButton)
        {
            _dragStartPos = mouseEvent->pos();
        }
    }
    else if (event->type() == QEvent::MouseMove)
    {
        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
        if (mouseEvent->buttons() & Qt::LeftButton)
        {
            if ((mouseEvent->pos() - _dragStartPos).manhattanLength() > QApplication::startDragDistance())
            {
                QDrag* drag = new QDrag((QObject*)option.widget);
                QMimeData* mimeData = new QMimeData;

                QByteArray bytes;
                QDataStream out(&bytes, QIODevice::WriteOnly);
                out << "dragData";    //填充拖拽數(shù)據(jù)
                mimeData->setData(QString("type1"), bytes);

                drag->setMimeData(mimeData);
                drag->setPixmap(_dragPix);
                drag->exec(Qt::MoveAction);
                mimeData->deleteLater();
                drag->deleteLater();
                return true;
            }
        }
    }
    return QStyledItemDelegate::editorEvent(event, model, option, index);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末剩愧,一起剝皮案震驚了整個濱河市雳殊,隨后出現(xiàn)的幾起案子刮刑,更是在濱河造成了極大的恐慌魁袜,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炮沐,死亡現(xiàn)場離奇詭異争群,居然都是意外死亡,警方通過查閱死者的電腦和手機大年,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門换薄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翔试,你說我怎么就攤上這事轻要。” “怎么了垦缅?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵冲泥,是天一觀的道長。 經(jīng)常有香客問我,道長凡恍,這世上最難降的妖魔是什么志秃? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮嚼酝,結果婚禮上浮还,老公的妹妹穿的比我還像新娘。我一直安慰自己闽巩,他們只是感情好钧舌,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涎跨,像睡著了一般洼冻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上六敬,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天碘赖,我揣著相機與錄音,去河邊找鬼外构。 笑死普泡,一個胖子當著我的面吹牛,可吹牛的內容都是我干的审编。 我是一名探鬼主播撼班,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼垒酬!你這毒婦竟也來了砰嘁?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤勘究,失蹤者是張志新(化名)和其女友劉穎矮湘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體口糕,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡缅阳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了景描。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片十办。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖超棺,靈堂內的尸體忽然破棺而出向族,到底是詐尸還是另有隱情,我是刑警寧澤棠绘,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布件相,位于F島的核電站再扭,受9級特大地震影響,放射性物質發(fā)生泄漏适肠。R本人自食惡果不足惜霍衫,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侯养。 院中可真熱鬧,春花似錦澄干、人聲如沸逛揩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辩稽。三九已至,卻和暖如春从媚,著一層夾襖步出監(jiān)牢的瞬間逞泄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工拜效, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喷众,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓紧憾,卻偏偏與公主長得像到千,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赴穗,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容

  • 1.ios高性能編程 (1).內層 最小的內層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 29,334評論 8 265
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應用憔四。 當JAVA程序違反了JA...
    八爺君閱讀 4,578評論 1 114
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,090評論 1 32
  • JAVA面試題 1、作用域public,private,protected,以及不寫時的區(qū)別答:區(qū)別如下:作用域 ...
    JA尐白閱讀 1,145評論 1 0
  • 用TCP協(xié)議發(fā)送時般眉,由于TCP是數(shù)據(jù)流協(xié)議了赵,因此不存在包大小的限制(暫不考慮緩沖區(qū)的大小) HTTP/2 頭壓縮算...
    JLong閱讀 479評論 0 0