精华内容
下载资源
问答
  • statuspanel能作为自定义控件容器,怎么在statuspanel上呈现带有用户事件的自定义控件
  • 使用WebBrowser控件作为容器打开Word文档
  • Android标签容器控件的实现

    千次阅读 2016-07-21 14:57:00
    Android中标签容器控件的实现,在一些APP中我们可以看到一些存放标签的容器控件,和我们平时使用的一些布局方式有些不同,它们一般都可以自动适应屏幕的宽度进行布局,根据对自定义控件的一些理解,今天写一个简单的...

    Android中标签容器控件的实现

    介绍

    在一些APP中我们可以看到一些存放标签的容器控件,和我们平时使用的一些布局方式有些不同,它们一般都可以自动适应屏幕的宽度进行布局,根据对自定义控件的一些理解,今天写一个简单的标签容器控件,项目源码在最后给出

    下面这个是我在手机上截取的一个实例,是在MIUI8系统上截取的

    这里写图片描述

    这个是我实现的效果图

    这里写图片描述

    原理介绍

    根据对整个控件的效果分析,大致可以将控件分别从以下这几个角度进行分析:

    1.首先涉及到自定义的ViewGroup,因为现有的控件没法满足我们的布局效果,就涉及到要重写onMeasure和onLayout,这里需要注意的问题是自定义View的时候,我们需要考虑到View的Padding属性,而在自定义ViewGroup中我们需要在onLayout中考虑Child控件的margin属性否则子类设置这个属性将会失效。整个View的绘制流程是这样的:

    最顶层的ViewRoot执行performTraversals然后分别开始对各个View进行层级的测量、布局、绘制,整个流程是一层一层进行的,也就是说父视图测量时会调用子视图的测量方法,子视图调孙视图方法,一直测量到叶子节点,performTraversals这个函数翻译过来很直白,执行遍历,就说明了这种层级关系。

    2.该控件形式上和ListView的形式比较相近,所以在这里我也模仿ListView的Adapter模式实现了对控件内容的操作,这里对ListView的setAdapter和Adapter的notifyDataSetChanged方法做个简单的解释:

    在ListView调用setAdapter后,ListView会去注册一个Observer对象到这个adapter上,然后当我们在改变设置到adapter上的数据发改变时,我们会调用adapter的notifyDataSetChanged方法,这个方法就会通知所有监听了该Adapter数据改变时的Observer对象,这就是典型的监听者模式,这时由于ListView中的内部成员对象监听了该事件,就可以知道数据源发生了改变,我们需要对真个控件重新进行绘制了,下面来一些相关的源码。

    Adapter的notifyDataSetChanged

    public void notifyDataSetChanged() {
            mDataSetObservable.notifyChanged();
        }

    ListView的setAdapter方法

    @Override
        public void setAdapter(ListAdapter adapter) {
            /**
             *每次设置新的适配的时候,如果现在有的话会做一个解除监听的操作
             */
            if (mAdapter != null && mDataSetObserver != null) {
                mAdapter.unregisterDataSetObserver(mDataSetObserver);
            }
    
            resetList();
            mRecycler.clear();
            /** 省略部分代码.....   */
            if (mAdapter != null) {
                mAreAllItemsSelectable = mAdapter.areAllItemsEnabled();
                mOldItemCount = mItemCount;
                mItemCount = mAdapter.getCount();
                checkFocus();
    
                /**
                *在这里对adapter设置了监听,
                *使用的是AdapterDataSetObserver类的对象,该对象定义在ListView的父类AdapterView中
                */
                mDataSetObserver = new AdapterDataSetObserver();
                mAdapter.registerDataSetObserver(mDataSetObserver);
                /** 省略 */
            } else {
                /** 省略 */
            }
    
            requestLayout();
        }

    AdapterView中的内部类AdapterDataSetObserver

    class AdapterDataSetObserver extends DataSetObserver {
    
            private Parcelable mInstanceState = null;
    
            @Override
            public void onChanged() {
                /* ***代码略*** */
                checkFocus();
                requestLayout();
            }
    
            @Override
            public void onInvalidated() {
               /* ***代码略*** */
                checkFocus();
                requestLayout();
            }
    
            public void clearSavedState() {
                mInstanceState = null;
            }
        }

    一段伪代码表示

    ListView{
        Observer observer{
             onChange(){
                  change;
             }
        }
    
        setAdapter(Adapter adapter){
             adapter.register(observer);
        }
    }
    
    Adapter{
        List<Observer> mObservable;
        register(observer){
            mObservable.add(observer);
        }
        notifyDataSetChanged(){
            for(i-->mObserverable.size()){
                mObserverable.get(i).onChange
            }
        }
    }

    实现过程

    获取ViewItem的接口

    package humoursz.gridtag.test.adapter;
    
    import android.view.View;
    
    import java.util.List;
    
    /**
     * Created by zhangzhiquan on 2016/7/19.
     */
    public interface GrideTagBaseAdapter {
        List<View> getViews();
    }
    

    抽象适配器AbsGridTagsAdapter

    package humoursz.gridtag.test.adapter;
    
    import android.database.DataSetObservable;
    import android.database.DataSetObserver;
    
    /**
     * Created by zhangzhiquan on 2016/7/19.
     */
    public abstract class AbsGridTagsAdapter implements GrideTagBaseAdapter {
    
        DataSetObservable mObservable = new DataSetObservable();
    
        public void notification(){
            mObservable.notifyChanged();
        }
        public void registerObserve(DataSetObserver observer){
            mObservable.registerObserver(observer);
        }
        public void unregisterObserve(DataSetObserver observer){
            mObservable.unregisterObserver(observer);
        }
    }
    

    此效果中的需要的适配器,实现了getView接口,主要是模仿了ListView的BaseAdapter

    package humoursz.gridtag.test.adapter;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.TextView;
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    import humoursz.gridtag.test.R;
    import humoursz.gridtag.test.util.UIUtil;
    import humoursz.gridtag.test.widget.GridTagView;
    
    /**
     * Created by zhangzhiquan on 2016/7/19.
     */
    public class MyGridTagAdapter extends AbsGridTagsAdapter {
    
        private Context mContext;
    
        private List<String> mTags;
    
        public MyGridTagAdapter(Context context, List<String> tags) {
            mContext = context;
            mTags = tags;
        }
    
        @Override
        public List<View> getViews() {
            List<View> list = new ArrayList<>();
            for (int i = 0; i < mTags.size(); i++) {
    
                TextView tv = (TextView) LayoutInflater.from(mContext)
                        .inflate(R.layout.grid_tag_item_text, null);
    
                tv.setText(mTags.get(i));
    
                GridTagView.LayoutParams lp = new GridTagView
                        .LayoutParams(GridTagView.LayoutParams.WRAP_CONTENT
                        ,GridTagView.LayoutParams.WRAP_CONTENT);
    
                lp.margin(UIUtil.dp2px(mContext, 5));
    
                tv.setLayoutParams(lp);
    
                list.add(tv);
            }
            return list;
        }
    }

    最后是主角GridTagsView控件

    package humoursz.gridtag.test.widget;
    
    import android.content.Context;
    import android.database.DataSetObserver;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    
    
    import java.util.List;
    
    import humoursz.gridtag.test.adapter.AbsGridTagsAdapter;
    
    /**
     * Created by zhangzhiquan on 2016/7/18.
     */
    public class GridTagView extends ViewGroup {
    
        private int mLines = 1;
    
        private int mWidthSize = 0;
    
        private AbsGridTagsAdapter mAdapter;
    
        private GTObserver mObserver = new GTObserver();
    
        public GridTagView(Context context) {
            this(context, null);
        }
    
        public GridTagView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public GridTagView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public void setAdapter(AbsGridTagsAdapter adapter) {
            if (mAdapter != null) {
                mAdapter.unregisterObserve(mObserver);
            }
            mAdapter = adapter;
            mAdapter.registerObserve(mObserver);
            mAdapter.notification();
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int heightSize = MeasureSpec.getSize(heightMeasureSpec);
            int curWidthSize = 0;
            int childHeight = 0;
            mLines = 1;
            for (int i = 0; i < getChildCount(); ++i) {
                View child = getChildAt(i);
                measureChild(child, widthMeasureSpec, heightMeasureSpec);
                curWidthSize += getChildRealWidthSize(child);
                if (curWidthSize > widthSize) {
                    /**
                     * 计算一共需要多少行,用于计算控件的高度
                     * 计算方法是,如果当前控件放下后宽度超过
                     * 容器本身的高度,就放到下一行
                     */
                    curWidthSize = getChildRealWidthSize(child);
                    mLines++;
                }
                if (childHeight == 0) {
                    /**
                     * 在第一次计算时拿到字视图的高度作为计算基础
                     */
                    childHeight = getChildRealHeightSize(child);
                }
            }
            mWidthSize = widthSize;
            setMeasuredDimension(widthSize, childHeight == 0 ? heightSize : childHeight * mLines);
    
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            if (getChildCount() == 0)
                return;
            int childCount = getChildCount();
            LayoutParams lp = getChildLayoutParams(getChildAt(0));
            /**
             * 初始的左边界在自身的padding left和child的margin后
             * 初始的上边界原理相同
             */
            int left = getPaddingLeft() + lp.leftMargin;
            int top = getPaddingTop() + lp.topMargin;
            int curLeft = left;
            for (int i = 0; i < childCount; ++i) {
                View child = getChildAt(i);
    
                int right = curLeft + getChildRealWidthSize(child);
                /**
                 * 计算如果放下当前试图后整个一行到右侧的距离
                 * 如果超过控件宽那就放到下一行,并且左边距还原,上边距等于下一行的开始
                 */
                if (right > mWidthSize) {
                    top += getChildRealHeightSize(child);
                    curLeft = left;
                }
                child.layout(curLeft, top, curLeft + child.getMeasuredWidth(), top + child.getMeasuredHeight());
                /**
                 * 下一个控件的左边开始距离是上一个控件的右边
                 */
                curLeft += getChildRealWidthSize(child);
            }
        }
    
        /**
         * 获取childView实际占用宽度
         * @param child
         * @return 控件实际占用的宽度,需要算上margin否则margin不生效
         */
        private int getChildRealWidthSize(View child) {
            LayoutParams lp = getChildLayoutParams(child);
            int size = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
            return size;
        }
    
        /**
         * 获取childView实际占用高度
         * @param child
         * @return 实际占用高度需要考虑上下margin
         */
        private int getChildRealHeightSize(View child) {
            LayoutParams lp = getChildLayoutParams(child);
            int size = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
            return size;
        }
    
        /**
         * 获取LayoutParams属性
         * @param child
         * @return
         */
        private LayoutParams getChildLayoutParams(View child) {
            LayoutParams lp;
            if (child.getLayoutParams() instanceof LayoutParams) {
                lp = (LayoutParams) child.getLayoutParams();
            } else {
                lp = (LayoutParams) generateLayoutParams(child.getLayoutParams());
            }
    
            return lp;
        }
    
    
        @Override
        public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attr) {
            return new LayoutParams(getContext(), attr);
        }
    
        @Override
        protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
            return new LayoutParams(p);
        }
    
        public static class LayoutParams extends MarginLayoutParams {
    
            public LayoutParams(Context c, AttributeSet attrs) {
                super(c, attrs);
            }
    
            public LayoutParams(int width, int height) {
                super(width, height);
            }
    
            public LayoutParams(MarginLayoutParams source) {
                super(source);
            }
    
            public LayoutParams(ViewGroup.LayoutParams source) {
                super(source);
            }
    
            public void marginLeft(int left) {
                this.leftMargin = left;
            }
    
            public void marginRight(int r) {
                this.rightMargin = r;
            }
    
            public void marginTop(int t) {
                this.topMargin = t;
            }
    
            public void marginBottom(int b) {
                this.bottomMargin = b;
            }
            public void margin(int m){
                this.leftMargin = m;
                this.rightMargin = m;
                this.topMargin = m;
                this.bottomMargin = m;
            }
        }
    
    
        private class GTObserver extends DataSetObserver {
            @Override
            public void onChanged() {
                removeAllViews();
                List<View> list = mAdapter.getViews();
                for (int i = 0; i < list.size(); i++) {
                    addView(list.get(i));
                }
            }
            @Override
            public void onInvalidated() {
                Log.d("Mrz","fd");
            }
        }
    }
    

    MainActivity

    package humoursz.gridtag.test;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    
    import java.util.List;
    
    import humoursz.gridtag.test.adapter.MyGridTagAdapter;
    import humoursz.gridtag.test.util.ListUtil;
    import humoursz.gridtag.test.widget.GridTagView;
    
    public class MainActivity extends AppCompatActivity {
    
        MyGridTagAdapter adapter;
        GridTagView mGridTag;
        List<String> mList;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mGridTag = (GridTagView)findViewById(R.id.grid_tags);
            mList = ListUtil.getGridTagsList(20);
            adapter = new MyGridTagAdapter(this,mList);
            mGridTag.setAdapter(adapter);
        }
    
        public void onClick(View v){
            mList.removeAll(mList);
            mList.addAll(ListUtil.getGridTagsList(20));
            adapter.notification();
        }
    }
    

    XML 文件

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="humoursz.gridtag.test.MainActivity">
    
        <humoursz.gridtag.test.widget.GridTagView
            android:id="@+id/grid_tags"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </humoursz.gridtag.test.widget.GridTagView>
        <Button
            android:layout_centerInParent="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="换一批"/>
    </RelativeLayout>
    

    这样一个简单的控件就写好了,主要需要注意measure和layout否则很多效果都会失效,安卓中的LinearLayout之类的控件实际实现起来要复杂的很多,因为支持的属性实在的太多了,多动手实践可以帮助理解,下面是工程的下载地址

    Android简单标签容器工程源码

    展开全文
  • ASP:Panel控件(容器控件)

    千次阅读 2014-07-23 23:38:23
    Panel控件在页面内为其他控件提供了一个容器可以将多个控件放入一个Panel控件中,作为一个单元进行控制,如隐藏或显示这些控件;同时,也可以使用Panel控件为一组控件创建独特的外观。  Panel控件相当于一个储物...


        Panel控件在页面内为其他控件提供了一个容器,可以将多个控件放入一个Panel控件中,作为一个单元进行控制,如隐藏或显示这些控件;同时,也可以使用Panel控件为一组控件创建独特的外观。

        Panel控件相当于一个储物箱,在这个储物箱内可以防止各种物品(其他控件)。也就是说,可以将零散的物品放置在储物箱中,便于管理和控制。


    Panel控件的常用属性及说明

          属性

                              说明

     ID

       获取或设置分配给服务器控件的编程标识符

     Visible

       用于指示该控件是否可见

     HorizontalAlign 

       用于设置控件内容的水平对齐方式

     Enabled

       获取或设置一个值,该值指示是否已启用控件                                                                   

     ScrollBars

       可以控制Panel控件以何种方式使用滚动条

    [补充]:属性说明

    ►HorizontalAlign属性

        Panel控件的HorizontalAlign属性用于指定容器中内容的水平对齐方式。HorizontalAlign属性成员说明如下所示:

      成员名称

                            说明

      Center

       容器的内容居中

      Justify  

       容器的内容均匀展开,与左右边距对齐                                                                                

      Left

       容器的内容左对齐         

      NotSet

       未设置水平对齐方式

      Right

       容器的内容右对齐

     

     

    展开全文
  • ASP.NET-Panel容器控件

    千次阅读 2017-06-05 10:38:03
     Panel控件在页面为其他控件提供了一个容器可以将其他群空间放入一个Panel控件中,作为一个单元进行控制,如隐藏或显示这些控件:同时,也可以使用Panel控件为一组控件创建独特的外观。 2.属性 ID Visible ...

    1. 简介

     Panel控件在页面为其他控件提供了一个容器,可以将其他群空间放入一个Panel控件中,作为一个单元进行控制,如隐藏或显示这些控件:同时,也可以使用Panel控件为一组控件创建独特的外观。

    2.属性

    ID
    Visible
    HorizontalAlign                   用于设置控件内容的水平对齐方式
    center:容器的内容居中
    Justify::容器的内容均匀展开。与左右边距对齐
    Left:容器的内容左对齐
    NotSet:未设置水平对齐方式
    Right:容器的内容有对齐
    Enabled

    展开全文
  • 如何让用户控件成为容器控件

    千次阅读 2007-03-28 13:27:00
    从UserControl中继承下来一个用户...如何让其在ide中也能象其它容器控件,比如panel一样,可以将别的控件拖进去呢?方法如下:在工程中引用System.Design.dll [Designer("System.Windows.Forms.Design.ParentControl

    从UserControl中继承下来一个用户控件,但是在vs2005的ide中,别的控件拖不进这个控件中,只能通过程序动态将别的控件添加到这个控件中。如何让其在ide中也能象其它容器控件,比如panel一样,可以将别的控件拖进去呢?方法如下:

    在工程中引用System.Design.dll

    [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design")]
    public partial class UserControl1 : UserControl
    {
    public UserControl1()
    {
    InitializeComponent();
    }
    }

     
    展开全文
  • 简述 QStackedWidget提供了一个控件栈,在这个栈中,一次只能显示一个控件。 QStackedWidget可以提供与QTabWidget类似的用户接口。...其它接口与QTabWidget类似,参见Qt之容器控件(QTabWidget) 使用 效果 ...
  • QDockWidget类提供了一个小部件,它可以停靠在QMainWindow内,也可以作为桌面上的顶层窗口浮动。 功能详述 QDockWidget提供了铆接(停靠)控件的概念,也叫做工具窗口。铆接窗口是QMainWindow中心控件的辅助窗口,...
  • 容器控件JPanel的使用

    千次阅读 2017-04-02 23:29:25
    就是为其他的控件提供空间作为支撑,且可以在属性中设置其背景色     对于每一个 JPanel 都有一个布局选项 Layout,根面板 contentPane 的布局默认为 java.awt.BorderLayout     除了 ...
  • Qt之容器控件(QMdiArea)

    千次阅读 2020-03-22 14:08:59
    简述 QMdiArea(Multiple Document Interface Area)提供了一个可以同时显示多个文档窗口的...通常情况下,QMdiArea用作QMainWindow的中心控件,以此来创建一个MDI应用程序。但是,它也可以被放置在任何布局类中。...
  • QLabel对象作为一个占位符可以显示可编辑的文本或者图片,也可以放一个gif动画,还可以作为一个提示标记作为其他控件; 该标签可以放纯文本,链接或者富文本信息; 参考文章:PyQt5-QLabel控件使用 ...
  • 默认情况下,选项卡栏显示在页面区域上方,但是可以使用不同的配置(请参见TabPosition)。每个选项卡都与一个不同的窗口小部件(称为页面)相关联。页面区域中仅显示当前页面。其他所有页面均被隐藏。用户可以通过...
  • Anchor ----------------定义某个控件绑定到的容器的边缘,当控件锚定到某个边缘时,与指定边缘最接近的控件边缘与指定边缘之间的距离将保持不变。Dock -----------------------定义要绑定到容器控件边框Location-...
  • 1.开发环境 Qt版本:Qt 4.8.7 编译器:MinGw 系统:Windows 2.创建Qt4自定义控件 ...此时编译出来Release版本的自定义控件放进Designer目录下仅能在Designer中拖动,在使用该控件的工程中编译将会报错,所...
  • 就拿了别人的源码,增加些控件与功能,然后界面太规范,所以边学边改之,第一天弄WinForm界面。有必要记下免得忘了。 目标: 重点要解决的问题,如何让窗口在拖动的时候,某些控件是固定在某个角落。而某些...
  • 9. Cocos2d-x中基于布局的容器控件 1.1. ScrollView滚动视图 滚动视图是一种常见的容器型控件,它里面可以放置其他组件。Cocos2d-x中的ScrollView本身也是一种Layout,所以也可以在其中使用线形或者相对布局。...
  • 由于用户改变界面大小或者程序在不同分辨率...winform控件有两个属性Anchor、Dock可以设置容器内的控件的大小或位置适应容器的大小。当容器大小改变时,容器的子控件的大小随之变化。但是我们的子控件如果变的太小时,
  • 能成功地适应容器之间的差别将严重影响控件在某些容器内的应用,甚至导致控件完全无法在个别容器使用。 本文讨论使用Visual C++创建控件时如何适应容器相关的需求,特别是为大范围内使用而开发ActiveX控件时必须...
  • Android 在布局容器中动态添加控件

    千次阅读 2019-01-10 16:51:51
    这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理。 1、addView 添加控件到布局容器 2、removeView 在布局容器中删掉已有的控件 3、使用,来个小...
  • 创建适用于多种容器控件

    千次阅读 2007-01-04 11:24:00
    能成功地适应容器之间的差别将严重影响控件在某些容器内的应用,甚至导致控件完全无法在个别容器使用。 本文讨论使用Visual C++创建控件时如何适应容器相关的需求,特别是为大范围内使用而开发ActiveX控件时必须...
  • Python笔记之Tkinter(Frame控件容器)

    千次阅读 2019-04-30 23:40:23
    学习Tkinter制作窗体软件的基础,框架控件,作用:作为一种容器可以把其他空间放在frame上。 二、试验平台 windows7 , python3.7 三、直接上代码 import tkinter win = tkinter.Tk() win.title("Kahn ...
  • 可移动缩放控件容器

    千次阅读 2008-02-04 12:42:00
    一.设计时效果二.运行时效果三.主要功能1.选中后显示聚焦框,与缩放的8个焦点。2.鼠标移动到右侧,右下角,下方的指定区域时,显示...5.容器中的控件提供动态的加入(暂具备设计时加入后的响应功能),动态的删除。 
  • ActiveX控件和它的容器

    千次阅读 2010-07-16 14:21:00
    ActiveX控件和它的容器 <br /> 1.COM基础 <br /> 2.ActiveX控件及实现 <br /> 3.ActiveX控件容器及实现 <br /> 4.总结 <br /> 1.COM基础 <br /> COM是...
  • 因为特定的理由,ms的c#在使用无边框窗体作为子窗体的时候就会
  • 控件DevComponents.DotNetBar.Bar是可以有多种用途的,其中一种是用作容器,如下图的SQLServer管理器,就是一个容器容器里面存在两个页面“对象资源管理器详细信息”和“对象资源管理器“,这两个页面上又分别容纳...
  • Qt Creator有9种Containers Widgets,如图:  Containers Widgets的Qt类和名称介绍如下表: ... 控件控件名 中文名  QGroupBox GroupBox 组合框  QScrollArea ScrollArea 滚动区  QToolBox ToolBo...
  • 本人菜鸟一个 以前只知道WPF可以做到在父级容器中给内部空间添加附加事件,但因为未涉及相似案例,所以几乎是没有用过。最近做项目中遇到了在一个容器中有很多Button的需求,于是想起了附加事件来做这件事情。但由于...
  • 在学习新内容之前,我们先来弄清楚两个问题: 1 . 什么是ViewGroup? ViewGroup是一种容器。它包含零个或以上的View及子View。...ViewGroup内部可以用来存放多个View控件,并且根据自身的测量模式,来测量View子控件
  • Qt控件精讲四:容器

    万次阅读 2013-12-22 16:42:21
    2.控件介绍:框架控件用来存放其他控件,也可用于装饰,它一般用来作为更加复杂容器的基础。也可以用在form中作为占用控件。 3.控件属性设置选项: (1)name:同上 (2)framesShape:框架...
  • 前言:我最大的梦想,就是有一天,等老了坐在摇椅上回望一生,有故事给孩子们讲……。 相关文章: 《Android自定义控件三部曲文章索引》:...从效果图中可以看到,底部c...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,856
精华内容 23,142
关键字:

不可以作为容器的控件