精华内容
下载资源
问答
  • setlayout作用
    2021-03-13 10:29:00

    大多数布局管理器都有无参数构造函数(也就是说,您可以使用新的FlowLayout()创建FlowLayout,使用新的GridLayout()创建GridLayout,使用新的GridBagLayout()创建GridBagLayout等).但是,BoxLayout要求您传递它将要管理的容器以及应该布置组件的轴.

    我的问题是:既然你已经告诉布局管理器要布局哪个组件,你为什么要写

    BoxLayout bl = new BoxLayout(myPanel, BoxLayout.Y_AXIS);

    myPanel.setLayout(bl);

    而不只是第一行?

    我快速查看了the BoxLayout source code并看到我使用的构造函数(第178-185行)没有调用target.setLayout(this)或任何类型的东西.看起来添加它真的很简单.有没有理由为什么它不包含在Swing库中?

    如果重要,我正在使用

    java version 1.7.0

    Java(TM) SE Runtime Environment (build 1.7.0-b147)

    在Win7Pro上.

    谢谢!

    SSCCE:

    import javax.swing.JFrame;

    import javax.swing.JPanel;

    import javax.swing.JButton;

    public class BoxLayoutSSCCE extends JFrame {

    // Change this to see what I mean

    public static final boolean CALL_SET_LAYOUT = true;

    public BoxLayoutSSCCE () {

    super("Box Layout SSCCE");

    JPanel panel = new JPanel();

    BoxLayout bl = new BoxLayout(panel, BoxLayout.Y_AXIS);

    if (CALL_SET_LAYOUT) {

    panel.setLayout(bl);

    }

    panel.add(new JButton("Button 1"));

    panel.add(new JButton("Button 2"));

    }

    public static void main (String[] args) {

    BoxLayoutSSCCE blsscce = new BoxLayoutSSCCE();

    blsscce.pack();

    blsscce.setVisible(true);

    }

    }

    更多相关内容
  • Qt之布局设置setLayout详解(上)

    千次阅读 2022-03-16 17:02:16
    效果图1: 1.1 Qt助手中setLayout方法介绍 图2: 从上图2中,我们看到Qt文档对于setLayout方法的解说,具体作用就是给某个部件设置布局管理器。 1.11 文档中需要注意的两点 如果当前部件已经设置过布局,当你再次...

    一、简述

    大家好,我是前行中的小猪,今天给大家讲解的是布局的相关用法分析以及如何对控件进行重布局,先从助手文档带大家了解一下用法,然后再通过类似视频监控分屏切换的示例给大家简单分析一下,在一个控件中通过菜单切换实现不同的布局。

    一般视频监控这种场景会连接多颗摄像头去进行监控,这个时候就需要多屏操作,一般情况会连接多个显示器,但是奈何像学校,商场,小区需要几十上百个摄像头进行对整片区域的监控,这不是靠几个屏幕能看的过来的,这个时候就需要进行分区显示,比如一个屏幕显示单个、4个、6个、9个、16个、21个、32等等,无疑是希望在几块屏幕上能够看到更多区域的视频,同时可以进行切换,方便管理。

    我们先看一下效果。

    效果图1:

    在这里插入图片描述


    1.1 Qt助手中setLayout方法介绍

    图2:

    在这里插入图片描述
    从上图2中,我们看到Qt文档对于setLayout方法的解说,具体作用就是给某个部件设置布局管理器。


    1.11 文档中需要注意的两点

    1. 如果当前部件已经设置过布局,当你再次对此部件设置新的布局是不会生效的,你必须先删除之前已经设置的布局,新布局才会生效。
    2. 如果当前布局已经设置给了控件A,那么控件B对此布局再调用setLayout方法,将会把控件A的布局重新设置给控件B。

    我们先来看看第一点,结合下方的测试代码,如果widget已经设置了hLayout1布局,如果再设置hLayout2布局,最终结果是hLayout1生效hLayout2不生效,并且运行到这段代码的时候编译器会有错误提示,告诉你当前部件已经配置一个布局了,人家这是一夫一妻制,多了就不合法了。

    QWidget* widget = new QWidget;
    
    QHBoxLayout* hLayout1 = new QHBoxLayout;
    widget->setLayout(hLayout1);
    
    QHBoxLayout* hLayout2 = new QHBoxLayout;
    widget->setLayout(hLayout2);
    

    QWidget::setLayout: Attempting to set QLayout “” on QWidget “”, which already has a layout

    ====================================================
    我们再来看看第二点,继续结合下方的测试代码,大家快速过一遍,然后翻到下方的效果图。

    m_contentLabel = new QLabel("我是测试控件");
    m_contentLabel->setAlignment(Qt::AlignCenter);
    
    m_leftWgt = new QWidget;
    m_leftWgt->setStyleSheet(".QWidget{background:red;}");
    
    QHBoxLayout* hLayout = new QHBoxLayout(m_leftWgt);
    hLayout->addWidget(m_contentLabel);
    hLayout->setMargin(0);
    
    m_rightWgt = new QWidget;
    m_rightWgt->setStyleSheet(".QWidget{background:yellow;}");
    
    m_pBtnSwitch = new QToolButton;
    m_pBtnSwitch->setText("切换布局");
    
    QGridLayout* gLayout = new QGridLayout(this);
    gLayout->addWidget(m_leftWgt, 0, 0);
    gLayout->addWidget(m_rightWgt, 0, 1);
    gLayout->addWidget(m_pBtnSwitch, 1, 0);
    
    connect(m_pBtnSwitch, &QToolButton::clicked, this, [=] {
    	QLayout* layout = m_leftWgt->layout();
    	m_rightWgt->setLayout(layout);
    });
    

    上方的代码中,我们定义了左右两个widget,我们将布局先设置给了左边的widget,在按钮的槽函数中我们将此布局再传递给右边的控件,从下方的效果图中我们看到布局(及布局上添加的部件)是可以成功地从控件A转移到控件B上,但前提是控件B没有设置过布局

    这就好比,控件A在生活中对布局对象不好,那行吧,两个人过不下去,那就离吧,然后布局遇到了控件B,觉得控件B人不错,就决定嫁给控件B,但是要想合法,那么控件B不能存在婚姻关系(也就是说控件B没有设置过布局),所以布局对象就可以名正言顺地带着他所拥有的一切转移给控件B,不知道这个比喻大家还能理解O(∩_∩)O。

    效果图3:

    在这里插入图片描述


    1.12 给部件设置布局的两种方式:

    方式一:主动式

    给部件对象直接调用setLayout方法指定布局(文档中给出了示例)

    QWidget* parentWidget = new QWidget;
    
    QPushButton* pBtn = new QPushButton;
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(QPushButton);
    parentWidget->setLayout(layout);
    

    方式二:被动式

    直接将需要设置布局的控件对象放到布局对象的构造中(文档中最后一句话给了提示,通常我也喜欢用这种方式,毕竟省了一行代码O(∩_∩)O)

    QWidget* parentWidget = new QWidget;
    
    QPushButton* pBtn = new QPushButton;
    QVBoxLayout *layout = new QVBoxLayout(parentWidget);
    layout->addWidget(QPushButton);
    

    1.13 - - 问题来了- -

    如果我们给控件设置了布局,那如何清空某个控件的布局呢?

    方法一:

    既然我们可以使用setLayout方法设置布局,能不能用它清空布局呢,我们来传个空指针可以不?

    答案是不可以,这里假设m_leftWgt已经设置过布局,这里我们给他传个空指针,调用完之后,实际上之前的布局依然存在,并且编译器再次给出提示 QWidget::setLayout: Cannot set layout to 0,就是你不能给他传个空指针。

    m_leftWgt->setLayout(nullptr);
    QLayout* layout = m_leftWgt->layout();
    if (layout != nullptr){
    	int count = layout->count();
    	qDebug() << count;
    	qDebug() << "布局仍然存在";
    }
    else{
    	qDebug() << "布局已经删除";
    }
    
    // 结果: 布局仍然存在
    

    QWidget::setLayout: Cannot set layout to 0


    方法二:

    这里我们假设m_leftWgt已经设置过布局。
    这种方法就强势一点,直接获取当前控件的布局对象,然后直接删除为了严谨一点,这里还是要判断下指针是否为空),通过测试,这种方法是可以成功的。

    QLayout* layout = m_leftWgt->layout();
    if (layout != nullptr)
    	delete layout;
    
    layout = m_leftWgt->layout();
    if (layout != nullptr){
    	int count = layout->count();
    	qDebug() << count;
    	qDebug() << "布局仍然存在";
    }
    else{
    	qDebug() << "布局已经删除";
    }
    
    // 结果: 布局已经删除
    

    通过这种方法,布局虽然删除了,但是布局上的添加的子控件依然认为m_leftWgt控件为父控件,也就是我们给布局添加的子控件依然依附于m_leftWgt控件,那么怎么完全删除布局及布局上所添加的所有子控件呢?具体解决方案将在下一篇博文中再详细讲解。

    效果图4:

    在这里插入图片描述


    二、尾

    本篇文章详细讲解了setLayout的一些相关用法,通过助手中给出的文档说明,带着大家进行了一些拓展分析,下篇文章将继续带着大家分析遗留的问题以及给大家带来视频监控分屏切换的示例代码,欢迎一起交流讨论,如果对文章中提及的点有疑问或者发现有错误的地方欢迎指出,也十分欢迎感兴趣的小伙伴一起交流。


    Qt训练营快要开营了,欢迎大家加入,有兴趣的小伙伴可以加群 861353824 了解详情。


    内容分享整理不易,喜欢的小伙伴帮忙点个赞和收藏,谢谢!

    展开全文
  • 大家好,我是前行中的小猪,今天呢给大家继续上一篇Qt之布局设置setLayout详解(上)之后的内容,再给大家进行一下拓展。 1.1 setLayout源码剖析 上篇我们说到如何清空部件上的布局(不记得的小伙伴回到上篇回顾一下...

    一、简述

    大家好,我是前行中的小猪,今天呢给大家继续上一篇Qt之布局设置setLayout详解(上)之后的内容,再给大家进行一下拓展。

    1.1 setLayout源码剖析

    上篇我们说到如何清空部件上的布局(不记得的小伙伴回到上篇回顾一下),一开始我们还是想使用setLayout方法,传递一个空指针,来将当前控件的布局清空,谁知人家不让你设置空指针,我们不如呢直接来看下源码中对于setLayout方法到底是做了什么操作。

    下图中针对setLayout方法,每小段代码给出了说明,大家可以看着图中的代码及说明,遇到问题呀还是得看他源码中怎么实现的,这不给出了答案,其中的规则及操作尽收眼底。

    对于setLayout方法,简单来说注意以下几点:

    1、参数不能传递空指针
    2、不能重复设置布局(要先删除,再设置)
    3、布局可以从控件A转移到控件B(前提控件B没有设置过布局)
    4、内嵌的布局(布局A被布局B包含,A就是内嵌在B中)不能被转移

    效果图1:

    在这里插入图片描述


    到这里我们对帮助文档中给出的说明文档是不是有了更好的理解(如果没有那就把这两篇文章再看几遍O(∩_∩)O~),所以我建议大家遇到问题,第一先看帮助文档中对接口提供的描述(Qt的文档还是做得很好的),第二再去扒一下源码,看看源码里面到底做了什么,可以很好地方便我们去理解,也容易去避免一些坑。

    图2:

    在这里插入图片描述


    1.2 控件如何清空之前设置的布局及布局中的控件

    上篇文章中我们提到怎么去删除当前控件A上的布局,获取到布局对象,然后进行delete操作,将其删除。

    QLayout* layout = m_leftWgt->layout();
    if (layout != nullptr)
    	delete layout;
    

    但是仍然遗留一个问题,就是布局上的子控件依然存在于控件A上。那怎么能够完完全全清空一个控件上所有的布局以及子控件呢?

    我们先看下QLayout::addWidget方法的源码,先是调用了addChildWidget(访问权限:protected),然后创建一个QLayoutItem对象来绑定添加进来的的控件控件A, 然后再调用addItem(纯虚函数,根据不同类型布局的,具体操作不同),将新创建的LayoutItem对象添加到布局中。

    图3:

    在这里插入图片描述

    我们再来看下addChildWidget方法中做了什么操作,看到红框圈起来的几个部分代码,实际上就是将添加的childWidget控件作为布局绑定的parentWidget控件的子控件。

    图4:

    在这里插入图片描述

    直白点就是其实添加到布局中的子控件跟布局本身没有关系,两者之间是需要通过QLayoutItem对象来进行绑定,具体怎么布局就看不同类型的Layout中对addItem是怎么实现的,然后再指定添加的childWidget控件与parentWidget控件的父子关系,所以我们删除了parentWidget控件的布局,但是childWidget控件还是显示在parentWidget控件上,因为父子关系还在,那问题就简单了,解除父子关系即可。

    下方代码中我们获取到当前对象的布局,然后获取当前布局中所有的QLayoutItem对象,可以通过此对象的widget方法获取到子控件对象,然后将子对象的父子关系解除即可< setParent(nullptr) >。

    	QLayout* layout = this->layout();
    	if (layout != nullptr){
    		QLayoutItem *childItem;
    		while ((childItem = layout->takeAt(0)) != 0) {
    			QWidget* itemWidget = childItem->widget();
    			// 这里需要判断是否为空,因为layoutItem还可分为spaceItem和widgetItem,同时布局本身也是个layoutItem;
    			// 同时布局中不一定都是widgetItem,可能是个嵌入的布局item,可能是个spaceItem;
    			if (itemWidget != nullptr) {
    				// 这里可以理解为将布局中的子控件脱离父控件;
    				itemWidget->setParent(nullptr);
    			}
    			delete childItem;
    		}
    
    		delete layout;
    	}
    

    1.3 关于removeItem 和 removeWidget 方法

    我们从图5和图6中看到,实际上两者所达到的效果一致,都只是解除子控件和布局之间的关联者QLayoutItem,但是两者不同的是,removeItem并没有自动删除item,需要手动删除,而removeWidget 方法中主动删除了widget对应的layoutItem。这个需要大家多加注意。

    图5:

    在这里插入图片描述

    图6:

    在这里插入图片描述


    二、代码之路

    下面就是通过菜单切换不同分屏的示例代码,有需要的小伙伴可以瞅瞅。

    效果图:

    在这里插入图片描述

    VideoSwitchWidget.h

    
    #include <QtWidgets/QWidget>
    #include <QLabel>
    #include <QMenu>
    
    // 视频分屏类型;
    enum VideoLayoutType
    {
    	OneVideo_Type = 0,
    	FourVideo_Type,
    	SixVideo_Type,
    	NineVideo_Type,
    };
    
    class VideoSwitchWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        VideoSwitchWidget(QWidget *parent = Q_NULLPTR);
    
    private:
    	void initWidget();
    	void initMenu();
    
    	// 菜单事件;
    	void contextMenuEvent(QContextMenuEvent* event);
    
    private:
    	// 切换不同布局;
    	void switchLayout(VideoLayoutType type);
    
    private:
    	// 保存视频区域;
    	QList<QLabel*> m_videoLabelList;
    	QMenu* m_switchMenu;
    };
    

    VideoSwitchWidget.cpp

    #include "VideoSwitchWidget.h"
    #include <QGridLayout>
    #include <QContextMenuEvent>
    #include <QDebug>
    
    #pragma execution_character_set("utf-8")
    
    VideoSwitchWidget::VideoSwitchWidget(QWidget *parent)
        : QWidget(parent)
    {
    	initWidget();
    	this->resize(QSize(800, 500));
    	this->setContextMenuPolicy(Qt::DefaultContextMenu);
    }
    
    void VideoSwitchWidget::initWidget()
    {
    	initMenu();
    
    	for (int i = 0; i < 9; i ++)
    	{
    		QLabel* label = new QLabel;
    		label->setAlignment(Qt::AlignCenter);
    		label->setText(QString("未加载视频%1").arg(i + 1));
    		label->setStyleSheet("QLabel{background:white;font-size:30px;color:gray;font-weight:bold;border:1px solid gray;}");
    		m_videoLabelList.append(label);
    	}
    
    	switchLayout(VideoLayoutType::OneVideo_Type);
    }
    
    void VideoSwitchWidget::initMenu()
    {
    	m_switchMenu = new QMenu(this);
    	m_switchMenu->addAction("一分屏");
    	m_switchMenu->addAction("四分屏");
    	m_switchMenu->addAction("六分屏");
    	m_switchMenu->addAction("九分屏");
    
    	QMap<QString, int> strTypeMap;
    	strTypeMap["一分屏"] = VideoLayoutType::OneVideo_Type;
    	strTypeMap["四分屏"] = VideoLayoutType::FourVideo_Type;
    	strTypeMap["六分屏"] = VideoLayoutType::SixVideo_Type;
    	strTypeMap["九分屏"] = VideoLayoutType::NineVideo_Type;
    
    	connect(m_switchMenu, &QMenu::triggered, this, [=](QAction *action) {
    		QString strText = action->text();
    		VideoLayoutType type = VideoLayoutType(strTypeMap[strText]);
    		switchLayout(type);
    	});
    }
    
    void VideoSwitchWidget::contextMenuEvent(QContextMenuEvent* event)
    {
    	m_switchMenu->exec(QCursor::pos());
    }
    
    void VideoSwitchWidget::switchLayout(VideoLayoutType type)
    {
    	QLayout* layout = this->layout();
    	if (layout != nullptr)
    	{
    		// 这一步操作可以理解为直接layout就直接删除所有的item;
    		for (int i = 0; i < layout->count(); i++)
    		{
    			QLayoutItem* layoutItem = layout->itemAt(i);
    			// 如果后面直接删除布局,这句可省略;
    			layout->removeItem(layoutItem);
    
    			// 这里可以理解为将布局中的控件脱离父控件;
    			QWidget* itemWidget = layoutItem->widget();
    			// 这里需要判断是否为空,因为layoutItem还可分为spaceItem和widgetItem,同时布局本身也是个layoutItem;
    			// 同时布局中不一定都是widgetItem,可能是个嵌入的布局item,可能是个spaceItem;
    			if (itemWidget != nullptr)
    			{
    				itemWidget->setParent(nullptr);
    			}
    		}
    
    		delete layout;
    	}
    
    	switch (type)
    	{
    	case OneVideo_Type:
    	{
    		QGridLayout* gLayout = new QGridLayout(this);
    		gLayout->addWidget(m_videoLabelList[0]);
    		gLayout->setMargin(0);
    	}
    	break;
    	case FourVideo_Type:
    	{
    		QGridLayout* gLayout = new QGridLayout(this);
    		gLayout->setSpacing(0);
    		gLayout->setMargin(0);
    
    		for (int i = 0; i < 4; i++)
    		{
    			gLayout->addWidget(m_videoLabelList[i], i / 2, i % 2);
    		}
    	}
    	break;
    	case SixVideo_Type:
    	{
    		QGridLayout* gLayout = new QGridLayout(this);
    		gLayout->addWidget(m_videoLabelList[0], 0, 0, 2, 2);
    		gLayout->addWidget(m_videoLabelList[1], 0, 2);
    		gLayout->addWidget(m_videoLabelList[2], 1, 2);
    		gLayout->addWidget(m_videoLabelList[3], 2, 0);
    		gLayout->addWidget(m_videoLabelList[4], 2, 1);
    		gLayout->addWidget(m_videoLabelList[5], 2, 2);
    		gLayout->setSpacing(0);
    		gLayout->setMargin(0);
    	}
    	break;
    	case NineVideo_Type:
    	{
    		QGridLayout* gLayout = new QGridLayout(this);
    		gLayout->setSpacing(0);
    		gLayout->setMargin(0);
    
    		for (int i = 0; i < 9; i++)
    		{
    			gLayout->addWidget(m_videoLabelList[i], i / 3, i % 3);
    		}
    	}
    		break;
     	default:
    		break;
    	}
    }
    

    三、尾

    本篇文章继上篇文章通过源码的分析继续讲解了setLayout的一些相关用法及注意要点,这次通过实际源码,又带着大家进行了拓展分析,其实我们在解决问题的时候,Qt的帮助文档和源码可以拿来看一看,说不定解决方案就在这文档提及的一段话或者源码中一丝逻辑,都会有很大的帮助,通过写这两篇文章,我也再次对布局的用法上有了新的认识,后面还会再抽时间对布局系统的进行整理。如果对文章中提及的点有疑问或者发现有错误的地方欢迎指出,也十分欢迎感兴趣的小伙伴一起交流。

    Qt训练营快要开营了,欢迎大家加入,有兴趣的小伙伴可以加群 861353824 了解详情。

    内容分享整理不易,喜欢的小伙伴帮忙点个赞和收藏,谢谢!

    展开全文
  • setLayout) 代码如下: //ui->setupUi(this); tool=new QToolButton; tool->setText("工具按钮"); pt = new QPushButton("普通按钮"); RB1 = new QRadioButton("单选按钮1"); RB2 = new QRadioButton("单选按钮2...

    二、布局类

    从上到下依次为

    垂直布局(Vertical Layout )头文件 (QVBoxLayout)        

            将控件垂直分布的方式布局,具体实现为以下步骤:

            1、new出一个垂直布局管理器;

            2、将需要布局的控件,放入垂直布局管理器;

            3、将垂直布局管理器的指针传入基类;(setLayout)

    代码如下:

        //ui->setupUi(this);
        tool=new QToolButton;
        tool->setText("工具按钮");
        pt = new QPushButton("普通按钮");
        RB1 = new QRadioButton("单选按钮1");
        RB2 = new QRadioButton("单选按钮2");
        CB1 = new QCheckBox("多选按钮2");
        CB2 = new QCheckBox("多选按钮1");
        CLB = new QCommandLinkButton("转到");
        CLB->setDescription("www.baidu.com");
    
        QVBoxLayout *vbox = new QVBoxLayout;
        vbox->addWidget(tool);
        vbox->addWidget(pt);
        vbox->addWidget(CB1);
        vbox->addWidget(CB2);
        vbox->addWidget(RB1);
        vbox->addWidget(RB2);
        vbox->addWidget(CLB);
    
        setLayout(vbox);
    
    

    (按钮类功能实现详见(4条消息) QT基本空间详解及实例1(按钮类)_羊百万~的博客-CSDN博客

    水平布局(Horizontal Layout)头文件 (QHBoxLayout)    

            将控件水平分布的方式布局,具体实现为以下步骤(类似于垂直布局):

            1、new出一个水平布局管理器;

            2、将需要布局的控件,放入水平布局管理器;

            3、将水平布局管理器的指针传入基类;(setLayout)

    代码如下:     

     tool=new QToolButton;
        tool->setText("工具按钮");
        pt = new QPushButton("普通按钮");
        RB1 = new QRadioButton("单选按钮1");
        RB2 = new QRadioButton("单选按钮2");
        CB1 = new QCheckBox("多选按钮2");
        CB2 = new QCheckBox("多选按钮1");
        CLB = new QCommandLinkButton("转到");
        CLB->setDescription("www.baidu.com");
    
        QHBoxLayout *hbox = new QHBoxLayout;
        hbox->addWidget(tool);
        hbox->addWidget(pt);
        hbox->addWidget(CB1);
        hbox->addWidget(CB2);
        hbox->addWidget(RB1);
        hbox->addWidget(RB2);
        hbox->addWidget(CLB);
    
        setLayout(hbox);

    网格布局(Grid Layout)头文件 (QHBoxLayout)

             将控件网格分布的方式布局,具体实现为以下步骤:

            1、new出一个网格布局管理器;

            2、将需要布局的控件,设置横、纵坐标、长度、宽度后,放入网格布局管理器中;

            3、将网格布局管理器的指针传入基类;(setLayout)

    代码如下:

    QGridLayout *vbox = new QGridLayout;
        vbox -> addWidget(le,1,1,1,2);
        vbox -> addWidget(bt,0,0);
        setLayout(vbox);

    可以得到如下:

     

    详解:addWidget函数(第二、三参数必要,第三、四参数默认为1)

    le:具体空间按钮的对象;

    0(从左往右):网格布局的横坐标为1;

    0:网格布局的纵坐标为1;

    1(默认参数为1):控件高度为1;

    2(默认参数为1):控件长度为2;

    注意:如果在不输入第三四个参数的情况下,控件大小默认为1*1大小(如bt控件传参);

    ***混合布局        头文件 (QHBoxLayout)(QVBoxLayout)

            使用水平布局和垂直布局共同布局的布局方式被称为混合布局,具体实现步骤:

            1、new出一个水平布局管理器和一个垂直布局管理器;

            2、首先将需要水平布局控件绑定至水平布局管理器;

            3、将水平布局管理器的指针传回垂直布局管理器;(setLayout)

            4、将需要垂直布局控件绑定至垂直布局管理器;

            3、将垂直布局管理器的指针传入基类;(setLayout)

    代码实现如下:

    QVBoxLayout *vbox = new QVBoxLayout;
        QHBoxLayout *hbox = new QHBoxLayout;
        hbox -> addWidget(bt1);
        hbox -> addWidget(bt);
        vbox -> addWidget(le);
        vbox -> addLayout(hbox);
        this -> setLayout(vbox);

    可以得到如下:

    后续有遗漏再补充~,走过路过点个赞,小徐小徐,一条咸鱼。

    展开全文
  • QMainWindow setLayout无效

    2017-12-08 10:37:37
    QWidget::setLayout: Attempting to set QLayout “” on MainWindow “”, which already has a layout这句话的意思是说,你已经给MainWindow设置过一个布局了,再设置一个会出错。 该如何给QMainWindow正确地...
  • qt布局 setlayout无效

    千次阅读 2018-12-25 10:06:07
    操作步骤:qt生产带ui的界面文件中使用setlayout无效 原因分析:ui文件默认带有layout,需要删除之后再设置setlayout才可用 删除方法可参考如下:(qt帮助手册有) void clearLayout(QLayout* layout) {  ...
  • //必须将f.pach()去掉,否则setSize功能将没有作用 f.setSize(400,220); f.setVisible(true); f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } ...
  • QT中setLayout无效的问题

    千次阅读 2020-08-26 20:00:42
    当我们自己创建了一个Layout对象以后,使用QWidget的setLayout方法,将这个Layout对象应用到窗口中的时候,发现窗口上没有我们添加的控件。 比如,QMainWindow就是一个例子,还有QToolBar也是这样,还有其他的QT...
  • C++编程之自定义日志类 ——log4cpp使用详解

    千次阅读 多人点赞 2019-06-23 21:29:29
    定义一个appender类对象,确定日志输出到什么地方,然后把layout对象用setlayout方法绑定一下。 定义一个catergory对象,与appender类对象绑定 调用catergory对象进行写日志 简单示例 #include < ...
  • 我创建了一个JFrame类,并通过设置setLayout(null)演示了其在按钮上的工作。然后,我创建了一个扩展JPanel的类,并在其中添加了一些组件。这些组件的界限是在方法内部设置的。此类的对象包含在扩展JFrame的类中。...
  • setLayout()和GridData的设置

    千次阅读 2018-06-19 10:56:52
    (1)setLayout()是设置界面布局,如界面有几行几列 如jf.setLayout(new GridLayout(2,1));//容器共有2行1列。 GridLayout layout = new GridLayout(); layout.numColumns = 4; // 设置容器的列数 layout....
  • JAVA做个小窗口时候为什么用SetLayout(null)时候窗口里什么东西都不显示?本人刚刚学习JAVA,所以按照教科书在myeclipse7.5 上照打了这个例子,但是发现当SetLayout(null)时候,弹出的窗口一片空白什么都没有。各位...
  • Frame默认自带BorderLayout 用 frame.setLayout(null); 可以去除 然后可以 setBounds(x, y, w, h);setLocation(x, y); setSize(w, h); import java.awt.*; import java.awt.event.WindowAdapter; import java.awt...
  • setlayout(null)后才能启作用。 官方解读地址: Doing Without a Layout Manager ( Absolute Positioning )绝对定位 http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html 1、...
  • setLayout(new FlowLayout()); add(tf1); add(label1); add(tf2); add(b1); add(tf3); pack(); setVisible(true); } } class MyMonitor implements ActionListener { TextField tf1,tf2,tf3; MyMonitor(TextField ...
  • frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); System.out.println("Frame size = " + frame.getSize()); } }); }...
  •  其实也很好理解:一定要放在setLayout的后面,否则还没有真正显示,又怎么能设置焦点呢? 另外还有: this->activateWindow(); pass1_edit->setFocusPolicy(Qt::StrongFocus); 在需要的时候,也要设置 ...
  • public void start_Gui() {JFrame window = new JFrame("Client Program");window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);JPanel panel = new JPanel();window.setContentPane...panel.setLayout(ne...
  • cont.setLayout(null); panel=new JPanel(); panel.setBackground(Color.BLUE); panel.setBounds(10, 100, 400, 400); //第一种 final Graphics2D g=(Graphics2D)createImage(300,300).getGraphics(); //第二种 // ...
  • } } 不明白为什么这里 setSize 起不了作用............ import java.awt.*; import javax.swing.*; public class GridEx{ private JFrame f; private JButton b1,b2,b3,b4,b5,b6; public static void main (String...
  • Python界面编程之六----布局

    千次阅读 2019-05-13 20:19:09
    addStretch函数的作用是在布局器中增加一个伸缩量,里面的参数表示QSpacerItem的个数,默认值为零,会将你放在layout中的空间压缩成默认的大小。例如用addStretch函数实现将QHBoxLayout的布局器的空白空间分配。 ...
  • java setSize()不起作用

    2021-03-03 11:21:41
    这句为什么不起作用,是不是布局的问题 // **************************************************************我想修改按钮大小,为什么不起作用// showDialogBtn=new JButton("showDialogBtn"); showDialogBtn....
  • setLayout(grid1); for(int i=0;i ImageIcon c=new ImageIcon(getClass().getResource(i+1+".png")); bt[i]=new JButton(c); bt[i].addActionListener(new RatingMouseListener(i)); add( bt[i]); } } public ...
  • 最近使用RecyclerView自定义控件,Item布局中遇到一个坑发现初始化的时候一个控件被遮盖了,也就是layout_alignParentRight="true"没有生效,但是触摸滑动RecylerView之后Item中的元素又都显示正常了!...
  • 浅析java中action的作用

    2021-02-12 17:08:06
    public void init() { setLayout(new GridLayout(event.length+1,2)); for(int i = 0; i ; i++) { TextField t = new TextField(); t.setEditable(false); add(new Label(event[i], Label.CENTER)); add(t); h.put...
  • 简单的五子棋操作用两种方法实现

    千次阅读 2017-12-13 12:25:30
    setLayout ( new GridLayout ( 4 , 1 , 0 , 0 ) ) ; if ( a [ i ] [ j ] == 1 ) { JLabel label = new JLabel ( "恭喜黑色赢了" , JLabel . CENTER ) ; label . setFont ( new Font ( "宋体" , ...
  • 正如您所说,pack()将尝试安排窗口,以便将每个组件的大小调整为其...尝试评论setLayout(null)行,你会看到结果.当然,对于一个完整的窗口,您将不得不选择并设置一个有意义的LayoutManager.这对我很好:import java...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,082
精华内容 2,832
关键字:

setlayout作用