精华内容
下载资源
问答
  • QT添加Layout无效

    2020-12-24 17:04:57
    QT添加Layout没有效果 原因:在MainWindow中直接添加Layout会无法生效,需要借助一个窗口来实现 如下: 解决办法:在MainWindow中添加一个Widget,然后在Widget上设置Layout

    QT中添加Layout没有效果

    原因:在MainWindow中直接添加Layout会无法生效,需要借助一个窗口来实现
    

    如下:
    在这里插入图片描述

    解决办法:在MainWindow中添加一个Widget,然后在Widget上设置Layout
    

    在这里插入图片描述

    展开全文
  • QT layout

    千次阅读 2012-02-13 09:48:21
    Qt的版面配置(layout)系統提供了一個簡單有效的方法來做child widget的版面編排。使用版面配置具有下列的優點: 將child widget的位置做編排 可調整的視窗預設大小 可調整的視窗最小大小 可調整視窗大小 根...
     
    

    Qt的版面配置(layout)系統提供了一個簡單有效的方法來做child widget的版面編排。使用版面配置具有下列的優點:

    • 將child widget的位置做編排
    • 可調整的視窗預設大小
    • 可調整的視窗最小大小
    • 可調整視窗大小
    • 根據內容自動調整:
      • child widget的字型大小、文字或其他內容
      • 隱藏或顯示child widget
      • 移除child widget


    其實使用者也可以直接經由撰寫程式碼做版面配置,但卻是相當不方便,因為每次修改都需要重新compile、link以及執行後才知道修改後的結果。有鑑於此,Qt也提供了好用的工具 - Qt designer。Qt designer是一個GUI視覺化的設計工具,能讓視窗版面配置更為快速、簡單,有關Qt Designer將會在後面章節說明,本章將對如何撰寫程式碼進行版面配置說做名。


    [編輯] Horizontal、Vertical、Grid Layouts

    首先介紹最簡單的版面配置方法,那就是使用Qt提供的基本的版面配置管理:QHBoxLayout、QVBoxLayout與QGridLayout。這些類別是繼承自QLayout類別(再繼承自QObject類別)。這些類別主要負責widget版面位置的管理,經由這些版面配置處理可以產生更複雜的版面配置。


    • QHBoxLayout將widget編排成水平的一列:

    下列的程式碼建立一個QHBoxLayout,將5個QPushButton放置其中,其結果如圖所示:

    QWidget *window = new QWidget;
         QPushButton *button1 = new QPushButton("One");
         QPushButton *button2 = new QPushButton("Two");
         QPushButton *button3 = new QPushButton("Three");
         QPushButton *button4 = new QPushButton("Four");
         QPushButton *button5 = new QPushButton("Five");
     
         QHBoxLayout *layout = new QHBoxLayout;
         layout->addWidget(button1);
         layout->addWidget(button2);
         layout->addWidget(button3);
         layout->addWidget(button4);
         layout->addWidget(button5);
     
         window->setLayout(layout);
         window->show();

    qhboxlayout-with-5-children.png


    • QVBoxLayout將widget編排成為垂直的一行:

    QVBoxLayout的程式碼與上述的QHBoxLayout類似,其產生的結果如下:

    qvboxlayout-with-5-children.png


    • QGridLayout將widget編排成為二維的格子狀,widget可以佔據多個格子:

    而使用QGridLayout則有些微不同,因為必須要指定widget的行與列位置。

    QWidget *window = new QWidget;
         QPushButton *button1 = new QPushButton("One");
         QPushButton *button2 = new QPushButton("Two");
         QPushButton *button3 = new QPushButton("Three");
         QPushButton *button4 = new QPushButton("Four");
         QPushButton *button5 = new QPushButton("Five");
     
         QGridLayout *layout = new QGridLayout;
         layout->addWidget(button1, 0, 0);
         layout->addWidget(button2, 0, 1);
         layout->addWidget(button3, 1, 0, 1, 2);
         layout->addWidget(button4, 2, 0);
         layout->addWidget(button5, 2, 1);
     
         window->setLayout(layout);
         window->show();

    qgridlayout-with-5-children.png

    第三個QPushButton佔據了2行,所以在QGridLayout::addWidget()中指定了第五個參數2。使用這種版面配置,對child widget做版面配置時將不需要將parent widget參數引進來,此版面配置會自動利用QWidget::setParent()把Parent widget傳進來。

    當使用者使用某個layout於這個視窗應用程式,而在這個layout中加入其他widget(譬如上例中的PushButton),則這些widget都自動成為那個視窗應用程式使用此layout的child widget(記住,widget不能繼承自layout,只有widget之間才行)。

    此外,你可以利用addLayout()在版面配置中再加入其他版面配置;addLayout()中加入的版面配置就會成為外面版面配置的child,即可形成更複雜的版面配置。

          1. 设计一个窗体,安排好它的函数和属性。

          2. 基本的layout包括四类,QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout。前两个将widget水平或竖直防止,grid将widget以格子的形式放置,formlayout将widget以row的形式放置。

          3. layout的使用方法是,先定一个layout,再向这个layout中添加widget,然后使用父类中的setlayout(),设置这个widget的layout。

          4. layout有一个setMenubar,可以使得Dialog也可以设置菜单栏。

          5. 在定义类时,定义一个enum,之后就可以直接使用这个enum中的元素。

          6. QT赋参数的方法为tr("Button %1").arg(i + 1)。

          7. QGridLayout有setColumnStretch(int, int)方法,用于设置grid中格子的伸长因子,也就是能够占用多大的空间。

          8. QDialogButtonBox指用于确定/退出的button组。它是这两类常用button的一个box组合。

          9. 本例中涉及到的其它widget包括:

                 a.  QTextEdit,文本编辑框,支持plain text和html text

                 b.  QPushButton,按钮

                 c.  QGroupBox,将widget以box的形式组织在一起

                 d. QLineEdit,行编辑框

                 e. QComboBox,下拉框

                 f. QSpinBox,spin框,提供数值选择。

    Qt 布局使用关键:
        一个控件的大小方针用于告知系统该控件如何伸展和收缩,Qt为所有内建的控件提供了默认的大小伸缩规则,
        一个QSizePolicy 拥有垂直和水平两个成分,下面是一些有用的值:
            
        Fixed : 意味着窗口的大小不能被伸展或缩小,窗口总是它默认的大小。
        Minimum : 意味着窗口的默认大小是它的最小值,该窗口收缩时大小不能小于 size hint,但是如果需要,它可以伸展。
        Maxmum : 意味着窗口的默认大小是它的最大值,可缩小,但值必须小于size hint
        Preferred : 窗口的大小是优先值。如果有需要,它可伸展也可收缩
        Expanding :意味着窗口的大小随意伸缩。
        
        乍看,Preferred 和Expanding 描述的是一种方式,但是,它们之间的不同在于,当一个窗口中同时包含Preferred 和 Expanding 的
        控件时,当窗口控件大小改变时,额外的空间将给Expanding 控件,而Preferred 保持原有大小不变。
        
        QSizePolice 还保存着水平和垂直伸展因子。当窗口伸展时,不同的伸缩因子代表着不同控件的伸缩比例,例如,如果我们有一个QTreewidget
         在QTextEdit之上,我们想要QTextEdit的垂直高度是QTreeWidget的两倍,那么我们只需要设置QTextEdit的垂直因子为2,再设置QTreeWidget
         的垂直因子为1,就可。

    展开全文
  • QT Layout

    千次阅读 2011-03-25 22:19:00
    1、QT自带Layout QLayoutItem是所有布局的基类,子类的继承关系如下: 1.1、QLayout 1.1.1、QBoxLayout 1.1.1.1、QHBoxLayout 1.1.1.2、QVBoxLayout 1.1.2、QFormLayout 1.1.3、QGridLayout 1.1

    1、QT自带Layout

         QLayoutItem是所有布局的基类,子类的继承关系如下:
          1.1、QLayout
                 1.1.1、QBoxLayout

                           盒子布局,
                           1.1.1.1、QHBoxLayout

                                        水平盒子布局,所有的widget都水平方向排列;
                           1.1.1.2、QVBoxLayout

                                        垂直盒子布局,所有的widget都垂直方向排列;
                  1.1.2、QFormLayout

                            表单布局,正如表单一样,行数可变,但每行都只有两列;

                            每行都包含一个名称/值形式,名称对应LabelWidget,值对应Edit、ComboBox等widget;

                  1.1.3、QGridLayout

                            表格布局,可以是多行多列;
                  1.1.4、QStackedLayout

                            堆布局;

          1.2、QSpacerItem
          1.3、QWidgetItem

     

     

     

    2、QLayoutItem类介绍

         /* 构造函数,指明对齐方式 */

         QLayoutItem ( Qt::Alignment alignment = 0 )
         virtual ~QLayoutItem ()

     

         /*对齐方式 */

         void setAlignment ( Qt::Alignment alignment )
         Qt::Alignment alignment () const

     

        /* 几何位置 */

        virtual void setGeometry ( const QRect & r ) = 0

        virtual QRect geometry () const = 0


        QSizePolicy::ControlTypes controlTypes () const
        virtual Qt::Orientations expandingDirections () const = 0

     

        /* Height是否和Width关联,如果相关联,则heightForWidth指明了这种关联 */

        virtual bool hasHeightForWidth () const
        virtual int heightForWidth ( int w ) const


        virtual void invalidate ()

     

     

        /* 该Item是否为空,也就是说该Item是否包含子Widget */
        virtual bool isEmpty () const = 0


        /* 返回和宽度w对应的最小Height */
        virtual int minimumHeightForWidth ( int w ) const

        /* 返回该Item的最佳Size */
        virtual QSize sizeHint () const = 0

     

        /* 返回该Item的最大/小Size */

        virtual QSize minimumSize () const = 0

        virtual QSize maximumSize () const = 0

     

        /* 如果该Item是一个QSpacerItem,则返回QSpacerItem */

        /* 如果该Item是一个QWidget,则返回QWidget */

        /* 如果该Item是一个LayOut,则返回QLayOut */

        /* 主要在类型安全转换时使用 */

        virtual QSpacerItem * spacerItem ()

        virtual QLayout * layout ()
        virtual QWidget * widget ()

     

     

    3、QLayout类介绍

        /* 向Layout添加对象 */

        virtual void addItem ( QLayoutItem * item ) = 0
        void addWidget ( QWidget * w )

        /* 对象个数 */

        virtual int count () const = 0

        /* 根据Index确定对应的Widget,根据Widget确定对应的Index */
        virtual int indexOf ( QWidget * widget ) const
        virtual QLayoutItem * itemAt ( int index ) const = 0

     

        /* 根据Index确定对应的Item,类似于itemAt */
        virtual QLayoutItem * takeAt ( int index ) = 0

     

        /* 告诉Geometry Manager将widget菜单条关联到Layout的parentWidget上,

            例如:layout是dialog的mainlayout,则layout->setMenuBar(widget)会将widget菜单条关联到dialog上,也就是dialog的菜单条 */

        QWidget * parentWidget () const

        QWidget * menuBar () const

        void setMenuBar ( QWidget * widget )

     

    4、自定义Layout

        自定义Layout,就是从QLayoutItem派生。

        BorderLayout包括东西南北中五个方位,可以向不同方位添加元素;

        头文件:

        class BorderLayout : public QLayout
        {
            public:

                /* 位置方位:东西南北中五个方位 */
                enum Position { West, North, South, East, Center };

     

                /* 构造,析构 */

                BorderLayout(QWidget *parent, int margin = 0, int spacing = -1);
                BorderLayout(int spacing = -1);
                ~BorderLayout();

     

                /* 从QLayout类派生的方法 */

                /* 添加Widget和Item */

                void addItem(QLayoutItem *item);
                void addWidget(QWidget *widget, Position position);
                /* 扩展方向 */

                Qt::Orientations expandingDirections() const;

                int count() const;
                QLayoutItem *itemAt(int index) const;
                QLayoutItem *takeAt(int index);

     

                /* 从QLayoutItem类派生的方法 */
               bool hasHeightForWidth() const;

               QSize minimumSize() const;

               void setGeometry(const QRect &rect);
               QSize sizeHint() const;


               void add(QLayoutItem *item, Position position);

        private:
            struct ItemWrapper
            {

                /* BorderLayout布局元素:元素自身、位置信息 */
                ItemWrapper(QLayoutItem *i, Position p)

                {
                    item = i;
                    position = p;
                }

                QLayoutItem *item;
                Position position;
           };

     

            enum SizeType { MinimumSize, SizeHint };

     

            /* 根据类型,计算BorderLayout的Size */
            QSize calculateSize(SizeType sizeType) const;

     

            /* 所有的BorderLayout元素,保存在链表list中 */

            QList<ItemWrapper *> list;


        };

     

     

        CPP文件

        BorderLayout::BorderLayout(QWidget *parent, int margin, int spacing)
            : QLayout(parent)
        {
            setMargin(margin);
            setSpacing(spacing);
        }

     

        BorderLayout::BorderLayout(int spacing)
        {
            setSpacing(spacing);
        }

     

        /* 析构时,删除list中存在的所有widget */
        BorderLayout::~BorderLayout()
        {
            QLayoutItem *l;
            while ((l = takeAt(0)))
                delete l;
        }

     

        void BorderLayout::addItem(QLayoutItem *item)
        {

            /* 将新item添加到list的尾部,默认方位是西部 */
            add(item, West);
        }

     

        void BorderLayout::addWidget(QWidget *widget, Position position)
        {

            /* 将新widget添加到list的尾部 */
            add(new QWidgetItem(widget), position);
        }

     

        Qt::Orientations BorderLayout::expandingDirections() const
        {
            /* 支持水平和垂直两个方向的扩展 */

            return Qt::Horizontal | Qt::Vertical;
        }

     

        bool BorderLayout::hasHeightForWidth() const
        {
            /* Height和Width没有关联 */

            return false;
        }

     

        int BorderLayout::count() const
        {
            /* 链表长度本质上就是BorderLayout的元素个数 */

            return list.size();
        }

     

         /* 根据index找到相应的元素 */

        QLayoutItem *BorderLayout::itemAt(int index) const
        {
            ItemWrapper *wrapper = list.value(index);
            if (wrapper)
                return wrapper->item;
            else
                return 0;
        }

     

        QSize BorderLayout::minimumSize() const
        {
            /* MinimumSize模式下的Size也就是minimumSize */

            return calculateSize(MinimumSize);
        }

     

        void BorderLayout::setGeometry(const QRect &rect)
        {
            ItemWrapper *center = 0;
            int eastWidth = 0;
            int westWidth = 0;
            int northHeight = 0;
            int southHeight = 0;
            int centerHeight = 0;
            int i;

     

            QLayout::setGeometry(rect);

            for (i = 0; i < list.size(); ++i)

            {
                ItemWrapper *wrapper = list.at(i);
                QLayoutItem *item = wrapper->item;
                Position position = wrapper->position;

     

                if (position == North)

                {
                    item->setGeometry(QRect(rect.x(), northHeight, rect.width(),item->sizeHint().height()));

                    northHeight += item->geometry().height() + spacing();
                }

                else if (position == South)

                {
                    item->setGeometry(QRect(item->geometry().x(),item->geometry().y(), rect.width(),item->sizeHint().height()));

                    southHeight += item->geometry().height() + spacing();

                    item->setGeometry(QRect(rect.x(),rect.y() + rect.height() - southHeight + spacing(),
                                  item->geometry().width(),item->geometry().height()));
                }

                else if (position == Center)

                {
                    center = wrapper;
                }
            }

     

            centerHeight = rect.height() - northHeight - southHeight;

            for (i = 0; i < list.size(); ++i)

            {
                ItemWrapper *wrapper = list.at(i);
                QLayoutItem *item = wrapper->item;
                Position position = wrapper->position;

                if (position == West)

                {
                    item->setGeometry(QRect(rect.x() + westWidth, northHeight,item->sizeHint().width(), centerHeight));

                    westWidth += item->geometry().width() + spacing();
                }

                else if (position == East)

                {
                    item->setGeometry(QRect(item->geometry().x(), item->geometry().y(),item->sizeHint().width(), centerHeight));

                    eastWidth += item->geometry().width() + spacing();

                    item->setGeometry(QRect(rect.x() + rect.width() - eastWidth + spacing(),

                                                 northHeight, item->geometry().width(),item->geometry().height()));
                }
            }

     

            if (center)
                center->item->setGeometry(QRect(westWidth, northHeight,rect.width() - eastWidth - westWidth,enterHeight));
        }

     

     

        QSize BorderLayout::sizeHint() const
        {
            return calculateSize(SizeHint);
        }

     

     

    QLayoutItem *BorderLayout::takeAt(int index)
    {
        if (index >= 0 && index < list.size()) {
            ItemWrapper *layoutStruct = list.takeAt(index);
            return layoutStruct->item;
        }
        return 0;
    }

    void BorderLayout::add(QLayoutItem *item, Position position)
    {
        list.append(new ItemWrapper(item, position));
    }

    QSize BorderLayout::calculateSize(SizeType sizeType) const
    {
        QSize totalSize;

        for (int i = 0; i < list.size(); ++i) {
            ItemWrapper *wrapper = list.at(i);
            Position position = wrapper->position;
            QSize itemSize;

            if (sizeType == MinimumSize)
                itemSize = wrapper->item->minimumSize();
            else // (sizeType == SizeHint)
                itemSize = wrapper->item->sizeHint();

            if (position == North || position == South || position == Center)
                totalSize.rheight() += itemSize.height();

            if (position == West || position == East || position == Center)
                totalSize.rwidth() += itemSize.width();
        }
        return totalSize;
    }

     

     

     

     

     

        待补充。

    展开全文
  • Qt中在QMAinWindow内添加layout出现问题

    千次阅读 2015-09-29 13:43:43
    在QDialog的派生类中,添加Layout,可在创建Layout对象的同时指定其父窗口,但这在QMainWindow中行不通,可能会出现" ..已经设置过布局.. "或者设置的Layout不能正常显示。这是因为基于主窗口的程序,默认...

        在QDialog的派生类中,添加Layout,可在创建Layout对象的同时指定其父窗口,但这在QMainWindow中行不通,可能会出现" ..已经设置过布局.. "或者设置的Layout不能正常显示。这是因为基于主窗口的程序,默认已经有了自己的布局管理器,所以再次设置Layout的话会失效。

        QMainWindow的中心控件是一个QWidget,可以通过setCentralWidget进行设置。若想在QMainWindow中添加 layout,需要通过将该Layout添加到一个QWidget对象中,然后将该布局设置为该空间的布局,最后设置该控件为QMainWindow的中心控件,步骤如下:

       

    ①创建一个QWidget实例,并将这个实例设置为centralWidget:    

     

        QWidget*widget=newQWidget();
        this->setCentralWidget(widget);
     

     

    ②创建一个主布局mainLayout,添加自己需要的控件,设置布局属性:

     

     
        QHBoxLayout*mainLayout=newQHBoxLayout;
    
    mainLayout->setMargin(5);
        mainLayout->setSpacing(5);
        mainLayout->addWidget(list);
        mainLayout->addWidget(stack,0,Qt::AlignRight);
        mainLayout->setStretchFactor(list,1);
        mainLayout->setStretchFactor(stack,3);
     

     

    ③将widget的布局设置为mainLayout:

     

     
     
        centralWidget()->setLayout(mainLayout);

     

     

     
     

     

    展开全文
  • Qt layout布局

    千次阅读 2018-09-25 20:25:36
    Qt中关于布局有多个类,适用于不同的场景。 QBoxLayout【QHBoxLayout , QVBoxLayout】, QFormLayout, QGridLayout, and QStackedLayout,均派生自QLayout。 二 常用函数 1、设置左上右下的空白 ...
  • Qt layout添加了一个控件widget和一个layout1, layout 1不设置对其方式, 对比图一和图二, 图一为widget和layout1都不设置align时的情况; 图二为layout1设置了align时的情况,设置对齐后layout1预留出了一...
  • 当我们自己创建了一个Layout对象以后,使用QWidget的setLayout方法,将这个Layout对象应用到窗口中的时候,发现窗口上没有我们添加的控件,比如,QMainWindow就是一个例子,还有QToolBar也是这样,还有其他的QT预定...
  • QT添加一个TableView控件 目录 1.添加tableview头文件 2.添加.h文件代码 3.添加.cpp文件代码 4.效果 1.添加tableview头文件 #include <QTableView> #include <QStandardItem> #include <...
  • QCheckBox全部在顶部依次排列,下面用空白填充的效果,addWidget中可以换成其他组件,insertWidget用在循环中,可以在layout中一直动态添加到顶部。 { QVBoxLayout *layout = new QVBoxLayout(this); layout->...
  • Qt 快速利用qt designer Layout绘制GUI界面 文章目录Qt 快速利用qt designer Layout绘制GUI界面前言一、目的二、实现过程1.界面使用的元素介绍:2.实现步骤总结 前言 最近用qt画一个项目界面,本文主要记录了如何...
  • 第一次用Qt,以为mainwindow与widget以及Qdiag一样,总是添加layout,显示没反应,弄了好久结果是要添加widget。真是醉了 问题:在MainWindow中直接添加Layout会无法生效。 解决办法:需要现在MainWindow中添加一...
  • 当我们自己创建了一个Layout对象以后,使用QWidget的setLayout方法,将这个Layout对象应用到窗口中的时候,发现窗口上没有我们添加的控件,比如,QMainWindow就是一个例子,还有QToolBar也是这样,还有其他的QT预定...
  • Qt之布局Layout的应用

    千次阅读 2017-09-04 00:02:24
    前天群里有个小伙伴说对Qt中的布局很困惑,想让我写一篇关于布局的文章,今天就应这位同学的要求,先简单介绍一下Qt中的布局。 对于刚接触Qt的小伙伴可能对Qt中的各种布局以及各种参数云里雾里,后面将会对布局进行...
  • 问题:在MainWindow中直接添加Layout会无法生效。 解决办法:需要现在MainWindow中添加一个Widget然后再在Widget上添加Layout即可。 QWidget* widget = new QWidget(this); this->setCentralWidget(widget...
  • QTLayout

    千次阅读 2019-03-23 20:22:21
    这个类是用来布局的,它有各种各样既定风格的盒子,往这个盒子里添加控件,这些控件就会按照这个盒子的风格来找到自己的位置 举个例子,一个水平盒子往里面添加控件,是按照从左往右的顺序依次添加 QHBoxLayout ...
  • QT 添加背景图片

    千次阅读 2011-11-30 20:49:30
    Qt Widget中给Widget加上背景图是本文要介绍的内容,主要是来了解并学习Qt Widget应用,具体内容的实现来看本文详解。 关键使用widget的palette的brush. int main(int argc, char *argv[]) { Q
  • qt designer自动适应窗口变化的方法 qt自适应窗口大小,qt ui自适应大小,qt ui自动放大的方法, qt ui窗口变化而变化的方法,qt自适应大小的方法,qt自动调整大小到方法 qt使用屏幕分辨率,qt自动改变,qt...
  • QTLayout

    2017-08-29 23:03:14
    /*为布局添加窗体对象*/ layout.addWidget(&button,1,1); layout.addWidget(&lineEdit,1,2); layout.addWidget(new QPushButton("World"),2,1); layout.addWidget(new QLineEdit(),2,2); layout.addWidget(new...
  • 如定义一个class A:public QWidget{}; 在QMainWindow中加入: A* pa=new A; a.show();//可以显示 //b.addWidget(a)//b为一个QLayout,在设计师界面中静态添加的,此时a不能显示出来是为什么

空空如也

空空如也

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

layoutqt添加