贴出代码
#ifndef STOCKLIST_H
#define STOCKLIST_H
#include <QTableView>
#include <QtWidgets>
#include <QStandardItemModel>
#include <QSortFilterProxyModel>
#include <QtCore/QAbstractNativeEventFilter>
#include <QtCore/QScopedPointer>
#include <QtCore/QMimeData>
#include <QStyledItemDelegate>
#include <QLabel>
class IView;
struct StockItemDelegatePrivate
{
int column = 1;//进度条所在列,下标从0开始
QTableView * parent = nullptr;
IView * view = nullptr;
};
struct ItemData
{
double index = 0;
double risefall = 0;
double percent = 0;
QString name = "";
QString ID = "";
};
class MimeData : public QMimeData
{
Q_OBJECT
public:
MimeData(const ItemData & data) :QMimeData(), m_data(data){}
~MimeData(){}
public:
ItemData GetData() const{ return m_data; };
protected:
QVariant retrieveData(const QString & format, QVariant::Type preferredType) const;
private:
ItemData m_data;
};
class ListItem : public QWidget
{
Q_OBJECT
public:
ListItem(QWidget * parent = nullptr);
~ListItem();
public:
void SetData(const QString broadcast_item);
QString GetData() const;
protected:
virtual void paintEvent(QPaintEvent * event);
private:
bool m_bInsertPos = false;
ItemData m_Data;
QLabel * m_Name = nullptr;
QWidget * m_MainWidgetBg = nullptr;
};
class QMenu;
class DragList : public QListWidget
{
Q_OBJECT
public:
DragList(QWidget * parent = nullptr);
~DragList();
public:
QListWidgetItem * AddItem(const QString broadcast_item);
protected:
virtual void mousePressEvent(QMouseEvent * event) override;
virtual void mouseMoveEvent(QMouseEvent * event) override;
virtual void mouseReleaseEvent(QMouseEvent * event) override;
virtual void dragEnterEvent(QDragEnterEvent * event) override; //废弃 不用QDrag
virtual void dragLeaveEvent(QDragLeaveEvent *event) override; //废弃 不用QDrag
virtual void dragMoveEvent(QDragMoveEvent * event) override; //废弃 不用QDrag
virtual void dropEvent(QDropEvent * event) override; //废弃 不用QDrag
virtual void enterEvent(QEvent * event) override;
virtual void leaveEvent(QEvent * event) override;
private:
void UpdateStyle(ListItem * item);
void InitShotLabel();
void InitShotLine();
void MouseRelease(QMouseEvent * event);
ListItem * ItemWidget(QListWidgetItem * item);
private:
bool m_LeftPress = false;
bool m_IsSelf = false;
QPoint startPos;
QPoint endPos;
QLabel * m_ShotPicture = nullptr;
QLabel * m_ShotLine = nullptr;
QDrag * m_Drag = nullptr;
QListWidgetItem * dragItem = nullptr;
};
class StockItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
StockItemDelegate(QTableView * parent = nullptr);
~StockItemDelegate(){};
public:
void setView(IView * view);
protected:
virtual void paint(QPainter * painter
, const QStyleOptionViewItem & option
, const QModelIndex & index) const Q_DECL_OVERRIDE;
virtual QSize sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const Q_DECL_OVERRIDE;
private:
QScopedPointer<StockItemDelegatePrivate> d_ptr;
};
class StockSortFilterProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
StockSortFilterProxyModel(QObject *parent = nullptr);
~StockSortFilterProxyModel();
void SetFilterContext(const QString & pattern);
protected:
bool lessThan(const QModelIndex &left
, const QModelIndex &right) const;
bool filterAcceptsRow(int source_row
, const QModelIndex & source_parent) const;
private:
size_t sortColumn = 0;
};
class SearchEdit : public QLineEdit
{
public:
SearchEdit(QWidget * parent = nullptr);
~SearchEdit(){}
protected:
virtual void contextMenuEvent(QContextMenuEvent * event) override;
private:
void InitMenu();
private:
QMenu * m_PopMenu = nullptr;
};
class IView
{
public:
virtual void SetMouseOver(int) = 0;
};
class StockTableView : public QTableView, public IView
{
Q_OBJECT
public:
StockTableView(QStandardItemModel * model, QWidget * parent = 0);
public:
void SetMouseOver(int);
protected:
virtual void mouseMoveEvent(QMouseEvent * event) override;
virtual void leaveEvent(QEvent * event) override;
virtual void mousePressEvent(QMouseEvent * event) override;
private:
int currHovered;
void disableMouseOver();
private:
QStandardItemModel * m_pSourceModel;
};
struct StockListWidgetPrivate;
class StockListWidget : public QWidget, public QAbstractNativeEventFilter
{
Q_OBJECT
public:
StockListWidget(QWidget * parent = nullptr);
~StockListWidget();
public slots:
void NativeParentWindowMove();
protected:
virtual void moveEvent(QMoveEvent * event) override;
virtual bool nativeEventFilter(const QByteArray & eventType, void * message, long * result) override;
private:
void InitializeUI();
private:
QScopedPointer<StockListWidgetPrivate> d_ptr;
};
#endif // STOCKLIST_H
#pragma execution_character_set("utf-8")
#include <QStandardItemModel>
#include <QDropEvent>
#include <QMouseEvent>
#include <QDragMoveEvent>
#include <QDragEnterEvent>
#include <QContextMenuEvent>
#include <QPainter>
#include <QMenu>
#include "StockListWidget.h"
#define DropWidgetMaxHeight 170
#define DropWidgetMaxWidth 230
QVariant MimeData::retrieveData(const QSt