最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt股票組件之自選股列表拖拽、右鍵常用菜單功能的實現(xiàn)

 更新時間:2019年07月09日 09:37:21   作者:朝十晚八  
這篇文章主要介紹了Qt股票組件之自選股列表拖拽、右鍵常用菜單功能的實現(xiàn)方法,本文通過實例文字相結(jié)合的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

一、開頭嘴一嘴

本文帶領(lǐng)大家來看看自選股列表的實現(xiàn)。

如果有需要的朋友可以加我好友,有償提供源碼、或者也可以進一步提供功能定制

封裝的控件,或者demo都是沒有樣式的,所以看著會比較丑一些,不過加樣式也是分分鐘。。。這里咱可以先看功能,需要即可定制

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

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

本篇文章中不包括的功能也可以提供定制,需求合理即可。

下面來具體說一說這個功能的實現(xiàn)思路,會公開大多數(shù)核心代碼,有需要的同學(xué)可以根據(jù)思路自行完善整個代碼。

二、效果展示

如下效果圖所示,是自選股使用上的一個展示效果,具有如下功能

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

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

三、自選股列表

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

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

1、列表初始化

初始化StockList,實際上自選股列表應(yīng)該從服務(wù)器拉取,我們這里作為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ù) 正常情況下 應(yīng)該是列表自己拉取
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項時,我們首先需要構(gòu)造一個標(biāo)準(zhǔn)的QListWidgetItem結(jié)構(gòu),然后把我們自己定制的ListItem放到這個標(biāo)準(zhǔn)item結(jié)構(gòu)上。

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

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

3、右鍵菜單

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

右鍵菜單已經(jīng)說的很多了,這里就一筆帶過了,需要的同學(xué)可以自己快速的瞅一眼,應(yī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)容結(jié)構(gòu)排序,然后進行刷新數(shù)據(jù)到界面上。

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

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

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

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

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

我這里采取的是自己模擬鼠標(biāo)拖拽功能,同過重寫如下幾個函數(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.鼠標(biāo)按下時,主要是記錄了一些內(nèi)容狀態(tài),方便在鼠標(biāo)移動時去做判斷,并決定是否啟用鼠標(biāo)拖拽功能
2.鼠標(biāo)移動就比較復(fù)雜了,進行了各種對比,還需要移動被拖拽項的映像位置,移動那一根水平線的位置
3.鼠標(biāo)釋放時,調(diào)整整個列表的內(nèi)容
4.鼠標(biāo)進入窗體時,顯示水平標(biāo)識線
5.鼠標(biāo)離開窗體時,隱藏水平標(biāo)識線

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

a、move函數(shù)

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

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

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

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

根據(jù)拖拽啟動后,鼠標(biāo)是否還在當(dāng)前拖拽項上,設(shè)置鼠標(biāo)的狀態(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ù)

鼠標(biāo)釋放時,把拖拽項移動到新的位置

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ù)

當(dāng)原始列表行數(shù)不夠時,構(gòu)造新的行

當(dāng)原始列表函數(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);
}

總結(jié)

以上所述是小編給大家介紹的Qt股票組件之自選股列表拖拽、右鍵常用菜單功能的實現(xiàn) ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

您可能感興趣的文章:

相關(guān)文章

  • c語言重要的字符串與內(nèi)存函數(shù)

    c語言重要的字符串與內(nèi)存函數(shù)

    這篇文章主要介紹一些c語言中常用字符串函數(shù)和內(nèi)存函數(shù)的使用和注意事項,并且為了幫助讀者理解和使用,也都模擬實現(xiàn)了他們的代碼,需要的朋友可以參考一下
    2021-09-09
  • C++實現(xiàn)日期計算器詳細代碼示例

    C++實現(xiàn)日期計算器詳細代碼示例

    這篇文章主要給大家介紹了關(guān)于C++實現(xiàn)日期計算器的相關(guān)資料,基于C++編寫的簡單的日期計算器,供大家參考,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • C語言中注釋與注意事項的深入講解

    C語言中注釋與注意事項的深入講解

    在編寫C語言源代碼時,應(yīng)該多使用注釋,這樣有助于對代碼的理解,這篇文章主要給大家介紹了關(guān)于C語言中注釋與注意事項的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 詳談c++跨平臺編碼的問題

    詳談c++跨平臺編碼的問題

    下面小編就為大家?guī)硪黄斦刢++跨平臺編碼的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • C語言的常量,字符串,轉(zhuǎn)義字符,注釋你都了解嗎

    C語言的常量,字符串,轉(zhuǎn)義字符,注釋你都了解嗎

    這篇文章主要為大家詳細介紹了C語言的常量,字符串,轉(zhuǎn)義字符,注釋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Matlab中圖像數(shù)字水印算法的原理與實現(xiàn)詳解

    Matlab中圖像數(shù)字水印算法的原理與實現(xiàn)詳解

    數(shù)字水印技術(shù)作為信息隱藏技術(shù)的一個重要分支,是將信息(水印)隱藏于數(shù)字圖像、視頻、音頻及文本文檔等數(shù)字媒體中,從而實現(xiàn)隱秘傳輸、存儲、標(biāo)注、身份識別、版權(quán)保護和防篡改等目的。本文就來講講圖像數(shù)字水印算法的原理與實現(xiàn),感興趣的可以了解一下
    2023-04-04
  • 深入C++中API的問題詳解

    深入C++中API的問題詳解

    本篇文章是對C++中API的問題進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 一文詳解Qt如何讀取和寫入配置文件的數(shù)據(jù)

    一文詳解Qt如何讀取和寫入配置文件的數(shù)據(jù)

    這篇文章主要為大家詳細介紹了在Qt中如何實現(xiàn)讀取和寫入配置文件的數(shù)據(jù),文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • C++中priority_queue與仿函數(shù)實現(xiàn)方法

    C++中priority_queue與仿函數(shù)實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于C++中priority_queue與仿函數(shù)實現(xiàn)的相關(guān)資料,優(yōu)先級隊列是一種容器適配器,其底層通常采用vector容器,并通過堆算法來維護元素的順序,文中通過代碼介紹的非常詳細《》需要的朋友可以參考下
    2024-10-10
  • VisualStudio2022打包項目文件為.exe安裝包

    VisualStudio2022打包項目文件為.exe安裝包

    本文主要介紹了VisualStudio2022打包項目文件為.exe安裝包,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論

聊城市| 东阳市| 中江县| 鄂托克前旗| 杂多县| 达拉特旗| 中山市| 江永县| 长宁县| 金堂县| 堆龙德庆县| 余干县| 县级市| 页游| 朝阳县| 郁南县| 吉林市| 揭西县| 河西区| 南陵县| 泰来县| 怀仁县| 古蔺县| 方山县| 郸城县| 梧州市| 鹤庆县| 泸水县| 浮梁县| 元氏县| 贵南县| 彝良县| 五指山市| 康保县| 余干县| 茶陵县| 曲松县| 株洲市| 岚皋县| 叶城县| 武川县|