Files
Renderive/YSGraphic_Core/component/Table/Table_View.h
T
2026-07-23 18:11:07 +08:00

101 lines
3.1 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 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 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 mouse_event(QMouseEvent* event, QEvent::Type type);
void leaveEvent(QEvent* event) override;
};
}