当前位置: 首页 > article >正文

C++ QT chip layout tool开发浅思

工作中需要利用padlist + Chip size + Chip Center + Pixel size + Pixel Center生成一副Chip Layout tool SVG图像

1.参数输入

    QtColorPropertyManager       *m_colorManager      = nullptr;
    QtDoublePropertyManager      *m_doubleManager     = nullptr;
    QtBoolPropertyManager        *m_boolManager       = nullptr;
    QtStringPropertyManager      *m_stringManager     = nullptr;
    QtFontPropertyManager        *m_fontManager       = nullptr;

使用各个QT property manager去生成各个UI界面,确定输入的参数的类型,颜色,字体

2.使用QGraphicsView去画图,

所有的对象堆叠在Widget上,每个widget上会堆叠不同的group,group中包含一个个具有共同属性的Item

注意设定可交互性,背景大小,抗锯齿,可拖动性

ChipLayoutWidget::ChipLayoutWidget(QWidget* parent): QGraphicsView(parent)
{

    m_scene = new QGraphicsScene(0, 0, 7200, 7200);
    QColor transparentColor(Qt::transparent); 
    QBrush transparentBrush(transparentColor);
    m_scene->setBackgroundBrush(transparentBrush);
    this->setInteractive(true);
    QMap<ChipLayoutGroup::ChipLayoutGroupType, ChipLayoutGroup *> m_groupList = {};
    for(int i = 0; i < ChipLayoutGroup::GroupTypeDefaut; i++)
    {
        m_groupMap[ChipLayoutGroup::ChipLayoutGroupType(i)] = new ChipLayoutGroup();

        m_groupMap[ChipLayoutGroup::ChipLayoutGroupType(i)]->setFlag(QGraphicsItem::ItemIsSelectable,
                                                                     false);
        m_scene->addItem(m_groupMap[ChipLayoutGroup::ChipLayoutGroupType(i)]);
    }
    this->setRenderHint(QPainter::Antialiasing);
    m_scene->setSceneRect(0, 0, 7200, 7200);
    this->setScene(m_scene);
    m_scene->setBackgroundBrush(QColor(0x33, 0x33, 0x33));
    this->setDragMode(QGraphicsView::ScrollHandDrag);
    this->setCacheMode(QGraphicsView::CacheBackground);
    m_scene->update();
}

3.遇到的需要注意的一些问题

  • 为什么有时候我的滑动没有能够及时刷新

        QGraphicsItem内的一个函数必须要override正确

QRectF boundingRect() const override;
  • 不需要单独的为每一个Item设置属性,比如是否被选中,可以直接用group去做操作
  • 放大缩小view的code
qreal Widget::getScale()
{
    return syncScaledValue;
}

void Widget::setScale(qreal scaled)
{
    if (!qFuzzyCompare(scaled , this->syncScaledValue))
    {
        LOGD(QString("%1").arg(scaled));
        this->syncScaledValue = scaled;
        update();
    }
}

void Widget::setRelatedScale(qreal relatedScale)
{
    if (!qFuzzyCompare(relatedScale , this->relatedScaleValue))
    {
        relatedScaleValue = relatedScale;
        update();
    }
}

void Widget::resetRelatedScale()
{
    setRelatedScale(1.0);
}

void Widget::zoomIn()
{
    syncScaledValue = qBound(MIN_FACTOR , pow(1.2, 1) * syncScaledValue, MAX_FACTOR);
    update();
}
void Widget::zoomOut()
{
    syncScaledValue = qBound(MIN_FACTOR , pow(1.2, -1) * syncScaledValue, MAX_FACTOR);
    update();
}

void Widget::wheelEvent(QWheelEvent *e)
{
    qreal distance = (e->angleDelta() / 15 / 8).y();
    qreal val;
    if (distance != 0)
    {
        val = pow(1.2, distance);
        if (val < 2.0)
        {
            syncScaledValue *= val;
            syncScaledValue = qBound(MIN_FACTOR , syncScaledValue , MAX_FACTOR);
//            emit notifyScaledChanged(syncScaledValue, relatedScaleValue);
            update();
        }
    }
}


http://www.kler.cn/a/450493.html

相关文章:

  • WebDavClient 安装和配置指南
  • 2、光同步数字传送网的特点
  • 常见数据结构
  • 基于Matlab实现无刷直流电机仿真
  • 如何解决vscode powershell乱码
  • vscode 快速切换cangjie版本
  • 【python】银行客户流失预测预处理部分,独热编码·标签编码·数据离散化处理·数据筛选·数据分割
  • PTA数据结构题目:链表操作集合
  • 近实时”(NRT)搜索、倒排索引
  • Unity3d 基于UGUI和VideoPlayer 实现一个多功能视频播放器功能(含源码)
  • GitLab 停止为中国区用户提供 GitLab.com 账号服务
  • kong网关使用pre-function插件,改写接口的返回数据
  • 隧道可视化技术开拓智能建设新航道
  • 基于Spring Boot的摄影器材租赁回收系统
  • 神经网络图像隐写术:用AI隐藏信息的艺术
  • 1小时放弃Rust(1): Hello-World
  • *【每日一题 基础题】 [蓝桥杯 2024 省 B] 好数
  • 逻辑的诗:类与对象(下)
  • JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介
  • Hydra配置文件的书写语法
  • Ruby+Selenium教程
  • 今天最新早上好问候语精选大全,每天问候,相互牵挂,彼此祝福
  • 预约参观华为基地,见证行业巅峰
  • Jmeter分布式压力测试
  • 7-4 字符串的冒泡排序
  • VMware vCenter保姆级安装部署(VMware VCenter Nanny Level Installation and Deployment)