欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Qt如何實現(xiàn)自選股列表拖拽、右鍵常用菜單功能

小編給大家分享一下Qt如何實現(xiàn)自選股列表拖拽、右鍵常用菜單功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)主要從事網(wǎng)站設計制作、成都網(wǎng)站制作、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務渦陽,10年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:028-86922220

一、前言

本篇文章的自選股和大多數(shù)炒股軟件一樣,每一條自選都是支持拖拽的,拖拽時鼠標會跟隨一個拖拽映像,并且鼠標移動時,會有拖拽提示,告知我們鼠標釋放時拖拽項將會被插入到哪個位置。除過拖拽之外,自選股列表還支持右鍵菜單,都是一樣常用的操作。

右鍵菜單包括置頂、置低、刪除、下移一項、上移一項等

二、功能

具有如下功能

1.搜索編輯框,支持股票代碼和股票名稱搜索2.搜索預覽框支持鼠標hover,并且可以使用鍵盤上下鍵進行當前項切換,單機時支持切換自選股3.自選股列表,支持拖拽,拖拽時會有拖拽項映像,并示意將要拖拽到哪個位置4.支持右鍵菜單,可以對某一項進行移動,刪除等操作

如果覺著demo比較丑的話,可以看財聯(lián)社-產(chǎn)品展示這篇文章中的效果圖

三、自選股列表

接下來就是我們這篇文章的重頭戲了,也是比較復雜的一個內(nèi)容。

自選股列表我選擇的是使用QListWidget來實現(xiàn),然后每一個item上在放一個Widget即可,Widget就是我們定制窗體內(nèi)容,這里我們主要講解幾個比較重要的核心內(nèi)容

1、列表初始化

初始化StockList,實際上自選股列表應該從服務器拉取,我們這里作為demo測試,因此就自己模擬了5條數(shù)據(jù)進行插入。

//已選個股列表d_ptr->m_pStockList = new StockList;connect(d_ptr->m_pStockList, &StockList::RowClicked, this, [this](const QString & symbol){ emit RowClicked(symbol);});//測試數(shù)據(jù) 正常情況下 應該是列表自己拉取OptionalMarketItem item;for (int i = 1; i <= 5; ++i){ item.wstrSymbol = QString("0h000%1").arg(i).toStdWString(); item.wstrName = QString("%1%1%1").arg(i).toStdWString(); item.wstrIndustryName = QString("pingyin%1").arg(i).toStdWString(); d_ptr->m_pStockList->AddItem(item);}

2、添加Item

往StockList中添加item項時,我們首先需要構造一個標準的QListWidgetItem結構,然后把我們自己定制的ListItem放到這個標準item結構上。

QListWidgetItem * StockList::AddItem(const OptionalMarketItem & data){ ListItem * itemWidget = new ListItem; itemWidget->SetData(data); QListWidgetItem * item = new QListWidgetItem; addItem(item); item->setSizeHint(QSize(0, 50)); setItemWidget(item, itemWidget); return item;}

ListItem就是一個普通的QWidget,上邊排列了一些QLabel,用于顯示我們的股票數(shù)據(jù)。

ListItem界面構造就不過多解釋了,唯一需要說明的就是,我們股票數(shù)據(jù)發(fā)送變化時,界面上會有紅綠色框的動畫提示,這里需要調(diào)用兩行代碼來實現(xiàn)重新獲取控件qss代碼,并刷洗界面。

this->style()->unpolish(this);this->style()->polish(this);

3、右鍵菜單

本篇文章和上一篇文章的右鍵菜單實現(xiàn)方式一樣,都是參考我很早以前寫的Qt之自定義QLineEdit右鍵菜單這篇文章,實現(xiàn)默認的contextMenuEvent函數(shù)即可。

右鍵菜單已經(jīng)說的很多了,這里就一筆帶過了,需要的同學可以自己快速的瞅一眼,應該比較容易理解。

void StockList::contextMenuEvent(QContextMenuEvent * event){ if (d_ptr->m_AllowMenu == false) { return; } if (d_ptr->m_ContextMenu == nullptr) { d_ptr->m_ContextMenu = new QMenu(this); d_ptr->m_ContextMenu->setObjectName(QStringLiteral("StockListMenu")); d_ptr->m_ContextMenu->setFixedWidth(100); QAction * delAct = new QAction(QStringLiteral("刪除自選股"), d_ptr->m_ContextMenu); QAction * topAct = new QAction(QStringLiteral("置頂"), d_ptr->m_ContextMenu); QAction * bottomAct = new QAction(QStringLiteral("置底"), d_ptr->m_ContextMenu); QAction * upAct = new QAction(QStringLiteral("上移一位"), d_ptr->m_ContextMenu); QAction * downAct = new QAction(QStringLiteral("下移一位"), d_ptr->m_ContextMenu); connect(delAct, &QAction::triggered, this, &StockList::DeleteSotck); connect(topAct, &QAction::triggered, this, &StockList::TopSotck); connect(bottomAct, &QAction::triggered, this, &StockList::BottomSotck); connect(upAct, &QAction::triggered, this, &StockList::UpSotck); connect(downAct, &QAction::triggered, this, &StockList::DownSotck); d_ptr->m_ContextMenu->addAction(delAct); d_ptr->m_ContextMenu->addAction(topAct); d_ptr->m_ContextMenu->addAction(bottomAct); d_ptr->m_ContextMenu->addAction(upAct); d_ptr->m_ContextMenu->addAction(downAct); } d_ptr->m_ContextMenu->exec(mapToGlobal(event->pos())); QListWidget::contextMenuEvent(event);}

以上5個菜單,雖然看起來功能相差很多,但是其實處理邏輯基本都是一樣的,先是一個內(nèi)容結構排序,然后進行刷新數(shù)據(jù)到界面上。

為了節(jié)省篇幅,我這里就只介紹置頂一只股票的操作

置頂?shù)倪壿嬁雌饋硎沁@樣的

1.移除當前項2.并且把當前項item插入到新位置3.構造一個新的Widget,設置給item4.把新位置的item設置為當前選中項5.上傳最新列表到數(shù)據(jù)中心,或者服務器

void StockList::TopSotck(){ QListWidgetItem * item = currentItem(); if (item == nullptr) {  return; } if (row(item) == 0) {  return; } ListItem * itemWidget = ItemWidget(item); QListWidgetItem * newItem = takeItem(row(item)); insertItem(0, newItem); ListItem * topWidget = new ListItem; topWidget->SetData(itemWidget->GetData()); setItemWidget(newItem, topWidget); if (itemWidget) {  itemWidget->close();  itemWidget = nullptr; } setCurrentItem(newItem); StorageData();}

4、拖拽Item

拖拽Item應該算是一個比較難一點兒功能,好在Qt已經(jīng)為我們實現(xiàn)了一套QDrag事件的回調(diào)方法,也比較好使,如下圖所示,重寫如下4個方法,基本的拖拽事件就能完成了。

但是這里我么有選擇默認的這個回調(diào)函數(shù)來實現(xiàn)這個功能,其中最大的原因就是,他們的可定制性太局限了。

我這里采取的是自己模擬鼠標拖拽功能,同過重寫如下幾個函數(shù)來達到我的目的

virtual void mousePressEvent(QMouseEvent * event) override;virtual void mouseMoveEvent(QMouseEvent * event) override;virtual void mouseReleaseEvent(QMouseEvent * event) override;virtual void enterEvent(QEvent * event) override;virtual void leaveEvent(QEvent * event) override;

1.鼠標按下時,主要是記錄了一些內(nèi)容狀態(tài),方便在鼠標移動時去做判斷,并決定是否啟用鼠標拖拽功能2.鼠標移動就比較復雜了,進行了各種對比,還需要移動被拖拽項的映像位置,移動那一根水平線的位置3.鼠標釋放時,調(diào)整整個列表的內(nèi)容4.鼠標進入窗體時,顯示水平標識線5.鼠標離開窗體時,隱藏水平標識線

上邊只是粗略的描述了這幾個函數(shù)的功能, 因為函數(shù)實現(xiàn)體都比較長,因此這里我也是選擇幾個關鍵點來做以說明。

a、move函數(shù)

產(chǎn)生拖拽時,移動鼠標,我們需要處理很多事件,比如

1、初始化水平表示線和拖拽項映像

if (d_ptr->m_ShotLine == nullptr){ InitShotLine();}if (d_ptr->m_ShotPicture == nullptr){ InitShotLabel();}

2、拖拽時修改鼠標狀態(tài)

根據(jù)拖拽啟動后,鼠標是否還在當前拖拽項上,設置鼠標的狀態(tài)。

if (ListItem * newWidget = ItemWidget(d_ptr->dragItem)){ d_ptr->m_ShotPicture->move(QCursor::pos() - d_ptr->dragItemPos); d_ptr->m_DragRect = visualItemRect(d_ptr->dragItem); if (d_ptr->m_DragRect.contains(event->pos()) || event->pos().isNull()) {  if ((event->pos() - d_ptr->startPos).manhattanLength() > 5)  {   setCursor(Qt::ForbiddenCursor);  } } else {  setCursor(Qt::ArrowCursor); } if (d_ptr->m_ShotPicture->isHidden()) {  d_ptr->m_ShotPicture->show(); }}

b、release函數(shù)

鼠標釋放時,把拖拽項移動到新的位置

if (ListItem * oldWidget = ItemWidget(d_ptr->dragItem)){ QListWidgetItem * newItem = new QListWidgetItem; ListItem * itemWidget = new ListItem; itemWidget->SetData(oldWidget->GetData()); insertItem(insertPos, newItem); newItem->setSizeHint(QSize(0, 50)); setItemWidget(newItem, itemWidget); setCurrentItem(newItem); oldWidget->deleteLater();}

5、刷新數(shù)據(jù)

全量刷新數(shù)據(jù)。在原來的列表上刷新數(shù)據(jù)

當原始列表行數(shù)不夠時,構造新的行

當原始列表函數(shù)多時,移除末尾多的行

void StockList::Update_p(OptionalMarketItemVector data){ d_ptr->m_bOnceLoad = true; disconnect(this, &QListWidget::currentItemChanged, this, &StockList::CurrentItemChanged); int i = 0; for (auto iter = data.begin(); iter != data.end(); ++iter, ++i) {  bool success = false;  if (QListWidgetItem * item = this->item(i))  {   if (ListItem * itemWidget = ItemWidget(item))   {    itemWidget->SetData(*iter);    success = true;   }  }  if (!success)  {   AddItem(*iter);  } } if (i < this->count()) {  QListWidgetItem * item = nullptr;  while (item = this->item(i))  {   if (ListItem * itemWidget = ItemWidget(item))   {    itemWidget->close();    itemWidget = nullptr;   }   item = takeItem(i);   delete item;  } } if (d_ptr->m_LeftPress == false) {  RecoveryCurrentItem(); } connect(this, &QListWidget::currentItemChanged, this, &StockList::CurrentItemChanged);}

以上是“Qt如何實現(xiàn)自選股列表拖拽、右鍵常用菜單功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

新聞名稱:Qt如何實現(xiàn)自選股列表拖拽、右鍵常用菜單功能
本文URL:http://aaarwkj.com/article0/gjooio.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)品牌網(wǎng)站制作、網(wǎng)站設計公司、品牌網(wǎng)站設計外貿(mào)網(wǎng)站建設、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設公司
中文字幕人妻丝乱一区三区| 亚洲国产日韩精品欧美| 精品欧美国产日韩在线观看| 亚洲av香蕉综合一区| 九九在线免费视频蜜臀| 日韩一区欧美中文字幕| 国产高清不卡一区二区| 欧美一区二区日韩一区二区| 91麻豆精品国产综合久久久| 美腿丝袜亚洲综合一区| 人妻有码av中文字幕久久| 91免费观看视频高清| 青青草原天堂在线免费观看| 日韩亚洲欧美国产另类| av黄色资源在线观看| 中文精品字幕人妻熟女小妇| 日本免费91午夜视频| 国产成人免费视频一区| 中文日韩av在线免费播放| 精品欧美自拍偷拍三区| 国产经典三级在线看| 在线观看国产激情免费视频| 一区二区在线日韩欧美| 欧美另类精品一区二区三区| 欧美久久精品在线观看| 朋友的尤物人妻中文字幕| 亚洲精品91在线中文字幕| 国产一级二级三级亚洲| 午夜在线观看欧美福利| 国产精品国产亚洲精品| 国产精品一区二区夜夜夜| 国产精品一区二区久久| 亚洲国产精品一区二区三| 国产三级三级三级三级三级| 国产亚洲欧美精品久久久久 | 亚洲天堂男人的天堂狠狠操 | 久久精品亚洲精品毛片| 成人免费在线观看午夜| 欧美午夜一级特黄大片| 日本一级黄色影视大全| 免费在线av一区二区|