208 lines
7.3 KiB
C++
208 lines
7.3 KiB
C++
#include <QApplication>
|
|
#include <QWidget>
|
|
#ifdef _WINDOWS
|
|
#include <QTextCodec>
|
|
#include <Windows.h>
|
|
#endif
|
|
#include <QStyle>
|
|
#include <QWidget>
|
|
#include <QtWidgets>
|
|
#include "YSGraphic_Core/Demo_Gallery/export.h"
|
|
#include "YSGraphic_Core/export.h"
|
|
namespace Table_Space {
|
|
struct Base_Table_Model {
|
|
virtual ~Base_Table_Model() = default;
|
|
using Len_Type = int;
|
|
using Index_Type = int;
|
|
enum Expand_Type {
|
|
None,
|
|
Left_UP,
|
|
Right_Down,
|
|
};
|
|
enum Data_Type {
|
|
Parent,
|
|
Son,
|
|
Normal
|
|
};
|
|
struct Base_Data {
|
|
virtual ~Base_Data() = default;
|
|
virtual void paint(QPainter* painter, QRect rect) = 0;
|
|
QWidget* widget{};
|
|
};
|
|
struct Base_Info {
|
|
virtual ~Base_Info() = default;
|
|
Len_Type len = 0;
|
|
virtual void paint(QPainter* painter, QRect rect) = 0;
|
|
};
|
|
virtual void insert_row(Index_Type pos, std::vector<std::shared_ptr<Base_Info>> rows, Expand_Type expand) = 0;
|
|
virtual void insert_col(Index_Type pos, std::vector<std::shared_ptr<Base_Info>> cols, Expand_Type expand) = 0;
|
|
virtual void remove_row(Index_Type pos, Index_Type row) = 0;
|
|
virtual void remove_col(Index_Type pos, Index_Type col) = 0;
|
|
virtual void merge(Index_Type col, Index_Type row, Index_Type col_len, Index_Type row_len) = 0;
|
|
virtual void split(Index_Type col, Index_Type row, Index_Type col_len, Index_Type row_len) = 0;
|
|
virtual QPoint span(Index_Type col, Index_Type row) = 0; // 获取某一个元素 横跨行数,列数
|
|
virtual std::shared_ptr<Base_Data> data(Index_Type col, Index_Type row) = 0;
|
|
virtual std::shared_ptr<Base_Data> parent(Index_Type col, Index_Type row) = 0;
|
|
virtual Data_Type type(Index_Type col, Index_Type row) = 0;
|
|
int col_space = 14;
|
|
int row_space = 14;
|
|
};
|
|
struct Table_Model : public Base_Table_Model {
|
|
struct Data : Base_Data {
|
|
std::shared_ptr<Data> parent = nullptr;
|
|
void paint(QPainter* painter, QRect rect) override {
|
|
painter->fillRect(rect, Qt::red);
|
|
painter->drawText(rect, Qt::AlignCenter, text);
|
|
}
|
|
QString text;
|
|
Data_Type type;
|
|
};
|
|
using Dp = std::shared_ptr<Data>;
|
|
using Dpl = std::vector<Dp>;
|
|
struct Info : Base_Info {
|
|
void paint(QPainter* painter, QRect rect) override {
|
|
painter->fillRect(rect, Qt::red);
|
|
painter->drawText(rect, Qt::AlignCenter, text);
|
|
}
|
|
QString text;
|
|
Dpl data;
|
|
};
|
|
~Table_Model() override;
|
|
void check_all() {
|
|
}
|
|
void insert_row(Index_Type pos, std::vector<std::shared_ptr<Base_Info>> rows, Expand_Type expand) override {
|
|
}
|
|
void insert_col(Index_Type pos, std::vector<std::shared_ptr<Base_Info>> insert_cols, Expand_Type expand) override {
|
|
}
|
|
void remove_row(Index_Type pos, Index_Type num) override {
|
|
auto start = rows.begin() + pos;
|
|
rows.erase(start, start + num);
|
|
const auto n = rows.size();
|
|
for (int i = 0; i < n; ++i) {
|
|
auto& l = cols.at(i);
|
|
auto s = l->data.begin() + pos;
|
|
l->data.erase(s, s + num);
|
|
}
|
|
}
|
|
void remove_col(Index_Type pos, Index_Type num) override {
|
|
auto start = cols.begin() + pos;
|
|
cols.erase(start, start + num);
|
|
const auto n = rows.size();
|
|
for (int i = 0; i < n; ++i) {
|
|
auto& l = rows.at(i);
|
|
auto s = l->data.begin() + pos;
|
|
l->data.erase(s, s + num);
|
|
}
|
|
}
|
|
void merge(Index_Type col, Index_Type row, Index_Type col_len, Index_Type row_len) override {
|
|
const auto par = cols.at(col)->data.at(row);
|
|
const auto cn = cols.size();
|
|
const auto rn = rows.size();
|
|
for (auto c = col; c < cn; ++c) {
|
|
for (auto r = row; r < rn; ++r) {
|
|
const auto d = cols.at(c)->data.at(r);
|
|
d->type = Son;
|
|
d->parent = par;
|
|
}
|
|
}
|
|
par->type = Parent;
|
|
}
|
|
void split(Index_Type col, Index_Type row, Index_Type col_len, Index_Type row_len) override {
|
|
const auto cn = cols.size();
|
|
const auto rn = rows.size();
|
|
for (auto c = col; c < cn; ++c) {
|
|
for (auto r = row; r < rn; ++r) {
|
|
const auto d = cols.at(c)->data.at(r);
|
|
d->type = Normal;
|
|
d->parent = d;
|
|
}
|
|
}
|
|
}
|
|
QPoint span(Index_Type col, Index_Type row) override {
|
|
const auto d = cols.at(col)->data.at(row);
|
|
if (d->type == Normal)
|
|
return {1, 1};
|
|
if (d->type == Son)
|
|
return {0, 0};
|
|
if (d->type == Parent) {
|
|
Index_Type cur_col = col + 1;
|
|
while (cur_col < cols.size()) {
|
|
auto c = cols.at(cur_col)->data.at(row);
|
|
if (c->parent != d)
|
|
break;
|
|
cur_col++;
|
|
}
|
|
Index_Type cur_row = row + 1;
|
|
while (cur_row < rows.size()) {
|
|
auto c = rows.at(col)->data.at(cur_row);
|
|
if (c->parent != d)
|
|
break;
|
|
cur_row++;
|
|
}
|
|
return {cur_col - col, cur_row - row};
|
|
}
|
|
printf("span unknown type[%d]!", d->type);
|
|
ASSERT(false, "span unknown type!");
|
|
}
|
|
std::shared_ptr<Base_Data> data(Index_Type col, Index_Type row) override {
|
|
return cols.at(col)->data.at(row);
|
|
}
|
|
std::shared_ptr<Base_Data> parent(Index_Type col, Index_Type row) override {
|
|
auto d = cols.at(col)->data.at(row);
|
|
return d->parent;
|
|
}
|
|
Data_Type type(Index_Type col, Index_Type row) override {
|
|
auto d = cols.at(col)->data.at(row);
|
|
return d->type;
|
|
}
|
|
private:
|
|
std::vector<std::shared_ptr<Info>> cols;
|
|
std::vector<std::shared_ptr<Info>> rows;
|
|
};
|
|
} // namespace Table_Space
|
|
class Base_Widget : public QWidget {
|
|
public:
|
|
Base_Widget() {
|
|
// 初始化按钮,放置在 widget 中
|
|
QPushButton* btn = new QPushButton("你好", this);
|
|
btn->setGeometry(50, 50, 500, 30); // 设置按钮的位置和大小
|
|
QPushButton* btn2 = new QPushButton("按钮2", this);
|
|
btn2->setGeometry(150, 150, 100, 30); // 这个按钮部分会超出父控件区域
|
|
}
|
|
protected:
|
|
void paintEvent(QPaintEvent* event) override {
|
|
QPainter painter(this);
|
|
// 设置父控件背景颜色
|
|
painter.fillRect(rect(), Qt::black);
|
|
// 定义裁剪区域(在父控件内的有效区域)
|
|
QRegion region(0, 0, 300, 300); // 设置裁剪区域为 300x300,超出部分隐藏
|
|
setMask(region); // 设置掩膜,超出区域将不会显示
|
|
QWidget::paintEvent(event); // 默认绘制子控件
|
|
}
|
|
};
|
|
int main(int argc, char* argv[]) {
|
|
QApplication app(argc, argv);
|
|
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
|
|
#ifdef _WINDOWS
|
|
SetConsoleOutputCP(CP_UTF8);
|
|
system("chcp 65001");
|
|
// setbuf(stdout, 0);
|
|
#endif
|
|
QElapsedTimer timer;
|
|
timer.start();
|
|
Demo_Gallery w;
|
|
// Base_Widget w;
|
|
w.resize(1000, 600);
|
|
w.show();
|
|
// YSG::Graphic g;
|
|
// g.resize(1000, 600);
|
|
// g.show();
|
|
// auto it = new YSG::SelectColorDialog();
|
|
// it->resize(1000, 600);
|
|
// it->show();
|
|
YSG::start_render_scheduler();
|
|
qDebug() << "启动耗时 " << timer.elapsed();
|
|
// f();
|
|
return QApplication::exec();
|
|
}
|