动态布局_html 动态布局 - CSDN
精华内容
参与话题
  • 安卓动态布局

    2018-12-13 15:09:13
    自从学习安卓开发时一直都是用的是xml可视化布局,觉得十分...最近做项目需要从网络获取图片并且自己处理放大,就有点懵逼,想到动态布局实现却不知该怎么用(欲哭无泪,说白了还是技术太渣),所以写下这篇日志...

    转载请注明出处:https://blog.csdn.net/mr_leixiansheng/article/details/81061102

    自从学习安卓开发时一直都是用的是xml可视化布局,觉得十分方便直观,偶尔也会用到动态布局但却不是很熟悉究竟如何用。最近做项目需要从网络获取图片并且自己处理放大,就有点懵逼,想到动态布局实现却不知该怎么用(欲哭无泪,说白了还是技术太渣),所以写下这篇日志,警醒自己学无止境。希望正在和我一同进步的童鞋,一起茁长成长

    废话不多说了,内容如下:介绍多种实现动态布局的方法,以及如何用代码来调整View位置

    这里只介绍三种布局情况(注意不是方式)

    1、无xml : 一个父类布局包含一个子父类布局,子父类布局中包含ImageView

    2、无xml : 只有一个父类布局包含一个ImageView

    3、有xlm布局: 通过布局ID 来进行动态布局添加

    总结了下其实步骤如下:

    无xml布局:

    1、setContentView()之前new一个需要的布局layout,再将layout放入setContentView()

    2、new 出需要的控件设置好参数(id、text···)

    3、new LayoutParams 设置好控件的大小、位置属性(这里感觉和xml设置控件属性是一样的)

    4、最后将params和控件放入之前new的layout即可   

    有xml布局:

    1、setContentView()和以前一样放入layout.xml

    2、通过findViewById()找到要进行添加的布局控件

    之后的步骤和无xml布局的2、3、4一样

    代码如下:

    1、无xml : 一个父类布局包含一个子父类布局,子父类布局中包含ImageView

    RelativeLayout relativeLayout = new RelativeLayout(this);
    		setContentView(relativeLayout);
    
    		RelativeLayout rl = new RelativeLayout(this);
    		rl.setId(11);
    		ImageView imageView = new ImageView(this);
    		imageView.setId(1);
    		imageView.setImageResource(R.mipmap.ic_launcher);
    
    		RelativeLayout.LayoutParams lpRl = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
    				ViewGroup.LayoutParams.WRAP_CONTENT);
    		rl.setGravity(RelativeLayout.CENTER_IN_PARENT);		//设置imageView 在 rl中的位置为居中
    		rl.addView(imageView, lpRl);
    
    		RelativeLayout.LayoutParams lpParent = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
    				ViewGroup.LayoutParams.MATCH_PARENT);
    		relativeLayout.addView(rl,lpParent);

    2、无xml : 只有一个父类布局包含一个ImageView

    RelativeLayout relativeLayout = new RelativeLayout(this);
    		setContentView(relativeLayout);
    
    		ImageView imageView = new ImageView(this);
    		imageView.setId(2);
    		imageView.setImageResource(R.mipmap.ic_launcher);
    		//params 可以理解为 imageView的位置、大小参数集合
    		RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    		params.addRule(RelativeLayout.CENTER_IN_PARENT);
    		relativeLayout.addView(imageView,params);

    3、有xlm布局: 通过布局ID 来进行动态布局添加

    public class ThirdActivity extends AppCompatActivity {
    
    	private LinearLayout mLinearLayout;
    
    	@Override
    	protected void onCreate(@Nullable Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_third);
    
    		mLinearLayout = (LinearLayout) findViewById(R.id.linear_layout);
    		ImageView imageView = new ImageView(this);
    		imageView.setImageResource(R.mipmap.ic_launcher);
    		imageView.setId(31);
    		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    		params.setMargins(150, 80, 10, 0);
    		mLinearLayout.addView(imageView, params);
    	}
    }
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linear_layout"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </LinearLayout>

    是不是很简单啊,了解到原理后对以后一些需要动态变化的布局操作起来就十分的方便了

    补充一个 : 动态改变xml控件(width、height、padding...)

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/button"
            android:layout_centerInParent="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="点击我改变大小"/>
    </RelativeLayout>
    

     对要修改的控件进行setLayoutParams(params),注意:params 最好不好用 new 的方式,可能会出错

    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mButton.getLayoutParams();
    public class MainActivity extends AppCompatActivity{
    
    	private Button mButton;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		mButton = (Button) findViewById(R.id.button);
    
    		mButton.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mButton.getLayoutParams();
    				params.width = dip2px(MainActivity.this, dip2px(MainActivity.this, 300));
    				params.height = dip2px(MainActivity.this, dip2px(MainActivity.this, 100));
    				mButton.setLayoutParams(params);
    //				mButton.setPadding(300,0,0,0);
    			}
    		});
    	}
    
    	/**
    	 * dp转为px
    	 * @param context  上下文
    	 * @param dipValue dp值
    	 * @return
    	 */
    	public int dip2px(Context context, float dipValue)
    	{
    		Resources r = context.getResources();
    		return (int) TypedValue.applyDimension(
    				TypedValue.COMPLEX_UNIT_DIP, dipValue, r.getDisplayMetrics());
    	}
    }


     

    展开全文
  • 动态布局

    2017-04-29 15:26:58
    1#### PopuWindow 初始化   ... // 先加载窗口的布局  View layout = getLayoutInflater().inflate(R.layout.popu_layout,  null);  layout.findViewById(R.id.menu_01).setOnClickListen
    1####    PopuWindow
    初始化
        
        // 先加载窗口的布局
        View layout = getLayoutInflater().inflate(R.layout.popu_layout,
                        null);
        layout.findViewById(R.id.menu_01).setOnClickListener(this);
        layout.findViewById(R.id.menu_02).setOnClickListener(this);
        // 创建了弹出框
        window = new PopupWindow(layout, 200,
                        ViewGroup.LayoutParams.WRAP_CONTENT);
        // 配置弹出框的其他信息
        // 设置背景(能够响应返回键)
        window.setBackgroundDrawable(new ColorDrawable());
        // 设置获取焦点
        window.setFocusable(true);
        window.setOutsideTouchable(true);
    显示窗口

        window.showAsDropDown(btnShow, -100, 0);参考某个视图显示
        第二个第三个参数分别表示水平和垂直方向的偏移量

        //显示在一个容器中(相对的容器,位置,x方向的偏移,y方向的偏移)
        window.showAtLocation(parent, gravity, x, y)
    隐藏窗口

        window.dismiss();
    ####    PopuMenu

        //创建PopuMenu(第二个参数表示触发该弹出菜单的视图)
        PopupMenu pMenu = new PopupMenu(this, btnPopuMenu);
        //向popumenu中添加菜单
        pMenu.getMenuInflater().inflate(R.menu.main, pMenu.getMenu());
        //设置菜单项的点击监听
        pMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
                
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                //根据菜单项的id来区分菜单
                switch (item.getItemId()) {
                case R.id.action_settings:
                    Toast.makeText(PopuWindowActivity.this, item.getTitle(), 2000).show();
                        break;
                }
                return true;
            }
        });
        pMenu.show(); //显示菜单
    ####    动态布局
    1、加载到/创建了布局对象(ViewGroup及其子类对象)

        // 创建一个布局
        layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
    2、创建子视图(布局的孩子)

        // 创建按钮
        Button btn1 = new Button(this);
        //设置基本属性
    3、通过布局的LayoutParams参数配置子视图的布局效果(宽高边距)

        // 配置布局参数
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(200,
            LinearLayout.LayoutParams.WRAP_CONTENT);
        lp.leftMargin = 20;
    4、对子视图使用布局参数

        btn1.setLayoutParams(lp);
    5、添加子视图到布局中

        layout.addView(btn1);

    移除子视图

        //获取孩子的总个数
        int count = layout.getChildCount();
        //获取孩子的对象
        View child = layout.getChildAt(count-1);
        //移除子视图
        layout.removeView(child);
    移除全部孩子

        layout.removeAllView();
    ####    Activity生命周期
    运行前

        onCreate 创建完毕
        onStart    启动    <----------------onRestart--------|
        onResume 状态恢复  <--------------------       |      
                                              |       |
        运行(用户可以看到布局,可以操作界面元素)    |     |
        运行后                                     |     |    
                                              |       |
        onPause 暂停(失去焦点)----------------        |
        onStop 停止(整个界面都黑了不可见不可操作)--------
        onDestroy 销毁(释放资源)

    Activity常用方法

        setContentView 设置布局
        startActivity 启动新界面
        finish 结束当前界面
        findViewById从布局中找到控件
        getIntent()获取启动该Acitivity的Intent对象
        
    ####    Intent
    启动新界面,可以通过putExtras方法来携带数据

        Intent it = new Intent(this, Activity02.class);
        //携带数据(Bundle)
        it.putExtra("m_name", "张三");
        it.putExtra("age", 20);
        startActivity(it);
    目标界面,接收数据

        Intent intent = getIntent();
        String name = intent.getStringExtra("m_name");
        int a = intent.getIntExtra("age", 0);

    #####    startActivityForResult
    1、在启动触发界面使用startActivityForResult启动

        Intent it2 = new Intent(this,Activity02.class);
        it2.putExtra("m_name", "第二种跳转");
        //为了一个结果启动界面(第二个参数是一个requestCode,行为id)
        startActivityForResult(it2, 100);
    2、被启动界面可以getIntent得到被启动的Intent对象,处理内容,但是在结束之前需要通过setResult返回内容

        //返回数据给上一个界面(针对startActivityForResult)
        setResult(RESULT_OK);
        finish();

        携带数据回去:
        Intent it = new Intent();
        it.putExtra("result", "Activity02返回的内容");
        setResult(RESULT_OK, it);
        finish();

    3、在启动的触发界面重写onActivityResult来接收内容

       
     //针对startActivityForResult启动之后接收结果的方法
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(requestCode == 100){
                if(resultCode == RESULT_OK){
                    String result = "abc";
                    if (null != data) {
                        result = data.getStringExtra("result");
                    }
                    Toast.makeText(this, result, 2000).show();
                }else{
                    Toast.makeText(this, "收到:"+resultCode, 2000).show();
                }
                
            }
        }


    ####    Activity的启动方式
    查看栈结构的指令

        adb shell dumpsys activity > D:/log201704271746.txt
    搜索Running activities    

    通过在<activity标签上使用android:launchMode=""设置启动方式

    1、standard,默认值,没启动一次Activity就被创建一个实例,创建的实例加到同一个栈中,放在栈顶

    2、singleTop,如果当前的Activity已经在栈顶,则不会创建新实例,而是直接触发其onNewIntent方法

    3、singleTask,启动的新Activity会放到一个新的栈中,该值要结合android:taskAffinity="com.abc"来使用,并且taskAffinity的值必须跟应用包名不一样

    4、singleInstance,跟singleTask类似,新启动的Activity(如A)会放到新的栈中,区别就是新的栈中永远只有一个实例,如果新栈中的Activity(如A)启动了新的Activity(如B),这时B会放到原来的栈中


    在java中动态布局

    public class LayoutInJavaActivity extends Activity implements OnClickListener {
    	LinearLayout layout;
    
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.layout_in_java_activity);
    		layout = (LinearLayout) findViewById(R.id.m_layout);
    		// // 创建一个布局
    		// layout = new LinearLayout(this);
    		// layout.setOrientation(LinearLayout.VERTICAL);
    
    
    		for (int i = 0; i < 3; i++) {
    			// 创建按钮
    			Button btn1 = new Button(this);
    			btn1.setId(1000 + i);
    			btn1.setText("按钮" + i);
    			btn1.setTextSize(20);
    			btn1.setTextColor(0xffff0000);
    			// 配置布局参数
    			LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
    					LinearLayout.LayoutParams.WRAP_CONTENT,
    					LinearLayout.LayoutParams.WRAP_CONTENT);
    			lp.leftMargin = 20;
    			btn1.setLayoutParams(lp);
    			btn1.setOnClickListener(this);
    			// 向根节点中添加子视图
    			layout.addView(btn1, 0);
    		}
    
    
    		// setContentView(layout);
    	}
    
    
    	@Override
    	public void onClick(View v) {
    		switch (v.getId()) {
    		case 1000:
    			Toast.makeText(this, "按钮被点击", 2000).show();
    			// 获取孩子的总个数
    			int count = layout.getChildCount();
    			// 获取孩子的对象
    			View child = layout.getChildAt(count - 1);
    			// 移除子视图
    			layout.removeView(child);
    			break;
    		case 1001:
    			//获取布局参数
    			LinearLayout.LayoutParams lp = (LayoutParams) v.getLayoutParams();
    			//获取原来的左外边距
    			int old = lp.leftMargin;
    			//改变外边距
    			lp.leftMargin = old+10;
    			//修改布局参数
    			v.setLayoutParams(lp);
    			break;
    
    
    		default:
    			break;
    		}
    	}
    }


    界面之间的交互
    public class Activity01 extends Activity implements OnClickListener {
    
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    		setTitle("Acitivity01界面");
    		setContentView(R.layout.activity_01_layout);
    
    
    		Log.e("m_tag", "Activity01===onCreate");
    		findViewById(R.id.btn_just_start).setOnClickListener(this);
    		findViewById(R.id.btn_start_for_result).setOnClickListener(this);
    		findViewById(R.id.btn_start_self).setOnClickListener(this);
    	}
    
    
    	@Override
    	public void onClick(View v) {
    		switch (v.getId()) {
    		case R.id.btn_just_start:
    			Intent it = new Intent(this, Activity02.class);
    			// 携带数据(Bundle)
    			it.putExtra("m_name", "张三");
    			it.putExtra("age", 20);
    			startActivity(it);
    			break;
    		case R.id.btn_start_for_result:
    			Intent it2 = new Intent(this, Activity02.class);
    			it2.putExtra("m_name", "第二种跳转");
    			// 为了一个结果启动界面
    			startActivityForResult(it2, 100);
    			break;
    		case R.id.btn_start_self:
    			Intent it3 = new Intent(this,Activity01.class);
    			startActivity(it3);
    			break;
    
    
    		default:
    			break;
    		}
    	}
    
    
    	// 针对startActivityForResult启动之后接收结果的方法
    	@Override
    	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    		super.onActivityResult(requestCode, resultCode, data);
    		if (requestCode == 100) {
    			if (resultCode == RESULT_OK) {
    				String result = "abc";
    				if (null != data) {
    					result = data.getStringExtra("result");
    				}
    				Toast.makeText(this, result, 2000).show();
    			} else {
    				Toast.makeText(this, "收到:" + resultCode, 2000).show();
    			}
    


    		}
    	}
    	
    public class Activity02 extends Activity implements OnClickListener{
    	private TextView mTv;
    
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_02_layout);
    		mTv = (TextView) findViewById(R.id.tv_result);
    		
    		setTitle("这个是一个Acitivity02界面");
    		Log.e("m_tag", "Activity02==>===onCreate");
    		//获取启动该界面的Intent
    		Intent intent = getIntent();
    		String name = intent.getStringExtra("m_name"); //null
    		int a = intent.getIntExtra("age", 0);
    		mTv.setText(name+" | "+a);
    		findViewById(R.id.btn_finish).setOnClickListener(this);
    	}
    	
    	@Override
    	public void onClick(View v) {
    		switch (v.getId()) {
    		case R.id.btn_finish:
    			//返回数据给上一个界面(针对startActivityForResult)
    //			setResult(RESULT_OK);
    			Intent it = new Intent();
    			it.putExtra("result", "Activity02返回的内容");
    			setResult(RESULT_OK, it);
    			
    			finish();
    			break;
    		}
    	}


    展开全文
  • Qt中的动态布局(Dynamic Layout)

    万次阅读 2016-07-26 09:24:44
    Qt中的动态布局 Dynamic Layout 一、QGroupBox组合框中添加控件 二、动态布局

    Qt中的动态布局

    主要注意下面两点
    一、QGroupBox组合框中添加控件

    在QGroupBox组合框中加入控件,需要先把其它子控件使用布局结合在一起,
    然后再调用QGroupBox::setLayout()函数,添加该布局。
    即实现了把子控件添加到QGroupBox组合框中
    //QGroupBox::setLayout()

    二、动态布局

    在布局类中调用removeWidget(); //删除布局中的子控件,
    再在布局类中调用addWidget(); //添加子控件
    即可实现动态布局
    //mainLayout->removeWidget();
    //mainLayout->addWidget();


    下面给出代码示例

    //.h文件

    #include <QWidget>
    #include <QtGui>
    
    class MyWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit MyWidget(QWidget *parent = 0);
    
    private:
        //函数部分
        //创建第一部分界面:旋转控件组合框
        void createRotableGroupBox();
        //创建第二部分界面:方向组合框
        void createOptionsGroupBox();
        //创建第三部分界面:按钮组合框
        void createButtonBox();
    
        //控件部分
        //第一部分:QGroupBox控件
        QGroupBox *rotableGroupBox;
        QQueue<QWidget *> rotableWidgets;   //控件队列
    
        //第二部分:QGroupBox控件
        QGroupBox *optionsGroupBox;
        QLabel *buttonsOrientationLabel;
        QComboBox *buttonsOrientationComboBox;
    
        //第三部分:QDialogButtonBox控件
        QDialogButtonBox *buttonBox;
        QPushButton *closeButton;
        QPushButton *helpButton;
        QPushButton *rotateWidgetsButton;
    
        //布局
        //总体布局
        QGridLayout *mainLayout;
        //第一部分中的控件布局
        QGridLayout *rotableLayout;
        //第二部分中的控件布局
        QGridLayout *optionsLayout;
    
    signals:
    
    public slots:
        //QComboBox中index改变产生currentIndexChanged()信号对应的槽函数
        void buttonsOrientationChanged(int index);
        //构建rotableGroupBox组合框中的四个子控件的动态布局
        void rotateWidgets();
        void help();
    
    };

    //.cpp文件

    MyWidget::MyWidget(QWidget *parent) :
        QWidget(parent)
    {
        createRotableGroupBox();
        createOptionsGroupBox();
        createButtonBox();
    
        mainLayout = new QGridLayout;
        //主布局中添加3个组合框控件
        mainLayout->addWidget(rotableGroupBox, 0, 0);
        mainLayout->addWidget(optionsGroupBox, 1, 0);
        mainLayout->addWidget(buttonBox, 2, 0);
        setLayout(mainLayout);
    
        //布局的大小限制(Constraint)模式:设置最小大小
        mainLayout->setSizeConstraint(QLayout::SetMinimumSize);
    
        setWindowTitle(tr("Dynamic layouts"));
    }
    
    
    void MyWidget::createRotableGroupBox()
    {
        rotableGroupBox = new QGroupBox(tr("Rotable Widgets"));
    
        rotableWidgets.enqueue(new QSpinBox);   //微调器入队
        rotableWidgets.enqueue(new QSlider);    //滑块
        rotableWidgets.enqueue(new QDial);  //刻度盘
        rotableWidgets.enqueue(new QProgressBar);   //进度条
    
        //子控件个数
        int n = rotableWidgets.count();
    
        //四个控件首尾相连,关系形成一个环形,一个控件的数值改变随之后面的控件也改变
        for(int i=0; i<n; ++i)
        {
            connect(rotableWidgets[i], SIGNAL(valueChanged(int)),
                    rotableWidgets[(i+1)%n], SLOT(setValue(int)));
        }
    
        rotableLayout = new QGridLayout;
    
        //QGroupBox组合框控件,组合框控件中加入其它子控件,
        rotableGroupBox->setLayout(rotableLayout);
    
        //构建rotableGroupBox组合框中的四个子控件的动态布局
        rotateWidgets();
    }
    
    
    void MyWidget::rotateWidgets()
    {
        //断言
        Q_ASSERT(rotableWidgets.count()%2 == 0);
    
        //按顺序遍历容器中的对象,遍历队列中的控件
        foreach(QWidget *widget, rotableWidgets)
            rotableLayout->removeWidget(widget);    //删除布局中的子控件,动态布局
    
        //控件队列中的头部控件出队后,入队尾
        rotableWidgets.enqueue(rotableWidgets.dequeue());
    
        const int n = rotableWidgets.count();   //4
        for(int i=0; i<n/2; ++i)
        {
            //添加控件到布局类中,动态布局,交换控件显示的位置
            rotableLayout->addWidget(rotableWidgets[n-i-1], 0, i);  //3,(0,0)   2,(0,1)
            rotableLayout->addWidget(rotableWidgets[i], 1, i);  //0,(1,0)   1,(1,1)
        }
    }
    
    
    void MyWidget::createOptionsGroupBox()
    {
        optionsGroupBox = new QGroupBox(tr("Options"));
    
        buttonsOrientationLabel = new QLabel(tr("Orientation of buttons:"));
    
        buttonsOrientationComboBox = new QComboBox;
        buttonsOrientationComboBox->addItem(tr("Horizontal"), Qt::Horizontal);
        buttonsOrientationComboBox->addItem(tr("Vertical"), Qt::Vertical);
    
        //QComboBox中的索引值(index)改变的信号连接到槽函数
        connect(buttonsOrientationComboBox, SIGNAL(currentIndexChanged(int)),
                this, SLOT(buttonsOrientationChanged(int)));
    
        optionsLayout = new QGridLayout;
        optionsLayout->addWidget(buttonsOrientationLabel, 0, 0);
        optionsLayout->addWidget(buttonsOrientationComboBox, 0, 1);
        //设置第二列的延伸属性(strech factor)
        optionsLayout->setColumnStretch(2,1);
        optionsGroupBox->setLayout(optionsLayout);
    }
    
    
    void MyWidget::buttonsOrientationChanged(int index)
    {
        mainLayout->setSizeConstraint(QLayout::SetNoConstraint);
        setMinimumSize(0,0);
    
        //获取QComboBox中的方向信息
        Qt::Orientation orientation = Qt::Orientation(
                    buttonsOrientationComboBox->itemData(index).toInt());
    
        //判断方向是否改变
        if(orientation == buttonBox->orientation())
            return;
    
        //控制buttonBox的布局
        mainLayout->removeWidget(buttonBox);
    
        int spacing = mainLayout->spacing();
    
        QSize oldSizeHint = buttonBox->sizeHint() + QSize(spacing, spacing);
        //设置按钮框的布局方向
        buttonBox->setOrientation(orientation);
        QSize newSizeHint = buttonBox->sizeHint() + QSize(spacing, spacing);
    
        if(orientation == Qt::Horizontal)
        {
            mainLayout->addWidget(buttonBox, 2, 0);
            resize(size() + QSize(-oldSizeHint.width(), newSizeHint.height()));
        }
        else
        {
            mainLayout->addWidget(buttonBox, 0, 3, 2, 1);
            resize(size() + QSize(newSizeHint.width(), -oldSizeHint.height()));
        }
    
        mainLayout->setSizeConstraint(QLayout::SetDefaultConstraint);
    }
    
    
    void MyWidget::createButtonBox()
    {
        buttonBox = new QDialogButtonBox;
    
        closeButton = buttonBox->addButton(QDialogButtonBox::Close);
        helpButton = buttonBox->addButton(QDialogButtonBox::Help);
        rotateWidgetsButton = buttonBox->addButton(tr("Rotate &Widgets"),
                                                   QDialogButtonBox::ActionRole);
    
        connect(rotateWidgetsButton, SIGNAL(clicked()), this, SLOT(rotateWidgets()));
        connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
        connect(helpButton, SIGNAL(clicked()), this, SLOT(help()));
    }
    
    
    void MyWidget::help()
    {
        QMessageBox::information(this, tr("Dynamic Layouts Help"),
                                 tr("This example shows how the change layouts dynamically."));
    }
    

    实现效果如下图:
    这里写图片描述

    这里写图片描述


    代码来源于Qt官网,
    链接:http://doc.qt.io/qt-5/qtwidgets-layouts-dynamiclayouts-example.html

    展开全文
  • Android动态布局实现

    千次阅读 2017-10-11 18:02:11
    最近在开发项目时需要用到动态布局,在这里把动态布局实现方式给大家做一下分享,可能有些同学会问什么是动态布局动态布局比较适合用到应用的首页,可以灵活的展示各种海报,具体来说就是海报的大小,每页的布局都...

    最近在开发项目时需要用到动态布局,在这里把动态布局实现方式给大家做一下分享,可能有些同学会问什么是动态布局?动态布局比较适合用到应用的首页,可以灵活的展示各种海报,具体来说就是海报的大小,每页的布局都是随意修改的,具体实现方法:

    1. 服务端做好对应的布局映射后,把页面的信息通过Json形式存储到db

    2. 客户端需要展示时,去服务端请求布局信息,从缓存中拿到对应的Json数据

    3. 拿到数据后客户端使用addView方法,根据参数不断的添加每个view,其实只是逻辑稍微复杂些,实现起来并没什么大难度,生成view后再为每个view绑定点击事件就好了,下面分享一下后台的Json数据给大家参考

    {
        //theme_attribute主键
        "theme_id" : 25,
        //全局画布宽
        "global_width" : 10000,
        //全局画布宽
        "global_height" : 1080,
        画布Y坐标
        "coordinate_y" : 0,
        //画布X坐标
        "coordinate_x" : 0,
        //全局默认圆角,如果ta-广告位有圆角值,则使用广告位的圆角
        "global_fillet_degree" : 10,
        //布局方向 0:横向 1:竖向 默认 0
        "layout_direction" : 0,
        "menu_style" : {
            //theme_menu_sytle主键
            "menu_id" : 14,
            //菜单X坐标 单位:像素
            "menu_coordinate_x" : 100,
            //菜单Y坐标 单位:像素
            "menu_coordinate_y" : 140,
            //菜单间距 单位:像素
            "menu_gap" : 100,
            //菜单方向 0:横向 1:竖向 默认 0
            "menu_direction" : 0,
            //菜单字体大小
            "foot_size" : 14
        },
        //tab页布局和数据
        "tabs" : [{
                //theme_menu_dimension_business主键
                "beanid" : 61,
                //theme_tab_layout主键
                "tab_layout_id" : 20,
                //菜单图标
                "menu_icon" : "/img/icon.png",
                //菜单权重
                "menu_item_weight" : 100,
                //是否锁定首页  0:锁定 1:不锁定 默认 1
                "is_locked_homepage" : 0,
                //菜单栏目名称 如:首页、推荐、视频、应用
                "menu_item_name" : "游戏天地",
                //tab布局背景图
                "tab_background" : "/img/background.jpg",
                "advers" : [{
                        //theme_tab_adver_layout主键
                        "adver_layout_id" : 164,
                        //广告位X坐标 单位:像素
                        "coordinate_x" : 60,
                        //广告位Y坐标 单位:像素
                        "coordinate_y" : 260,
                        //广告位宽
                        "adver_width" : 340,
                        //广告位高
                        "adver_height" : 340,
                        //广告位圆角,单位:度数 默认为 0
                        "adver_fillet_degree" : 10,
                        //该广告位上发布的内容
                        "content" : [{
                                //theme_adver_content主键
                                "adver_content_id" : 1,
                                //一级标题
                                "first_title" : "一级标题",
                                //二级标题
                                "second_title" : "",
                                //标题对齐格式 0:左、1:中、2:右 默认 0
                                "align" : 0,
                                //海报图层一(底图)
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                //海报图层二
                                "poster_middle" : "/img/poster/middle.jpg",
                                //海报图层三
                                "poster_top" : "/img/poster/top.jpg",
                                //海报图层一(底图)MD5
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                //海报图层二MD5
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                //海报图层三MD5
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                //是否有焦点效果 0:有焦点 1:无焦点 默认 0
                                "is_focucs" : 1,
                                //是否显示标题 0:显示 1:不显示 默认 0
                                "is_show_title" : 0,
                                //打开内容类型 00:apk拉起 10:URL 20:纯图片 30:应用库中的应用(各业务自己实现 应用类型做了扩展 如31:表示电视商城应用 32:手机商城应用 33:易学应用 3x:其他40:易学业务 (41:课程(分类跳转)、42:剧集、43:专题、44:套餐包、45:书籍))
                                "open_content_type" : 41,
                                //打开内容 默认为空串
                                "open_content" :"见后面说明",
                                //状态 0:停用 1:启用 默认 1
                                "state" : 1
                                //选中放大比例 0.01 两位小数表示百分比
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }, {
                        "adver_layout_id" : 165,
                        "coordinate_x" : 60,
                        "coordinate_y" : 620,
                        "adver_width" : 340,
                        "adver_height" : 340,
                        "adver_fillet_degree" : 10,
                        "content" : [{
                                "adver_content_id" : 1,
                                "first_title" : "一级标题",
                                "second_title" : "",
                                "align" : 1,
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                "poster_middle" : "/img/poster/middle.jpg",
                                "poster_top" : "/img/poster/top.jpg",
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                "is_focucs" : 1,
                                "is_show_title" : 1,
                                "open_content_type" : 42,
                                "open_content" :"见后面说明",
                                "state" : 1
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }, {
                        "adver_layout_id" : 166,
                        "coordinate_x" : 420,
                        "coordinate_y" : 260,
                        "adver_width" : 700,
                        "adver_height" : 340,
                        "adver_fillet_degree" : 10,
                        "content" : [{
                                "adver_content_id" : 1,
                                "first_title" : "一级标题",
                                "second_title" : "",
                                "align" : 1,
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                "poster_middle" : "/img/poster/middle.jpg",
                                "poster_top" : "/img/poster/top.jpg",
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                "is_focucs" : 1,
                                "is_show_title" : 1,
                                "open_content_type" : 43,
                                "open_content" :"见后面说明",
                                "state" : 1
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }, {
                        "adver_layout_id" : 167,
                        "coordinate_x" : 420,
                        "coordinate_y" : 620,
                        "adver_width" : 340,
                        "adver_height" : 340,
                        "adver_fillet_degree" : 10,
                        "content" : [{
                                "adver_content_id" : 1,
                                "first_title" : "一级标题",
                                "second_title" : "",
                                "align" : 1,
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                "poster_middle" : "/img/poster/middle.jpg",
                                "poster_top" : "/img/poster/top.jpg",
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                "is_focucs" : 1,
                                "is_show_title" : 1,
                                "open_content_type" : 44,
                                "open_content" :"见后面说明",
                                "state" : 1
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }, {
                        "adver_layout_id" : 168,
                        "coordinate_x" : 780,
                        "coordinate_y" : 620,
                        "adver_width" : 340,
                        "adver_height" : 340,
                        "adver_fillet_degree" : 10,
                        "content" : [{
                                "adver_content_id" : 1,
                                "first_title" : "一级标题",
                                "second_title" : "",
                                "align" : 1,
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                "poster_middle" : "/img/poster/middle.jpg",
                                "poster_top" : "/img/poster/top.jpg",
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                "is_focucs" : 1,
                                "is_show_title" : 1,
                                "open_content_type" : 45,
                                "open_content" :"见后面说明",
                                "state" : 1
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }, {
                        "adver_layout_id" : 169,
                        "coordinate_x" : 1140,
                        "coordinate_y" : 260,
                        "adver_width" : 340,
                        "adver_height" : 340,
                        "adver_fillet_degree" : 10,
                        "content" : [{
                                "adver_content_id" : 1,
                                "first_title" : "一级标题",
                                "second_title" : "",
                                "align" : 1,
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                "poster_middle" : "/img/poster/middle.jpg",
                                "poster_top" : "/img/poster/top.jpg",
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                "is_focucs" : 1,
                                "is_show_title" : 1,
                                "open_content_type" : 43,
                                "open_content" :"见后面说明",
                                "state" : 1
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }, {
                        "adver_layout_id" : 170,
                        "coordinate_x" : 1500,
                        "coordinate_y" : 260,
                        "adver_width" : 340,
                        "adver_height" : 340,
                        "adver_fillet_degree" : 10,
                        "content" : [{
                                "adver_content_id" : 1,
                                "first_title" : "一级标题",
                                "second_title" : "",
                                "align" : 1,
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                "poster_middle" : "/img/poster/middle.jpg",
                                "poster_top" : "/img/poster/top.jpg",
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                "is_focucs" : 1,
                                "is_show_title" : 1,
                                "open_content_type" : 41,
                                "open_content" :"见后面说明",
                                "state" : 1
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }, {
                        "adver_layout_id" : 171,
                        "coordinate_x" : 1140,
                        "coordinate_y" : 620,
                        "adver_width" : 700,
                        "adver_height" : 340,
                        "adver_fillet_degree" : 10,
                        "content" : [{
                                "adver_content_id" : 1,
                                "first_title" : "一级标题",
                                "second_title" : "",
                                "align" : 1,
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                "poster_middle" : "/img/poster/middle.jpg",
                                "poster_top" : "/img/poster/top.jpg",
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                "is_focucs" : 1,
                                "is_show_title" : 1,
                                "open_content_type" : 41,
                                "open_content" :"见后面说明",
                                "state" : 1
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }, {
                        "adver_layout_id" : 172,
                        "coordinate_x" : 1860,
                        "coordinate_y" : 260,
                        "adver_width" : 340,
                        "adver_height" : 700,
                        "adver_fillet_degree" : 10,
                        "content" : [{
                                "adver_content_id" : 1,
                                "first_title" : "一级标题",
                                "second_title" : "",
                                "align" : 1,
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                "poster_middle" : "/img/poster/middle.jpg",
                                "poster_top" : "/img/poster/top.jpg",
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                "is_focucs" : 1,
                                "is_show_title" : 1,
                                "open_content_type" : 41,
                                "open_content" :"见后面说明",
                                "state" : 1
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }, {
                        "adver_layout_id" : 173,
                        "coordinate_x" : 2220,
                        "coordinate_y" : 260,
                        "adver_width" : 340,
                        "adver_height" : 340,
                        "adver_fillet_degree" : 10,
                        "content" : [{
                                "adver_content_id" : 1,
                                "first_title" : "一级标题",
                                "second_title" : "",
                                "align" : 1,
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                "poster_middle" : "/img/poster/middle.jpg",
                                "poster_top" : "/img/poster/top.jpg",
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                "is_focucs" : 1,
                                "is_show_title" : 1,
                                "open_content_type" : 41,
                                "open_content" :"见后面说明",
                                "state" : 1
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }, {
                        "adver_layout_id" : 174,
                        "coordinate_x" : 2220,
                        "coordinate_y" : 620,
                        "adver_width" : 340,
                        "adver_height" : 340,
                        "adver_fillet_degree" : 10,
                        "content" : [{
                                "adver_content_id" : 1,
                                "first_title" : "一级标题",
                                "second_title" : "",
                                "align" : 1,
                                "poster_bottom" : "/img/poster/bottmo.jpg",
                                "poster_middle" : "/img/poster/middle.jpg",
                                "poster_top" : "/img/poster/top.jpg",
                                "poster_bottom_md5" : "/img/poster/bottmo/71f262d796bed1ab30e8a2d5a8ddee6f",
                                "poster_middle_md5" : "/img/poster/middle/40eb6928d5b995a12c7e5b59bb335071",
                                "poster_top_md5" : "/img/poster/top/ b28354b543375bfa94dabaeda722927f",
                                "is_focucs" : 1,
                                "is_show_title" : 1,
                                "open_content_type" : 41,
                                "open_content" :"见后面说明",
                                "state" : 1
                                "enlarge_scale" : 0.02
                            }
                        ]
                    }
                ]
            }
        ]
    }


    展开全文
  • 动态进行布局

    2019-05-14 15:13:30
    QWidget *tab1 =new QWidget(); QVBoxLayout* pLayout = new QVBoxLayout();//水平布局 QHBoxLayout* pLayout1 = new QHBoxLayout();//水平布局 QHBoxLayout* pLayout2 = new QHBoxLayou...
  • 动态加载布局

    2016-01-15 12:34:51
    动态加载布局——只改变一个页面的部分布局的方法本文主要讲的是改变一个界面的某部分布局。其实很简单,首先在主布局里写一个空的layout做为父控件,在这父控件里先不要加入其它控件,然后写几个子布局,这里根据...
  • 动态添加布局

    2017-09-04 19:37:26
    最近在做项目的时候需要用到布局动态添加,下面就为大家讲解一下: 添加视图文件的时候有两种方式:1、通过在xml文件定义layout;2、java代码编写 1.构造xml文件2.LayoutInflater提到addview,首先要了解一下...
  • android动态布局

    2019-01-10 12:56:13
    android动态布局 不知道各位有没有碰到过这样的问题:在一个布局中添加多个子布局,每个子布 局有两种样式,比如正面一个样式,点击后,替换到背面又是另一种样式。且需 要使得这些子布局始终只有一个是保持背面的...
  • android:代码中动态添加子布局

    千次阅读 2016-04-10 10:02:05
    在应用中有时候需要通过某些点击效果动态地添加布局,而不是直接加载完整的xml布局文件,这时就可以在代码中实现。
  • 代码中动态设置相对布局里控件的位置,当设置过后,要清除之前位置的操作
  • 有些时候我们需要动态的设置-某些布局的位置,(也是代码适配)一:父布局是,线性布局:xml文件如下 android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizont
  • 有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法: 1、addView 添加View到布局容器 2、removeView 在布局容器中删掉已有的View 3、LayoutParams  设置View的大小位置   ...
  • Android使用addView动态添加组件

    万次阅读 2017-10-27 22:07:57
    在项目开发中,我们经常需要进行动态添加组件,其中可添加的部分有两项:布局和组件  其中,添加的布局主要有RelativeLayout型(相对布局)的和LinearLayout(线性布局)  添加的组件主要有文本显示框,编辑框,...
  • 在Android代码中实现动态布局

    千次阅读 2012-05-22 09:01:49
    不知道各位有没有碰到过这样的...最开始,我选择了用xml布局文件先拟好一个空的布局框架,然后再在代码中动态的添加不同信息,但是这样的话,涉及一个问题,我不停的在将内容(文字、图片)添加进去,那么我的内存消耗
  • android 动态实现表格布局

    千次阅读 2016-11-17 11:53:00
    公司最近的需求是在界面中添加一个表格,TabLayout 好久没用过了~赶紧上网找了下度娘!发现有很多帖子但是都不能满足我的需求.结合网上的自己在总结了一下(本文只限于个人学习).具体代码如下~~public class ...
  • android动态修改布局

    千次阅读 2018-02-01 09:10:20
    LinearLayout.LayoutParams linearParams =(LinearLayout.... //取控件textView当前的布局参数 linearParams.height = 20;// 控件的高强制设成20 linearParams.width = 30;// 控件的宽强制设成30
  • 1. 获取你要进行改变的控件的布局 LinearLayout.LayoutParams linearParams =(LinearLayout.LayoutParams) myView.getLayoutParams(); 2.设置布局的高度 后面的参数就是对应xml中的 42dp 可以根据需要进行改变...
  • Android动态创建布局常用方法

    千次阅读 2019-05-15 15:10:22
    项目中经常需要动态改变某个View的位置,或者自定义View时需要动态赋值等等,因此有一些基础操作需要熟练掌握,下面这个虽然很丑,但是基本上常用的一些动态操作的方法都已经涉及到了,先看下效果,然后对照代码看:...
  • addRule是动态布局设置属性的方法。有些情况下我们需要动态设置布局的属性,在不同的条件下设置不同的布局排列方式,这时候就需要用到LayoutParams.addRule() 方法
  • android 动态布局

    万次阅读 2011-06-17 11:02:00
    android的动态布局的其实我个人觉得不是很复杂,只是比写xml看上去没那么好理解而已,首先android动态布局最主要用的是一个addView()方法和一个LayoutParams类,只要掌握了这2个应该没多大问题了,我们先从addView()这...
1 2 3 4 5 ... 20
收藏数 221,527
精华内容 88,610
关键字:

动态布局