精华内容
下载资源
问答
  • 易采站长站为您分析Android App中的多个LinearLayout嵌套布局实例,利用线性布局来排列按钮是安卓应用布局中的常用做法,需要的朋友可以参考下在做android UI布局时,用了LinearLayout嵌套,发现效果并不如我预料一般...

    易采站长站为您分析Android App中的多个LinearLayout嵌套布局实例,利用线性布局来排列按钮是安卓应用布局中的常用做法,需要的朋友可以参考下

    在做android  UI布局时,用了LinearLayout嵌套,发现效果并不如我预料一般

    查了下资料,说是要设置layout_weight属性

    资料说得不是很清楚,也没仔细看,就去弄,结果越弄越混乱。

    于是静下心来,自己写xml测试,发现如下。

    如果LinearLayout是最外面的一层,它是不会弹出layout_weight属性的,

    换句话说最外层不能用layout_weight

    xml布局如下

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:orientation="vertical">

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="zzzzzzzzzzzzzzzzzzzzzzzzzzzzz"

    android:textSize="18sp"

    android:layout_marginLeft="5px"

    android:layout_marginBottom="10px"

    android:textColor="@android:color/darker_gray"

    />

    android:layout_height="wrap_content"

    android:text="xxxxxxxxxxxxxxxxxxxxxxx"

    android:layout_marginLeft="50px"

    android:layout_marginBottom="10px"

    android:textSize="18sp"

    />

    这个能正常显示,但当我们把嵌套的LinearLayout方向设置成水平,第一个TextView充满整个LinearLayout,第二个TextView控件不显示。

    当我们为两个TextView加上 android:layout_weight="1"属性时,能显示,效果我就不说了,大家都懂的。

    发现一个有趣的现象:我们将 两个控件的android:layout_weight="1"删掉,嵌套的LinearLayout方向属性删掉,代码和最开始一样

    注意,我们前面说上面的xml它能正常显示,现在,一模一样的xml代码则显示错误。

    当我们只设置一个控件的android:layout_weight="1"属性时,发现也会有显示错误

    ps:我只是用可视化工具看了一下 ,并未编译,说出来,只是告诉大家不要被它的可视化效果误导(目测是工具的原因)。至于编译后会如何显示,这个有兴趣的可以去看下。我说的显示错误并不是说文件有错误,只是在说没有达到我想要的效果(都显示出来)。

    展开全文
  • java Container 嵌套布局

    2017-11-16 12:32:41
    使用 Container嵌套布局按钮,如图 老师完全按PPT来讲,听得一头雾水,用了javafx还是不行,请大神赐教![图片](https://img-ask.csdn.net/upload/201711/16/1510835317_541461.jpg)
  • Android 嵌套布局简析

    千次阅读 2017-05-25 17:30:46
    前言嵌套布局是事件分发的衍生内容,理解了嵌套布局的实现方式,Md的很多效果都是毛毛雨了原文地址进入Uml 时序图形 嵌套布局实现方式,以及 5.0 中与嵌套布局有关联的组件提起嵌套布局,MD中的 CoordinatorLayout...

    前言

    嵌套布局是事件分发的衍生内容,理解了嵌套布局的实现方式,Md的很多效果都是毛毛雨了

    原文地址进入

    这里写图片描述

    Uml 时序图形

    这里写图片描述

     嵌套布局实现方式,以及 5.0 中与嵌套布局有关联的组件

    提起嵌套布局,MD中的 CoordinatorLayout,SwipeRefreshLayout,RecyclerView 当然还有V4包下的NestedScrollView,都有直接关系,因为他们是 NestedScrollingParent(NP) 或者 NestedScrollingChild(NC) 直接或者间接子类。

    那么如何才能进行嵌套布局自定义?
    通过成为NP,NC子类进行嵌套布局开发妥妥的。
    下面是NP,NC 具体方法,调用时序查看blog头部的时序图结合源码进行理解
    NestedScrollingChildHelper // Child辅助类
    NestedScrollingParentHelper // Parent辅助类

    核心类 NestedScrollingParent

    package android.support.v4.view;
    
    import android.view.MotionEvent;
    import android.view.VelocityTracker;
    import android.view.View;
    import android.view.ViewConfiguration;
    
    public interface NestedScrollingParent {
    
        public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes);
    
        public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes);
    
    
        public void onStopNestedScroll(View target);
    
    
        public void onNestedScroll(View target, int dxConsumed, int dyConsumed,
                int dxUnconsumed, int dyUnconsumed);
    
        public void onNestedPreScroll(View target, int dx, int dy, int[] consumed);
    
    
        public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed);
    
    
        public boolean onNestedPreFling(View target, float velocityX, float velocityY);
    
    
        public int getNestedScrollAxes();
    }

    核心类 NestedScrollingChild

    package android.support.v4.view;
    
    import android.view.MotionEvent;
    import android.view.VelocityTracker;
    import android.view.View;
    import android.view.ViewConfiguration;
    import android.view.ViewParent;
    
    
    public interface NestedScrollingChild {
    
        public void setNestedScrollingEnabled(boolean enabled);
    
    
        public boolean isNestedScrollingEnabled();
    
    
        public boolean startNestedScroll(int axes);
    
    
        public void stopNestedScroll();
    
    
        public boolean hasNestedScrollingParent();
    
    
        public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed,
                int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow);
    
    
        public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow);
    
    
        public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed);
    
    
        public boolean dispatchNestedPreFling(float velocityX, float velocityY);
    }

    简单一下回调方法的介含义,以及需要在那里处理事件:

    onStartNestedScroll该方法,一定要按照自己的需求返回true,该方法决定了当前控件是否能接收到其内部View(非并非是直接子View)滑动时的参数;假设你只涉及到纵向滑动,这里可以根据nestedScrollAxes这个参数,进行纵向判断。

    onNestedPreScroll该方法的会传入内部View移动的dx,dy,如果你需要消耗一定的dx,dy,就通过最后一个参数consumed进行指定,例如我要消耗一半的dy,就可以写consumed[1]=dy/2

    onNestedFling你可以捕获对内部View的fling事件,如果return true则表示拦截掉内部View的事件。

    主要关注的就是这三个方法~

    这里内部View表示不一定非要是直接子View,只要是内部View即可。

    下面看一下我们具体的实现:

    public class StickyNavLayout extends LinearLayout implements NestedScrollingParent
    {
        @Override
        public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes)
        {
            return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
        }
        @Override
        public void onNestedPreScroll(View target, int dx, int dy, int[] consumed)
        {
            boolean hiddenTop = dy > 0 && getScrollY() < mTopViewHeight;
            boolean showTop = dy < 0 && getScrollY() > 0 && !ViewCompat.canScrollVertically(target, -1);
    
            if (hiddenTop || showTop)
            {
                scrollBy(0, dy);
                consumed[1] = dy;
            }
        }
        @Override
        public boolean onNestedPreFling(View target, float velocityX, float velocityY)
        {
            if (getScrollY() >= mTopViewHeight) return false;
            fling((int) velocityY);
            return true;
        }
    }
    

    onStartNestedScroll中,我们判断了如果是纵向返回true,这个一般是需要内部的View去传入的,你要是不确定,或者担心内部View编写的不规范,你可以直接return true;

    onNestedPreScroll中,我们判断,如果是上滑且顶部控件未完全隐藏,则消耗掉dy,即consumed[1]=dy;如果是下滑且内部View已经无法继续下拉,则消耗掉dy,即consumed[1]=dy,消耗掉的意思,就是自己去执行scrollBy,实际上就是我们的StickNavLayout滑动。

    此外,这里还处理了fling,通过onNestedPreFling方法,这个可以根据自己需求定了,当顶部控件显示时,fling可以让顶部控件隐藏或者显示。

    Eg:当然有人会说用手势 + 事件分发拦截同样可以实现这个效果,的确可以实现,只是效果会打折扣

    事件分发是这样的:子View首先得到事件处理权,处理过程中,父View可以对其拦截,但是拦截了以后就无法再还给子View(本次手势内)。
    NestedScrolling机制是这样的:内部View在滚动的时候,首先将dx,dy交给NestedScrollingParent,NestedScrollingParent可对其进行部分消耗,剩余的部分还给内部View。

    这里针对实现了NetstedScrollingParent 的类继续log输出,直观显示滚动事件调用链。

    不进行滑动

    vlayout E/StickyNavLayout: onStartNestedScroll
    05-22 14 E/StickyNavLayout: onNestedScrollAccepted
    05-22 14 E/StickyNavLayout: onStopNestedScroll

    进行滑动

    05-22 14:46:11.655 27721-27721/: onStartNestedScroll
    05-22 14:46:11.655 27721-27721/: onNestedScrollAccepted
    05-22 14:46:11.875 27721-27721/: onNestedPreScroll
    05-22 14:46:11.895 27721-27721/: onNestedPreScroll
    05-22 14:46:11.915 27721-27721/: onNestedPreScroll
    05-22 14:46:11.925 27721-27721/: onNestedPreScroll
    05-22 14:46:11.945 27721-27721/: onNestedPreScroll
    05-22 14:46:11.965 27721-27721/: onNestedPreScroll
    05-22 14:46:11.975 27721-27721/: onNestedPreScroll
    05-22 14:46:11.995 27721-27721/: onNestedPreScroll
    05-22 14:46:12.015 27721-27721/: onNestedPreScroll
    05-22 14:46:12.025 27721-27721/: onNestedPreScroll
    05-22 14:46:12.045 27721-27721/: onStopNestedScroll

    快速滑动

    05-22 14:48:18.245 27721-27721/: onStartNestedScroll
    05-22 14:48:18.245 27721-27721/: onNestedScrollAccepted
    05-22 14:48:18.315 27721-27721/: onNestedPreScroll
    05-22 14:48:18.315 27721-27721/: onNestedScroll
    
    05-22 14:48:18.315 27721-27721/: onNestedPreFling
    05-22 14:48:18.315 27721-27721/: onNestedFling
    05-22 14:48:18.315 27721-27721/: onStopNestedScroll

    抛,快速 滑动触发Fling

    05-22 14:49:51.875 27721-27721/: onNestedPreFling
    05-22 14:49:51.875 27721-27721/: onNestedFling

    1.嵌套布局模式。依附于onTouchEvent() 进行处理。在down,move,up 中进行回调。Helper 类中实现

    1. 固定大小的 int [2],集合。 作为形参,进行传递,在函数中可以通过形参进行赋值

    3.scroller 和 后面 api 19 新添加对于over 边界处理的 overscroller ,两者80% api重复,后者多了几个处理Over bound的 api

    Demo 链接:http://blog.csdn.net/o279642707/article/details/72654386

    总结:

    嵌套布局滑动和事件分发之间的区别,进行自定义扩展嵌套布局需要实现那些方法,实现那几个类。嵌套布局的延伸兼容性等有个大体的了解。细节部分还请自行体验


    引用:
    RecyclerView的滚动事件分析
    https://segmentfault.com/a/1190000005718165
    带你玩转嵌套滑动 http://blog.csdn.net/lmj623565791/article/details/52204039
    Android NestedScrolling 实战
    https://race604.com/android-nested-scrolling/
    Android 嵌套滑动机制(NestedScrolling)
    https://segmentfault.com/a/1190000002873657
    Android 自定义控件 轻松实现360软件详情页
    http://blog.csdn.net/lmj623565791/article/details/43649913
    NestedScrollingParent, NestedScrollingChild  详解
    http://blog.csdn.net/chen930724/article/details/50307193
    关于View的ScrollTo, getScrollX 和 getScrollY
    http://www.xuebuyuan.com/2013505.html

    展开全文
  • QDockWidget嵌套布局详解-实现Visual Studio布局

    万次阅读 多人点赞 2016-04-22 15:31:22
    Qt的嵌套布局由QDockWidget完成,用Qt Creator拖界面得到的dock布置形式比较固定,不能得想要的任意组合形式,要得到如下图所示的效果,后续布局必须通过代码来完成。 ps:这是自己没事写的一个数据可视化软件 ...

    #概述
    许多工程软件,如Qt Creator,VS,matlab等,都是使用dock布局窗口,这样用户可以自定义界面,自由组合窗口。
    Qt的嵌套布局由QDockWidget完成,用Qt Creator拖界面得到的dock布置形式比较固定,不能得想要的任意组合形式,要得到如下图所示的效果,后续布局必须通过代码来完成。
    这里写图片描述
    ps:这是自己没事写的一个数据可视化软件
    下面说说如何实现完全自由的界面布局效果:
    #QDockWidget在QMainWindow的布局函数
    要在QMainWindow里对dock进行布局,需要用到如下几个函数:

    • 添加dock函数
      此函数用于给dock指定位置,同时也可以更改dock的位置,此函数命名为addDockWidget有点容易误导,因为不仅仅有add的功能,还有chang的功能
    void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget * dockwidget)
    void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget * dockwidget, Qt::Orientation orientation)
    
    • 分割dock窗口函数
      此函数的功能是把两个dock进行左右或上下并排布置,做成一个类似QSplit的功能
    void QMainWindow::splitDockWidget(QDockWidget * first, QDockWidget * second, Qt::Orientation orientation)
    
    • tab化窗口函数
      此函数的功能是把多个dock变成一个tab形式的窗体
    void QMainWindow::tabifyDockWidget(QDockWidget * first, QDockWidget * second)
    
    • 设置dock嵌套布局
      此函数是设置嵌套布局的关键
    void QMainWindow::setDockNestingEnabled(bool enabled)
    

    以上几个函数就能完成比较复杂的嵌套布局了。
    #设置嵌套布局
    下面通过例子来讲解如何设置复杂的嵌套布局
    先用Qt Creator拖放9个dock进视图里,为了好区分,给每个dock设置一个背景颜色:
    这里写图片描述
    dock属性随便设置,保证都任意区域可以停靠即可
    由于这里不需要MainWindow的中间窗口,整个视图都由dock组成,因此先把QMainWindow的中间窗口部件去除:
    在MainWindow的构造函数加入如下语句,即可把MainWindow的中间窗口去除,这时整个MainWindow只有Dock组成

    QWidget* p = takeCentralWidget();
        if(p)
            delete p;
    

    编译出来的效果如图所示:
    这里写图片描述
    拖动dock可以发现,只能在两边进行组合,我想把dock放置到中间是无法实现的,这是由于为了简化dock的吸附,QMainWindow默认是把dock嵌套关闭的,需要我们手动设置,在MainWindow的构造函数里添加:

    setDockNestingEnabled(true);
    

    即可打开嵌套功能,这时编译出来的窗口能实现如下嵌套:
    这里写图片描述
    此时,整个窗口的布局将变得非常灵活且复杂,由于Qt Creator在ui编辑器中无法像编译出来的程序那样任意调整位置,因此需要手动对窗口进行设置。下面将介绍如何用代码设置复杂的dock
    为了方便,添加两个函数和一个成员变量:
    head:

    public:
    	//移除并隐藏所有dock
    	void removeAllDock();
    	//显示dock窗口
    	void showDock(const QList<int>& index = QList<int>());
    private:
        QList<QDockWidget*> m_docks;///< 记录所有dockWidget的指针
    

    CPP:

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        //删除中央窗体
        QWidget* p = takeCentralWidget();
        if(p)
            delete p;
        //允许嵌套dock
        setDockNestingEnabled(true);
    	//记录所有的dock指针
        m_docks.append(ui->dockWidget_1);
        m_docks.append(ui->dockWidget_2);
        m_docks.append(ui->dockWidget_3);
        m_docks.append(ui->dockWidget_4);
        m_docks.append(ui->dockWidget_5);
        m_docks.append(ui->dockWidget_6);
        m_docks.append(ui->dockWidget_7);
        m_docks.append(ui->dockWidget_8);
        m_docks.append(ui->dockWidget_9);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    ///
    /// \brief 移除并隐藏所有的dock
    ///
    void MainWindow::removeAllDock()
    {
        for(int i=0;i<9;++i)
        {
            removeDockWidget(m_docks[i]);
        }
    }
    ///
    /// \brief 显示指定序号的dock
    /// \param index 指定序号,如果不指定,则会显示所有
    ///
    void MainWindow::showDock(const QList<int> &index)
    {
        if (index.isEmpty())
        {
            for(int i=0;i<9;++i)
            {
                m_docks[i]->show();
            }
        }
        else
        {
            foreach (int i, index) {
                m_docks[i]->show();
            }
        }
    }
    
    

    void removeAllDock();函数可以把所有的dock隐藏void showDock(const QList<int>& index = QList<int>())则可以显示指定的dock。
    下面先对需要用到的几个函数进行示范:
    ##addDockWidget
    addDockWidget函数用于给MainWindow添加dock窗体,指定添加的区域,如果想改变dock的位置,也可以使用此函数进行移动。

    void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget * dockwidget)
    void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget * dockwidget, Qt::Orientation orientation)
    

    如:

    addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_1);
    addDockWidget(Qt::RightDockWidgetArea,ui->dockWidget_2);
    addDockWidget(Qt::TopDockWidgetArea,ui->dockWidget_3);
    addDockWidget(Qt::BottomDockWidgetArea,ui->dockWidget_4);
    

    把4个dock按照上下左右布置,效果如下:
    这里写图片描述
    ##splitDockWidget
    splitDockWidget

    void QMainWindow::splitDockWidget(QDockWidget * first, QDockWidget * second, Qt::Orientation orientation)
    

    此函数可以把一个dock(QDockWidget * first)在其位置上进行嵌套,嵌套可以指定水平嵌套或者垂直嵌套,嵌套方向是从左到右,从上到下,也就是QDockWidget * first相对于QDockWidget * second永远在左边或者上边。
    如:

    removeAllDock();
    addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_1);
    splitDockWidget(ui->dockWidget_1,ui->dockWidget_2,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_3,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_3,ui->dockWidget_4,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_4,ui->dockWidget_5,Qt::Horizontal);
    showDock(QList<int>()<< 0<<1<<2<<3<<4);
    

    得到如下效果:
    这里写图片描述
    若是:

    removeAllDock();
    addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_1);
    splitDockWidget(ui->dockWidget_1,ui->dockWidget_2,Qt::Vertical);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_3,Qt::Vertical);
    splitDockWidget(ui->dockWidget_3,ui->dockWidget_4,Qt::Vertical);
    splitDockWidget(ui->dockWidget_4,ui->dockWidget_5,Qt::Vertical);
    showDock(QList<int>()<< 0<<1<<2<<3<<4);
    

    那么效果变为:
    这里写图片描述
    此函数是实现嵌套布局的关键,首先指定基准,然后开始进行分割,即可得到比较复杂的布局。
    分割原则是:先水平,再竖直,从左到右,从上到下
    下面显示一个九宫格布局:
    这里写图片描述
    实现代码

    removeAllDock();
    //原则,先左右,再上下
    addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_1);
    splitDockWidget(ui->dockWidget_1,ui->dockWidget_2,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_3,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_1,ui->dockWidget_4,Qt::Vertical);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_5,Qt::Vertical);
    splitDockWidget(ui->dockWidget_3,ui->dockWidget_6,Qt::Vertical);
    splitDockWidget(ui->dockWidget_4,ui->dockWidget_7,Qt::Vertical);
    splitDockWidget(ui->dockWidget_5,ui->dockWidget_8,Qt::Vertical);
    splitDockWidget(ui->dockWidget_6,ui->dockWidget_9,Qt::Vertical);
    showDock();
    

    这里写图片描述
    实现代码:

    removeAllDock();
    //原则,先左右,再上下
    addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_1);
    splitDockWidget(ui->dockWidget_1,ui->dockWidget_2,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_3,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_1,ui->dockWidget_4,Qt::Vertical);
    splitDockWidget(ui->dockWidget_3,ui->dockWidget_6,Qt::Vertical);
    splitDockWidget(ui->dockWidget_4,ui->dockWidget_7,Qt::Vertical);
    splitDockWidget(ui->dockWidget_6,ui->dockWidget_9,Qt::Vertical);
    showDock(QList<int>()<< 0<<1<<2<<3<<5<<6<<8);
    

    这里写图片描述
    实现代码:

    removeAllDock();
    addDockWidget(Qt::TopDockWidgetArea,ui->dockWidget_1);
    addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_2);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_3,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_3,ui->dockWidget_4,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_5,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_3,ui->dockWidget_6,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_4,ui->dockWidget_7,Qt::Horizontal);
    showDock(QList<int>()<< 0<<1<<2<<3<<4<<5<<6);
    

    反正就是用splitDockWidgetaddDockWidget你想怎么布置就怎么布置。
    ##tabifyDockWidget
    此函数就是实现tab合并功能
    直接看看下面例子:
    这里写图片描述
    实现原理:

    removeAllDock();
    addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_1);
    splitDockWidget(ui->dockWidget_1,ui->dockWidget_2,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_3,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_1,ui->dockWidget_4,Qt::Vertical);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_5,Qt::Vertical);
    splitDockWidget(ui->dockWidget_3,ui->dockWidget_6,Qt::Vertical);
    tabifyDockWidget(ui->dockWidget_1,ui->dockWidget_7);
    tabifyDockWidget(ui->dockWidget_5,ui->dockWidget_8);
    tabifyDockWidget(ui->dockWidget_3,ui->dockWidget_9);
    showDock();
    

    代码:
    本例代码下载:本例代码免积分-

    上面下载链接本来是免积分的,都被csdn设置为50积分,文章内容和源码已经同步到github,有需要移步github,别用csdn的下载
    https://github.com/czyt1988/czyBlog/tree/master/tech/QDockWidget_VSStudioMode

    展开全文
  • PyQt5布局管理之嵌套布局(五)

    千次阅读 2018-08-15 12:30:05
    嵌套布局 由于情况的需要,,有时候需要在一种布局中,嵌套别种布局,话不多,直接实例示范 实例:在布局中添加其他布局 import sys from PyQt5.QtWidgets import * class MyWindow(QWidget): def __init__...

    嵌套布局

    由于情况的需要,,有时候需要在一种布局中,嵌套别种布局,话不多,直接实例示范

    实例:在布局中添加其他布局

    import sys
    from PyQt5.QtWidgets import *
    
    class MyWindow(QWidget):
        def __init__(self):
            super(MyWindow, self).__init__()
            self.setWindowTitle('嵌套布局实例')
    
            #全局布局(2中):这里选择水平布局
            wlayout=QHBoxLayout()
    
            #局部布局:水平,垂直,网格,表单
            hlayout=QHBoxLayout()
            vlayout=QVBoxLayout()
            glayout=QGridLayout()
            flayout=QFormLayout()
    
            #为局部布局添加控件
            hlayout.addWidget(QPushButton(str(1)))
            hlayout.addWidget(QPushButton(str(2)))
    
            vlayout.addWidget(QPushButton(str(3)))
            vlayout.addWidget(QPushButton(str(4)))
    
            glayout.addWidget(QPushButton(str(5)),0,0)
            glayout.addWidget(QPushButton(str(6)),0,1)
            glayout.addWidget(QPushButton(str(7)),1,0)
            glayout.addWidget(QPushButton(str(8)),1,1)
    
            flayout.addWidget(QPushButton(str(9)))
            flayout.addWidget(QPushButton(str(10)))
            flayout.addWidget(QPushButton(str(11)))
            flayout.addWidget(QPushButton(str(12)))
    
            #准备四个控件
            hwg=QWidget()
            vwg=QWidget()
            gwg=QWidget()
            fwg=QWidget()
    
            #使用四个控件设置局部布局
            hwg.setLayout(hlayout)
            vwg.setLayout(vlayout)
            gwg.setLayout(glayout)
            fwg.setLayout(flayout)
    
            #将四个控件添加到全局布局中
            wlayout.addWidget(hwg)
            wlayout.addWidget(vwg)
            wlayout.addWidget(gwg)
            wlayout.addWidget(fwg)
    
            #将窗口本身设置为全局布局
            self.setLayout(wlayout)
    
    if __name__ == '__main__':
        app=QApplication(sys.argv)
        win=MyWindow()
        win.show()
        sys.exit(app.exec_())

    运行效果图
    这里写图片描述

    代码分析

    第一步:全局布局
    全局布局采用的是水平布局

    wlayout=QHBoxLayout()
    

    第二步:局部布局
    实例化四中局部布局

            #局部布局:水平,垂直,网格,表单
            hlayout=QHBoxLayout()
            vlayout=QVBoxLayout()
            glayout=QGridLayout()
            flayout=QFormLayout()

    第三步:准备四个QWidget控件

            hwg=QWidget()
            vwg=QWidget()
            gwg=QWidget()
            fwg=QWidget()

    第四步:为四个QWidget控件分别设置布局

            hwg.setLayout(hlayout)
            vwg.setLayout(vlayout)
            gwg.setLayout(glayout)
            fwg.setLayout(flayout)

    第五步:将4个QWidget控件添加到全局布局中

            wlayout.addWidget(hwg)
            wlayout.addWidget(vwg)
            wlayout.addWidget(gwg)
            wlayout.addWidget(fwg)

    最后:全局布局应用到窗口本身

            self.setLayout(wlayout)
    

    实例二:在窗口中添加布局

    上一个实例,有一个缺点,那就是4中局部布局需要四个空白控件,倘若有100中局部布局,就需要100个空白控件,其实,有较好的一种方法,不管有多少布局,只需要一个空白控件,然后在这个空白控件中进行多种布局,也能实现同样的效果

    import sys
    from PyQt5.QtWidgets import *
    
    class MyWindow(QWidget):
        def __init__(self):
            super(MyWindow, self).__init__()
            self.setWindowTitle('嵌套布局实例')
            self.resize(700,200)
    
    
            #全局控件(注意参数self),用于承载全局布局
            wwg=QWidget(self)
    
            #全局布局(注意参数wwg)
            wlayout = QHBoxLayout(wwg)
    
            hlayout = QHBoxLayout()
            vlayout = QVBoxLayout()
            glayout = QGridLayout()
            flayout = QFormLayout()
    
            # 为局部布局添加控件
            hlayout.addWidget(QPushButton(str(1)))
            hlayout.addWidget(QPushButton(str(2)))
    
            vlayout.addWidget(QPushButton(str(3)))
            vlayout.addWidget(QPushButton(str(4)))
    
            glayout.addWidget(QPushButton(str(5)), 0, 0)
            glayout.addWidget(QPushButton(str(6)), 0, 1)
            glayout.addWidget(QPushButton(str(7)), 1, 0)
            glayout.addWidget(QPushButton(str(8)), 1, 1)
    
            flayout.addWidget(QPushButton(str(9)))
            flayout.addWidget(QPushButton(str(10)))
            flayout.addWidget(QPushButton(str(11)))
            flayout.addWidget(QPushButton(str(12)))
    
            #在局部布局中添加控件,然后将其添加到全局布局中
            wlayout.addLayout(hlayout)
            wlayout.addLayout(vlayout)
            wlayout.addLayout(glayout)
            wlayout.addLayout(flayout)
    if __name__ == '__main__':
        app=QApplication(sys.argv)
        win=MyWindow()
        win.show()
        sys.exit(app.exec_())

    运行效果图
    这里写图片描述

    代码分析

    第一步:准备一个全局控件用于添加全局布局

    wwg=QWidget(self)

    第二步:定义全局布局与四中局部布局

            wlayout = QHBoxLayout(wwg)
    
            hlayout = QHBoxLayout()
            vlayout = QVBoxLayout()
            glayout = QGridLayout()
            flayout = QFormLayout()

    第三步:局部布局添加控件

             # 为局部布局添加控件
            hlayout.addWidget(QPushButton(str(1)))
            hlayout.addWidget(QPushButton(str(2)))
    
            vlayout.addWidget(QPushButton(str(3)))
            vlayout.addWidget(QPushButton(str(4)))
    
            glayout.addWidget(QPushButton(str(5)), 0, 0)
            glayout.addWidget(QPushButton(str(6)), 0, 1)
            glayout.addWidget(QPushButton(str(7)), 1, 0)
            glayout.addWidget(QPushButton(str(8)), 1, 1)
    
            flayout.addWidget(QPushButton(str(9)))
            flayout.addWidget(QPushButton(str(10)))
            flayout.addWidget(QPushButton(str(11)))
            flayout.addWidget(QPushButton(str(12)))
    

    最后:局部布局添加到全局布局中

           #在局部布局中添加控件,然后将其添加到全局布局中
            wlayout.addLayout(hlayout)
            wlayout.addLayout(vlayout)
            wlayout.addLayout(glayout)
            wlayout.addLayout(flayout)

    展开全文
  • 主要介绍了Android App中的多个LinearLayout嵌套布局实例,利用线性布局来排列按钮是安卓应用布局中的常用做法,需要的朋友可以参考下
  • wpf grid 嵌套布局

    千次阅读 2020-04-27 14:57:17
    wpf grid 嵌套布局 <Grid.ColumnDefinitions> //最大的布局 <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/&g...
  • Qt之QDockWidget嵌套布局详解-实现Visual Studio布局

    万次阅读 多人点赞 2018-07-27 15:26:57
    Qt的嵌套布局由QDockWidget完成,用Qt Creator拖界面得到的dock布置形式比较固定,不能得想要的任意组合形式,要得到如下图所示的效果,后续布局必须通过代码来完成。 下面说说如何实现完全自由的界面布局效果: ...
  • bootstrap布局:嵌套布局和流动布局

    千次阅读 2015-06-14 20:16:50
    嵌套布局 布局使用Bookstrap网格系统布局网页 <p>asdfadsfaasdfasdf 阿斯顿发的事发adfasdf都发生地方阿斯顿发撒的发生到付asd
  • PyQt5——嵌套布局和QSplitter

    千次阅读 2019-10-23 14:23:16
    嵌套布局 在布局中添加其他布局 import sys from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout,QPushButton class MyWindow(QWidget): def __init__(self): ...
  • android布局学习--嵌套布局

    千次阅读 2015-06-18 11:35:39
    采用嵌套的方式来实现复杂的布局,通过2个示例来介绍嵌套布局的方法。  示例1:将Activity界面分成上、下2部分,然后上部分是用横向的(水平)布局,里面有4个TextView ,下部分则是用纵向的(垂直)布局,也放有4...
  • 线性布局之嵌套布局

    2012-10-12 10:52:06
    很多时候,线性布局需要嵌套其他布局,比如线性布局,相对布局
  • Android中使用嵌套布局完成美食背后的故事案例的要求说明 范美英 北京信息职业技术学院 摘 要在嵌套布局根据要求完成练习 关键词 Android嵌套布局任务要求 完成如下图所示的菜谱应用程序界面要求能够 如图 (a)在屏幕...
  • PyQt5中使用代码实现嵌套布局 PyQt5中有四种布局:水平(QHBoxLayout)、竖直(QVBoxLayout)、网格(QGridLayout)、表单(QFormLayout) 对于嵌套布局来说,主要分四步: 1、定义布局 2、将内层布局加载到一个空的...
  • ConstrainLayout解决复杂的嵌套布局

    万次阅读 2017-03-03 10:26:04
    今天我要讲的是,项目中复杂的嵌套布局你讲采取何种方式呢?如果按常规方式去做,估计你做完一个界面,估计够呛。我将推荐你们使用谷歌推出的ConstrainLayout,虽然还没有出正式版本,但用于复杂嵌套布局,能解决你很...
  • Qt的嵌套布局由QDockWidget完成,用Qt Creator拖界面得到的dock布置形式比较固定,不能得想要的任意组合形式,要得到如下图所示的效果,后续布局必须通过代码来完成。  ps:这是自己没事写的一个数据可视化软件  ...
  • 嵌套布局 布局管理器除了可以添加控件,还可以添加子布局。 通常嵌套布局有以下两种方式: # -*- coding: utf-8 -*- """ Created on Fri May 8 23:56:28 2020 @author: Giyn """ import sys from PyQt5.Qt...
  • GridView嵌套布局

    2015-11-03 16:28:04
    有时候开发,需要滑动布局嵌套,而当我们将布局嵌套好了以后,问题就出来,高度不精确,这时候是否可以想想自己哪里出错了呢,大家先看一下有问题的布局   android:id="@+id/child_root"  android:layout_...
  • 嵌套布局:  在一行中,有三列,每一列都有对应的BS栅格系统中的格子,以下例中因为 .row中的div对应的class分别是span4,span4,span4,所以其每一列对应的格子数是  4,4,4  现在有一个需求,要在第三列中另外再...
  • 第三十二章、使用splitDockWidget和tabifyDockWidget嵌套布局QDockWidget的PyQt人机对话案例.pdf
  • Activity布局初步(二)- 嵌套布局  采用嵌套的方式来实现复杂的布局,通过2个示例来介绍嵌套布局的方法。  示例1:将Activity界面分成上、下2部分,然后上部分是用横向的(水平)布局,里面有4个TextView ,下...
  • 嵌套约束布局的时候不要在用约束布局 要进行高度的限制要不会 自适应高度
  • 布局是一个软件质量重要的一方面,体现了软件设计的水平,一个好的软件必然有个好的布局。 Qt中有水平布局:QHBoxLayout 垂直布局:QVBoxLayout 现在我们有这样一个需求,我们希望有三个按钮总在窗口的最左上角,...
  • 第15.39节、splitDockWidget和tabifyDockWidget嵌套布局QDockWidget的PyQt人机对话案例:笨笨机器人.pdf
  • div嵌套布局

    千次阅读 2018-11-20 16:55:35
    div 横向布局 display:inline
  • 嵌套布局写了个用户信息采集页面,其中还有TableLayout,算是骨架布局的一个小demo。 直接上代码 xmlns:tools="http://schemas.android.com/tools" android:layout_wid
  • fragment的嵌套布局

    2014-09-16 20:37:37
    本案例中标准的Fragment导航嵌套,有很好的学习价值,包括底部和顶部导航的嵌套

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,433
精华内容 43,373
关键字:

嵌套布局