111 lines
3.4 KiB
C++
111 lines
3.4 KiB
C++
#pragma once
|
|
#include "../../DemoGallery/Tool.h"
|
|
#include "Base_Table_Model.h"
|
|
#include "global.h"
|
|
#include "scroll.h"
|
|
|
|
namespace Psc {
|
|
/*
|
|
使用Data更好 因为使用Data如果你想用指针你依然可以传入指针
|
|
表格功能分析
|
|
1. 拖动改变大小
|
|
2. 合并单元格
|
|
3. 内嵌控件
|
|
首先是表格数据结构 包含位置和 ui计算
|
|
表格自身内容绘制 自定义组件嵌入
|
|
合并单元格通过 合并入控制
|
|
表格也是model view 格式
|
|
view 根据model的接口 两个rect计算需要绘制的元素以及位置 然后 开始绘制
|
|
*/
|
|
|
|
class Container : public QWidget {
|
|
public:
|
|
Container(QWidget *parent = nullptr) : QWidget(parent) {
|
|
setMouseTracking(true);
|
|
setWindowFlag(Qt::WindowTransparentForInput, true); // 透传所有输入事件
|
|
// 使该控件对所有事件透明,事件会传递给下层控件或父控件
|
|
//setAttribute(Qt::WA_TransparentForMouseEvents);
|
|
setAttribute(Qt::WA_InputMethodTransparent);
|
|
}
|
|
|
|
void paintEvent(QPaintEvent* event) override {
|
|
QPainter painter(this);
|
|
painter.fillRect(rect(), QColor(200, 200, 200, 100));
|
|
painter.end();
|
|
}
|
|
void mousePressEvent(QMouseEvent *event) override {
|
|
event->ignore(); // 不拦截,交给子控件或父控件处理
|
|
}
|
|
void mouseReleaseEvent(QMouseEvent *event) override {
|
|
event->ignore();
|
|
}
|
|
void mouseMoveEvent(QMouseEvent *event) override {
|
|
event->ignore();
|
|
}
|
|
};
|
|
|
|
|
|
class Table_View : public QWidget {
|
|
public:
|
|
Table_View();
|
|
Container* container;
|
|
Base_Table_Model* model{};
|
|
V_ScrollBar v_bar;
|
|
H_ScrollBar h_bar;
|
|
QTextEdit* edit;
|
|
// inside and outside
|
|
int col_info_h = 30;
|
|
int row_info_w = 30;
|
|
int col_info_inside_space = 10;
|
|
int row_info_inside_space = 10;
|
|
|
|
int h_bar_space = 10;
|
|
int v_bar_space = 10;
|
|
|
|
int top_margin = 10;
|
|
int left_margin = 10;
|
|
int right_margin = 10;
|
|
int bottom_margin = 10;
|
|
|
|
QPoint to_inside_pos(QPoint widget_pos);
|
|
QPoint to_widget_pos(QPoint inside_pos);
|
|
QRect get_view_rect();
|
|
|
|
static bool isCtrlPressed() {
|
|
if (Qt::ControlModifier & QApplication::keyboardModifiers())
|
|
{
|
|
return true;
|
|
} else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
enum Drag_Type {
|
|
Table_Move,
|
|
H_scrollBar,
|
|
V_scrollBar,
|
|
V_Expand,
|
|
H_Expand,
|
|
} drag_type{};
|
|
bool isDragging = false;
|
|
QPoint start_pos;
|
|
QPoint _view_pos = {0, 0};
|
|
QPoint save_pos;
|
|
Col_Info* col_expand{};
|
|
Row_Info* row_expand{};
|
|
int start_expand_len{};
|
|
Base_Table_Data* prev_data{};
|
|
bool use_drag_h = true;
|
|
bool use_drag_w = true;
|
|
protected:
|
|
bool event(QEvent* event) override;
|
|
bool eventFilter(QObject* obj, QEvent* event) override;
|
|
void paintEvent(QPaintEvent* event) override;
|
|
void resizeEvent(QResizeEvent* event) override;
|
|
void wheelEvent(QWheelEvent* event) override;
|
|
void mouseEvent(QMouseEvent* event, QEvent::Type type);
|
|
void leaveEvent(QEvent* event) override;
|
|
};
|
|
}
|
|
|