#pragma once #include "Base_Table_Model.h" #include "global.h" #include "scroll.h" #include 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_Scroll_Bar v_bar; H_Scroll_Bar 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 is_ctrl_pressed() { 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 is_dragging = 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 mouse_event(QMouseEvent* event, QEvent::Type type); void leaveEvent(QEvent* event) override; }; } // namespace Psc