You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWATI/Include/iBase/iPlugin/ZxTableView.h

200 lines
6.2 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#include <QTableView>
#include "Defines.h"
#include "iBase_global.h"
#include "iPlugin_global.h"
class ZxTableModel;
class ZxComboBoxDelegate;
/// @brief The ZxTableView class 通用数据表视图对象类
class I_PLUGIN_EXPORT ZxTableView : public QTableView
{
Q_OBJECT
public:
enum MenuMode
{
MTM_NONE = 0, //不显示右键
MTM_Readonly, //只读,只弹出部分复制类的菜单
MTM_Edit_Without_Row,//编辑,但不允许插入行
MTM_Edit_Without_Col,//编辑,但不允许插入列
MTM_Edit_Without_RC, //编辑,但不允许插入行列
MTM_Edit, //全部编辑类的菜单
MTM_Unknown
};
explicit ZxTableView(QWidget* parent = 0, \
QAbstractItemModel* model = NULL);
virtual ~ZxTableView();
virtual void setModel(QAbstractItemModel* model);
// initMenu
virtual void initContextMenu();
// 设置右键菜单模式
virtual void setMenuMode(MenuMode oMenuMode);
// 表格部分界面属性Qt5必须的 部分
virtual void fuzzyUiOfQt5();
// 这是根据分辨率统一进行调整表格宽度,慎用
virtual void adjustColWidths();
// 对于表格,考虑分辨率比较特殊,此处单独通过函数实现
static int getResoSizeW(int n);
static int getResoSizeH(int n);
// 返回当前视图中的模型对象
ZxTableModel* getModel(void) const;
// 获取选中的行范围
bool getSelectedRowRange(int& min, int& max);
// 为表格控件的nCol列添加combobox委托
virtual void setComboxDelegateForColumn(const QString& sTitle, \
const QStringList& lstItemText);
virtual void resetComboxDelegate();
QVector<ZxComboBoxDelegate*>* getVecDelegateCmbs();
//设置是否绘制多余网格ZXF20240703
void setShowFreeGrid(bool bVisible);
protected:
//绘制纵向网格
void drawVerGrid();
//绘制横向网格
void drawHorGrid();
// 重载
virtual void paintEvent(QPaintEvent* event);
virtual void dragEnterEvent(QDragEnterEvent* event);
virtual void dropEvent(QDropEvent* event);
virtual void keyPressEvent(QKeyEvent *event);
virtual void resizeEvent(QResizeEvent *event);
virtual void mouseDoubleClickEvent(QMouseEvent *);
virtual QModelIndex moveCursor(CursorAction cursorAction, \
Qt::KeyboardModifiers modifiers);
virtual void selectionChanged(const QItemSelection &selected, \
const QItemSelection &deselected);
virtual void scrollTo (const QModelIndex & index, \
ScrollHint hint = EnsureVisible);
public slots:
void restoreRowStates(bool bClearSelection = false);
void updateCells(int r, int c = -1);
// 右键
virtual void showCustomContextMenu(const QPoint &pos);
// 插入行列、删除行列
virtual void slotInsertRowsAbove(); //批量插入行
virtual void slotInsertRowsBelow();
virtual void slotInsertRowAbove(); //单条插入行
virtual void slotInsertRowBelow();
virtual void slotInsertColumns(); //插入列
virtual void slotRemoveRows(); //删除行
virtual void slotRemoveColumns(); //删除列
// 基本编辑,针对选择单元格
virtual void slotCopy();
virtual void slotPaste();
virtual void slotCut();
virtual void slotClearData();
// 格式调整(比如小数位置、是否凑齐)
virtual void slotFormatColumns();
// 其它
virtual void slotFreezeColumn();
virtual void slotUnfreezeColumn();
virtual void slotLockColumn();
virtual void slotUnlockColumn();
// 保存
virtual void slotSaveDatabase();
virtual void slotExportData();
// 冻结时信号响应
void slotUpdateSectionWidth(int logicalIndex,int, int newSize);
void slotUpdateSectionHeight(int logicalIndex, int, int newSize);
// 当行列改变时,响应信号进行处理
void slotDataSizeChanged();
// View是否最后一列自动扩展模式
void slotLastColAutoExt(bool& b);
void slotAdjustColAutoExt(bool b);
protected:
// 内部实现
virtual void _insertRows(int nCount, bool bAbove);
virtual void _insertCols(int nCount);
virtual void _freezeCols(int l, int r);
virtual void _copyData(bool bClearCell = false);
// 粘贴时将剪切板文本格式解析
VVecVariant _parseGridStrs(const QString& strText, \
QChar spliter = '\t');
// 删除行或列后重新计算新的选择区域
virtual QModelIndexList getNewSelRange(QModelIndex topLeft, \
QModelIndex botRight, \
int nCount, \
Qt::Orientation orientation = Qt::Horizontal);
// 冻结相关
void initFreezeView(int left,int right);
void freshFreezeView(int left, int right);
signals:
// 选择区域改变
void sigSelectionChanged();
// 增减行、增减列、剪切、粘贴、清空 等情况下触发
void sigViewRangeChanged(QModelIndexList indexOldSelList, \
QModelIndexList indexNewSelList, \
QModelIndex oldCurIndex);
void sigColInserted(int nFrom, int nCount);
void sigColRemoved(int nFrom, int nCount);
// 删除行,通过此信号通知调用方删除数据库数据
// 如果sError非常证明未删除成功
void sigRemovingRows(int nRowFrom, int nRowTo, QString& sError);
// 这是增加新的自定义菜单项。
void sigMenuItemRequested(QMenu* pMenu, int r, int c);
// 触发信号,由用户进行入库处理
void sigSaveDatabase();
// 这是允许外界对粘贴板内容进行解析,解析为二维表格数据
void sigParseContents(const QString& s, VVecVariant& vvec);
protected:
// 右键
MenuMode m_oMenuMode;
QMenu* m_pContextMenu;
// 冻结
int m_nFreezeColL;
int m_nFreezeColR;
QTableView* m_pFreezeView;
// 托管
QMap<QString, QStringList> m_mapDelegateCols;
QVector<ZxComboBoxDelegate*> m_vecDelegateCmbs;
//是否显示网格
bool m_bShowFreeGrid;
};