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

#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;
};