Qt Dynamic QSplitter 动态分栏
动态增加分栏
本篇模拟Qt代码编辑器中的动态分栏功能,动态创建回收QSplitter
//mainwindow.cpp
MainWindow(){QSplitter *sp = new QSplitter(this);Widget *w = new Widget(sp);sp->setHandleWidth(1);sp->setChildrenCollapsible(false);sp->addWidget(w);setCentralWidget(sp);resize(600,500);
}
//widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QSplitter>
#include <QComboBox>
#include <QStringListModel>
#include <QToolButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QResizeEvent>#define ICONSIZE 20class MyBtn: public QToolButton {public:MyBtn(QString icon,QLayout *layout, QWidget *parent): QToolButton{parent}{setIcon(QIcon(icon)); setAutoRaise(true);setFixedSize(ICONSIZE,ICONSIZE); layout->addWidget(this);}
};class Widget;
class WidgetPrivate: public QWidget{public:explicit WidgetPrivate(QWidget *parent= nullptr);
protected:bool eventFilter(QObject *watched, QEvent *e) override;
private:QStringListModel *model;QComboBox *combox;MyBtn *btnClose;MyBtn *btnSplitV;MyBtn *btnSplitH;friend Widget;
};class Widget: public QWidget
{Q_OBJECT
public:explicit Widget(QWidget *parent = nullptr);
protected:virtual void resizeEvent(QResizeEvent *e) override;
protected slots:void slot_Split(QObject *sender, Qt::Orientation orient);void slot_UnSplit(QObject *sender);
private:WidgetPrivate *d_ptr;
};#endif // WIDGET_H
//widget.cpp
#include "testwidget.h"WidgetPrivate::WidgetPrivate(QWidget *parent): QWidget{parent}
{parent->installEventFilter(this);QVBoxLayout *vlayout = new QVBoxLayout(this);QHBoxLayout *hlayout = new QHBoxLayout();hlayout->setContentsMargins(0,0,0,0);hlayout->setSpacing(1);vlayout->setContentsMargins(0,0,0,0);vlayout->setSpacing(0);QStringListModel *model = new QStringListModel({"<no document>"},this);combox = new QComboBox(this); combox->setFixedHeight(ICONSIZE);combox->setModel(model) ;hlayout->addWidget(combox);btnSplitV = new MyBtn(":/split_v.svg",hlayout,this);btnSplitH = new MyBtn(":/split_h.svg",hlayout,this);btnClose = new MyBtn(":/close.svg", hlayout,this);vlayout->addLayout(hlayout);//QTextEdit *t=new QTextEdit(this);t->setStyleSheet("border:none;");vlayout->addWidget(t);
}//auto-hide
bool WidgetPrivate::eventFilter(QObject *watched, QEvent *e)
{ //need parent->installEventFilterif ( e->type()==QEvent::Enter ){ this->show(); return true;}else if( e->type()==QEvent::Leave ){ this->hide(); return true;}else return QObject::eventFilter(watched, e);
}Widget::Widget(QWidget *parent): QWidget{parent}
{d_ptr = new WidgetPrivate(this);connect(d_ptr->btnSplitV,&QToolButton::clicked,this,[=](){slot_Split(this,Qt::Vertical);});connect(d_ptr->btnSplitH,&QToolButton::clicked,this,[=](){slot_Split(this,Qt::Horizontal); });connect(d_ptr->btnClose, &QToolButton::clicked,this,[=](){slot_UnSplit(this); });setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
}void Widget::resizeEvent(QResizeEvent *e)
{d_ptr->resize(e->size().width(), d_ptr->height());QWidget::resizeEvent(e);
}void Widget::slot_Split(QObject *sender, Qt::Orientation orient)
{QSplitter *parent_sp = qobject_cast<QSplitter*>(sender->parent() );if(!parent_sp)return;//1) add new splitterQSplitter *subSP = new QSplitter(this);subSP->setHandleWidth(1);subSP->setOrientation(orient);subSP->setChildrenCollapsible(false);//2) old splitter add this new splitter as its childint index = parent_sp->indexOf(this);parent_sp->insertWidget(index,subSP);//3) new splitter add parent's childthis->setParent(subSP);subSP->addWidget(this);//4) new splitter add a new widgetWidget* testW = new Widget(subSP);subSP->addWidget(testW);
}void Widget::slot_UnSplit(QObject *sender)
{QSplitter *parent_sp = qobject_cast<QSplitter*>(sender->parent() );if(!parent_sp) return;// if("MainWindow" == parent_sp->parent()->objectName()) return; //keep the last one// move sibline to parent before delete this widget and sub-splitter int index = parent_sp->indexOf(this);QWidget *sibline = parent_sp->widget(!index);QSplitter *sp=(QSplitter*)parent_sp->parent();if(sibline && sp){index = sp->indexOf(parent_sp);sp->replaceWidget(index,sibline);sibline->setParent(sp);}//deleteparent_sp->deleteLater();this->deleteLater();
}
Qt Dynamic QSplitter 动态分栏相关推荐
- shardingjdbc全局表_Sharding-JDBC动态分表实现
Sharding-JDBC动态水平分表实现 背景: 在项目中遇到了按照日期动态水平分表的需求,系统属于监控系统,每10分钟保存一次监控数据,并且每次要采集200个节点上的数据,即每次采集数据(间隔10 ...
- fastreport 横向分栏_FastReport开发指南
目 录 入门 5 绪言 6 关于FASTREPORT的说明 6 FASTREPORT的历史 6 创建报表 7 数据 ...
- matlab odeset慢,matcont6p1 最全最强大的非线性系统动态分岔与混沌分析软件,功能 ,可以满足绝大多数动力学要 matlab 276万源代码下载- www.pudn.com...
文件名称: matcont6p1下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 3128 KB 上传时间: 2015-04-09 下载次数: 21 提 供 ...
- fastreport 横向分栏_为什么大家现在放弃使用Excel,而选择第三方报表工具呢?...
Excel是一个电子表格程序,而不是一个数据库程序.Excel数据处理容量和速度有限制,数据可视化程度不高,都是以表格为主,虽然也能插入一些图表,但是灵活度和美观度不够,设置起来也相当麻烦,并且数据获 ...
- 数仓回刷历史数据--hive设置动态分区,并向动态分区内刷入历史数据
数仓回刷历史数据–hive设置动态分区,并向动态分区内刷入历史数据 内容目录 数仓回刷历史数据--hive设置动态分区,并向动态分区内刷入历史数据 一.问题介绍 二.问题解决思路 1 . 解决复杂逻辑 ...
- 基于MFC实现分栏Splitter
1.效果 2.主要代码 主界面类: // SplitterDemoDlg.h : 头文件 //#pragma once #include "FormViewLeft.h" #inc ...
- fastreport 横向分栏_FastReport开发指南.doc
FastReport开发指南 FastReport v2.4 报表设计器 开发指南 翻译:张青松 E-mail: Z_Q_S@ 二OO一年十二月 说 明 这是由小弟在去年年底开始翻译,大概花费了三个月 ...
- HTML怎么把文字分栏_PPT文字巨多!领导还不让删,怎么排版才高大上?
本文由公众号"跟我学个P"首发. 嗨,各位木友们好呀,我是小木. 如标题所言,做PPT碰到这种"文字巨多.而且领导还不让删.并且强行要求你必须做得高大上"的情 ...
- 分栏报表-物品清单报表实现
提起分栏报表,它的数据组织形式就如同小时候使用的数学作业本一样,将数据分为多栏显示,当然写作业时有的人习惯横向写,有的人则喜欢竖着写完,在写另一栏.所有的电子技术都是采用隐喻的手法,从物理世界而来,分 ...
最新文章
- 深度优先搜索算法在RPG游戏迷宫中的应用
- 关键词与关键词之间的相关度计算
- 计算机视觉与深度学习 | 机器学习中的数学——入门机器学习
- 护士计算机等级考试报名时间2015,湖南大学2015年9月全国计算机等级考试报名时间...
- 计算机dos通讯,PC双机通信DOS
- ubuntu下查看window下文本文件乱码的解决方法
- 诗与远方:无题(八十二)- 遇到你真好
- hadoop单机环境搭建
- java 字符菜单_java该怎么写左侧菜单树
- 拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno...
- turtle库的学习
- VMware14虚拟机秘钥
- 在Idea中拉取svn分支
- 商业智能和分析软件市场现状及发展趋势分析-
- html自动拨打电话,javascript之网页点击直接拨打电话和发送短信
- 自媒体赚钱系列连载03:音乐人有收益自媒体平台大全
- sql 修改表的字段属性
- python爬取豆瓣影评_【python爬虫实战】爬取豆瓣影评数据
- Java , HashMap与Big-man
- H3C交换机的命名规则