qt布局管理器 - CSDN
精华内容
参与话题
  • QT5 学习之路15---布局管理器

    千次阅读 2015-10-03 17:38:52
    所谓 GUI 界面,归根结底,就是一堆组件的叠加...Qt 提供了两种组件定位机制:绝对定位和布局定位。顾名思义,绝对定位就是一种最原始的定位方法:给出这个组件的坐标和长宽值。这样,Qt 就知道该把组件放在哪里以及如

    所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。Qt 提供了两种组件定位机制:绝对定位和布局定位。

    顾名思义,绝对定位就是一种最原始的定位方法:给出这个组件的坐标和长宽值。这样,Qt 就知道该把组件放在哪里以及如何设置组件的大小。但是这样做带来的一个问题是,如果用户改变了窗口大小,比如点击最大化按钮或者使用鼠标拖动窗口边缘,采用绝对定位的组件是不会有任何响应的。这也很自然,因为你并没有告诉 Qt,在窗口变化时,组件是否要更新自己以及如何更新。如果你需要让组件自动更新——这是很常见的需求,比如在最大化时,Word 总会把稿纸区放大,把工具栏拉长——就要自己编写相应的函数来响应这些变化。或者,还有更简单的方法:禁止用户改变窗口大小。但这总不是长远之计。

    针对这种变化的需求,Qt 提供了另外的一种机制——布局——来解决这个问题。你只要把组件放入某一种布局,布局由专门的布局管理器进行管理。当需要调整大小或者位置的时候,Qt 使用对应的布局管理器进行调整。下面来看一个例子:

    // !!! Qt 5
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        QWidget window;
        window.setWindowTitle("Enter your age");
    
        QSpinBox *spinBox = new QSpinBox(&window);
        QSlider *slider = new QSlider(Qt::Horizontal, &window);
        spinBox->setRange(0, 130);
        slider->setRange(0, 130);
    
        QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
        void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
        QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);
        spinBox->setValue(35);
    
        QHBoxLayout *layout = new QHBoxLayout;
        layout->addWidget(spinBox);
        layout->addWidget(slider);
        window.setLayout(layout);
    
        window.show();
    
        return app.exec();
    }

    这段例子还是有些东西值得解释的。我们可以先来看看运行结果:
    这里写图片描述
    当我们拖动窗口时,可以看到组件自动有了变化:
    这里写图片描述
    我们在这段代码中引入了两个新的组件:QSpinBox和QSlider。QSpinBox就是只能输入数字的输入框,并且带有上下箭头的步进按钮。QSlider则是带有滑块的滑竿。我们可以从上面的截图中清楚地辨别出这两个组件。当我们创建了这两个组件的实例之后,我们使用setRange()函数设置其范围。既然我们的窗口标题是“Enter your age(输入你的年龄)”,那么把 range(范围)设置为 0 到 130 应该足够了。

    有趣的部分在下面的connect()函数。我们已经清楚connect()函数的使用,因此我们写出

    Object::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
    
    

    将 slider 的valueChanged()信号同 spinBox 的setValue()函数相连。这是我们熟悉的。但是,当我们直接写

    QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);

    的时候,编译器却会报错:

    no matching function for call to 'QObject::connect(QSpinBox*&, <unresolved overloaded function type>, QSlider*&, void (QAbstractSlider::*)(int))'

    这是怎么回事呢?从出错信息可以看出,编译器认为QSpinBox::valueChanged是一个 overloaded 的函数。我们看一下QSpinBox的文档发现,QSpinBox的确有两个信号:

    void valueChanged(int)
    void valueChanged(const QString &)
    当我们使用&QSpinBox::valueChanged取函数指针时,编译器不知道应该取哪一个函数(记住前面我们介绍过的,经过 moc 预处理后,signal 也是一个普通的函数。)的地址,因此报错。解决的方法很简单,编译器不是不能确定哪一个函数吗?那么我们就显式指定一个函数。方法就是,我们创建一个函数指针,这个函数指针参数指定为 int:

    void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;

    然后我们将这个函数指针作为 signal,与 QSlider 的函数连接

    QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);

    这样便避免了编译错误。

    仔细观察这两个connect()的作用,它们实际完成了一个双向的数据绑定。当然,对于 Qt 自己的信号函数,我们可以比较放心地使用。但是,如果是我们自己的信号,应当注意避免发生无限循环!

    下面的代码,我们创建了一个QHBoxLayout对象。显然,这就是一个布局管理器。然后将这两个组件都添加到这个布局管理器,并且把该布局管理器设置为窗口的布局管理器。这些代码看起来都是顺理成章的,应该很容易明白。并且,布局管理器很聪明地做出了正确的行为:保持QSpinBox宽度不变,自动拉伸QSlider的宽度。

    Qt 提供了几种布局管理器供我们选择:

    QHBoxLayout:按照水平方向从左到右布局;
    QVBoxLayout:按照竖直方向从上到下布局;
    QGridLayout:在一个网格中进行布局,类似于 HTML 的 table;
    QFormLayout:按照表格布局,每一行前面是一段文本,文本后面跟随一个组件(通常是输入框),类似 HTML 的 form;
    QStackedLayout:层叠的布局,允许我们将几个组件按照 Z 轴方向堆叠,可以形成向导那种一页一页的效果。
    当然,我们也可以使用 Qt 4 来编译上面的代码,不过,正如大家应该想到的一样,我们必须把connect()函数修改一下:

    // !!! Qt 4
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        QWidget window;
        window.setWindowTitle("Enter your age");
    
        QSpinBox *spinBox = new QSpinBox(&window);
        QSlider *slider = new QSlider(Qt::Horizontal, &window);
        spinBox->setRange(0, 130);
        slider->setRange(0, 130);
    
        QObject::connect(slider,  SIGNAL(valueChanged(int)),
                         spinBox, SLOT(setValue(int)));
        QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                         slider,  SLOT(setValue(int)));
        spinBox->setValue(35);
    
        QHBoxLayout *layout = new QHBoxLayout;
        layout->addWidget(spinBox);
        layout->addWidget(slider);
        window.setLayout(layout);
    
        window.show();
    
        return app.exec();
    }

    这里我们强调一下,上面的代码在 Qt 5 中同样可以编译通过。不过,我们减少了使用函数指针指定信号的步骤。也就是说,在 Qt 5 中,如果你想使用 overloaded 的 signal,有两种方式可供选择:

    使用 Qt 4 的SIGNAL和SLOT宏,因为这两个宏已经指定了参数信息,所以不存在这个问题;
    使用函数指针显式指定使用哪一个信号。
    有时候,使用 Qt 4 的语法更简洁。但是需要注意的是,Qt 4 的语法是没有编译期错误检查的。这也是同 Qt 5 的信号槽新语法不同之处之一。

    展开全文
  • Qt布局管理器使用

    千次阅读 2018-04-13 14:25:31
    如下图:水平布局管理器可以把它所管理的部件以水平的顺序依次排开,例如上图中中间的“Centigrade”和“Fahrenheit”两段文字,就是水平排列的,这个时候就可以用水平布局管理器来实现。垂直管理器类似,它可以把它...
    T 布局管理界面 图文并茂是本文介绍的内容,先来看内容。今天来实现一个温度转换器的界面。如下图:

    QT 布局管理界面 图文并茂

    水平布局管理器可以把它所管理的部件以水平的顺序依次排开,例如上图中中间的“Centigrade”和“Fahrenheit”两段文字,就是水平排列的,这个时候就可以用水平布局管理器来实现。

    垂直管理器类似,它可以把它所管理的部件以垂直的顺序依次排开,例如上图中右侧的液晶数字和地下的表盘,就形成了垂直排列,这个时候就可以用垂直管理器来实现。

    Grid布局管理器可以以网格的形式,将它所管理的部件以一定的矩阵形式排列。比如上图中,所有的部件一起看,其实就是一种矩阵的形式来排列的。

    QT下做界面设计的时候,其实无非就是利用上面三种布局管理器来将部件进行分类和排列。

    就拿上图为例,总计有7个部件(一个PushButton,三个Label,一个Slider,一个LCDNumber和一个Dial),首先需要确定七个部件在对话框上的排布(上图就是我希望的排布方式)。然后,有两种方法用程序来实现我们期望的这种排布效果:

    第一种,充分利用水平、垂直布局管理器:可以将最终布局拆分成以下四部分:

    QT 布局管理界面 图文并茂

    第一部分只有一个PushButton,先不管它。

    第二部分是两个水平排列的Label,可以使用水平布局管理器将其放到一起;

    第三部分是水平排列的Label和Sider,也可以用水平布局管理器将其放到一起;

    第四部分是垂直排列的LCDNumber和Dial,可以使用垂直布局管理器将其放到一起;

    OK,了解了以上几点,就可以采取这种操作:

    先将第三部分和第四部分分别使用布局管理器组合起来,这个时候,我们可以将第三部分看做一个部件,将第四部分也看做一个“部件”;

    将第二部分使用水平布局管理器组合起来,这个时候,第二部分也可以看做一个“部件”;

    然后,第三部分和第四部分这两个大的“部件”也可以使用水平管理器组合起来,我们暂时称之为次三部分,呵呵。此时,整个窗体的布局变成下面的形式:

    QT 布局管理界面 图文并茂

    此时,整个布局变成了由第一部分、第二部分和第三部分构成的三个大的“部件”,而且,现在这三个部件恰好是“垂直排列”的,所以,我们可以用垂直布局管理器将三个大“部件”再次组合~~

    OK,利用水平和布局管理器不断组合的方法,即可顺利完成整个应用程序界面的管理。

    在这种方法中,我们使用到了3个水平布局管理器,2个垂直布局管理器。

    这种方法比较直观,类似于函数的递归调用,呵呵~将小的部件不断组合组合在组合~~ 缺点是利用了比较多的布局管理器才达到最终的效果~所以,我们还有另外一种实现这种应用程序布局的方法:利用Grid布局管理器~~这里就不再介绍,下一篇再续 :-)

    接着上次的,还是要实现这个温度转换器的界面。如下图:

    QT 布局管理界面 图文并茂

    上次使用水平布局管理器和垂直布局管理器联合实现了这个界面,今天就用栅格布局管理器来实现。


    栅格布局管理器可以以网格的形式,将它所管理的部件以一定的矩阵形式排列。比如上图中,所有的部件一起看,其实就是一种矩阵的形式来排列的。

    栅格布局管理器最典型的用法是将部件规规矩矩的排列好,每个栅格的单元格里放一个部件,如下图的示例:

    QT 布局管理界面 图文并茂

    类似上图这种布局比较容易实现,只需要把各个部件填入到指定的单元格里即可,示例代码如下:

    1. m_Layout->addWidget(Label1, 0, 0); // 将Label1填到(0,0)单元格  
    2. m_Layout->addWidget(Label2, 0, 2); // 将Label2填到(0,2)单元格  
    3. …… 

    而我们要实现的这个温度转换器的界面,并不是一个规则的栅格结构。而是如下这种结构:

    QT 布局管理界面 图文并茂

    上图中的这6部分,并不是规规矩矩的栅格形式。那怎么办呢?没关系,栅格布局管理器提供了很大的灵活性。具体表现在,可以设定某个部件是否需要横跨n个列,或者是否需要纵越m个行~~。什么意思呢?先来看一个简单的例子

    QT 布局管理界面 图文并茂

    以上面这种布局来说,三个部件其中有两个部件是比较规矩的处于两个单元格内,但是第三个部件就横跨了两列,实际上,我们可以这样来看这张布局图:

    QT 布局管理界面 图文并茂

    这样就一目了然了。第三个部件的确是横跨了两列(在水平方向上占用了两个单元格)。

    在使用栅格布局管理器对三个部件进行管理时,就可以这样:

    1. m_Layout->addWidget(m_Widget1, 0, 0); // 第一个部件在(0,0)  
    2. m_Layout->addWidget(m_Widget2, 0, 1); // 第二个部件在(0,1)  
    3. m_Layout->addWIdget(m_Widget3, 1, 0, 1,2); // 第三个部件起始于(1,0),并纵越1行,横跨2列 

    同样的,再看下图:

    QT 布局管理界面 图文并茂

    我们可以认为右侧的部件纵越了两行(在垂直方向上占用了两个单元格),对应的示例代码:

    1. m_Layout->addWidget(m_Widget1, 0, 0); // 第一个部件在(0,0)  
    2. m_Layout->addWidget(m_Widget2, 1, 0); // 第二个部件在(1,0)  
    3. m_Layout->addWIdget(m_Widget3, 0, 1, 2, 1); // 第三个部件起始于(0,1),并纵越2行,横跨1列 

    这其实很类似于HTML里利用Table做网页布局时使用的手段。稍微了解一些HTML的人都会知道,在Table布局时,单元格会有rowSpan和colSpan的参数,这两个参数的意义其实就是所谓的“纵越n个行”和“横跨m个列”。这里,栅格布局管理器的布局方式,跟它完全一致。

    OK,回头再看看我们需要实现的界面。我们现在有了rowSpan和colSpan的概念,那么,我们可以把那张界面布局图变换一下:

    QT 布局管理界面 图文并茂

    我们把交叉的这些线全部延伸开,可以看到,整个界面被拆分成了3×4个单元格,此时,我们就会惊呼,哈哈,这不就是规规矩矩的栅格了吗(虽然它的每个单元格不是一样大,但是没关系,至少行和列都是规矩的了)。

    OK,那就开始我们的界面布局吧。为了方便观察,我在每个单元格里标注上他们的编号:

    QT 布局管理界面 图文并茂

    首先看Quit按钮,它起始于(0,0),横跨3个单元格,也就是colSpan=3,所以:

    1. m_Layout->addWidget(m_QuitButton, 0, 0, 1, 3); 

    然后是“Centigrade”,这个Label起始于(1,0),横跨2个单元格,也就是colSpan=2,所以:

    1. m_Layout->addWidget(m_CenLabel, 1, 0, 1, 2); 

    然后是“Fahrenheit”,这个Label起始于(1,2),它刚好占用1个单元格,所以没有rowSpan和colSpan(或者说rowSpan和colSpan都是1),所以:

    1. m_Layout->addWidget(m_FahLabel, 1, 2); 

    再然后是“0”这个Label,它起始于(2,0),纵越2个单元格,rowSpan=2,所以:

    1. m_Layout->addWidget(m_Label, 2, 0, 2, 1); 

    再然后是Slider,它起始于(2,1),纵越2个单元格,rowSpan=2,所以:

    1. m_Layout->addWidget(m_Slider, 2, 1, 2, 1); 

    再然后是LCDNumber,它起始于(2,2),占用一个单元格,所以:

    1. m_Layout->addWidget(m_LCDNumber, 2, 2); 

    最后是Dial表盘,它起始于(3,2)占用一个单元格,所以:

    1. m_Layout->addWidget(m_LCDNumber, 3, 2); 

    OK,至此,我们的整个界面布局就完成了,鼓掌 :-)

    跟使用水平布局管理器和垂直布局管理器的组合方式相比,使用栅格布局管理器只需要消耗一个布局管理器即可完成整个界面的布局。但是这种方式的一个最大的缺点是,需要事先精确设计好每个部件的位置和占用尺寸,在部件数量比较大的情况下,仅仅使用栅格布局管理器就显得力不从心了。

    所以,在做界面布局的时候,可以使用栅格布局管理器做整体框架设计,然后在其中填充一些水平或垂直布局管理器,或者他们的组合,以便来达到更好的效果。这就好像,在做网页的时候,可以利用Table里套用Table的方法,来实现一些比较复杂的网页布局控制。

    小结:关于详解 QT 布局管理界面 图文并茂的内容介绍完了,希望本文对你有所帮助!

    展开全文
  • Qt布局管理详解

    万次阅读 2016-11-24 13:45:53
    Qt布局管理手册: http://doc.qt.io/qt-5/qtwidgets-index.html#styles http://doc.qt.io/qt-5/qtwidgets-index.html#widgets http://doc.qt.io/qt-5/qtwidgets-index.html#layouts 以下是Qt手册中的《布局管理...

    Qt布局管理手册:

    http://doc.qt.io/qt-5/qtwidgets-index.html#styles

    http://doc.qt.io/qt-5/qtwidgets-index.html#widgets

    http://doc.qt.io/qt-5/qtwidgets-index.html#layouts

    以下是Qt手册中的《布局管理》的译文:

             在一个Widget中,Qt布局管理系统提供了一个简单而有效的方式来自动组织子widget,以保证他们能够很好地利用可用空间。

    介绍:

            Qt包含一个布局管理类的集合,它们被用来描述widgets如何在应用程序的用户界面中呈现的。当可用空间发生变化时,这些布局将自动调整widgets的位置和大小,以确保它们布局的一致性和用户界面主体可用。

    所有QWidget的子类都可以用布局来管理它们的子类。QWidget::setLayout()函数给widget提供一个布局。当布局通过这种方式设置到widget,它将负责以下任务:

    1.子widget的定位

    2.窗口的合理默认空间

    3.窗口的合理最小空间

    4.调整大小处理

    5.当内容发生变化时自动调整

    6.字体、大小或者内容变化

    7.显示或 隐藏widget

    8.移除子widget

    Qt的布局类:

    QGraphicsAnchorLayout

    Layout where one can anchor widgets together in Graphics View

    在制图视图中布局widget

    QGraphicsAnchor

    Represents an anchor between two items in a QGraphicsAnchorLayout

    表示一个QGraphicsAnchorLayout中两个图元之间的anchor

    QBoxLayout

    Lines up child widgets horizontally or vertically

    水平或垂直整理子widget

    QHBoxLayout

    Lines up widgets horizontally

    水平整理子控件

    QVBoxLayout

    Lines up widgets vertically

    垂直整理子控件

    QFormLayout

    Manages forms of input widgets and their associated labels

    label-inputwidget模式表单布局

    QGridLayout

    Lays out widgets in a grid

    网格布局

    QLayout

    The base class of geometry managers

    布局,几何管理的基类

    QLayoutItem

    Abstract item that a QLayout manipulates

    管理的抽象元素

    QSpacerItem

    Blank space in a layout

    空白区域布局

    QWidgetItem

    Layout item that represents a widget

    布局元素

    QSizePolicy

    Layout attribute describing horizontal and vertical resizing policy

    大小策略

    QStackedLayout

    Stack of widgets where only one widget is visible at a time

    栈模式布局,一次只显示一个

    QButtonGroup

    Container to organize groups of button widgets

    管理按钮的容器

    QGroupBox

    Group box frame with a title

    带标题的组箱框架

    QStackedWidget

    Stack of widgets where only one widget is visible at a time

    栈模式的widget,一次只显示一个

    水平、垂直、网格和表格布局:

           Qt布局类之间的关系如图1所示:

                                                                                        图1 Qt布局类之间的关系

            给widgets一个很好布局的最好方式是使用内置的布局管理器: QHBoxLayoutQVBoxLayoutQGridLayout, and QFormLayout. 这些类都从QLayout继承而来,它们都来源于QObject(而不是QWidget)。创建更加复杂的布局,可以让它们彼此嵌套完成。

    QHBoxLayout:水平布局

    QVBoxLayout:垂直布局

    QGridLayout: 表格布局

    QGridLayout::addWidget()语法

    layout->addWidget(widget, row, column, rowSpan, columnSpan);

    参数widget:为插入到这个布局的子控件;

    参数(row,column)为控件占据的左上角单元格位置;

    参数rowSpan是控件占据的行数,

    参数colunmSpan是控件占据的列的个数。

    (rowSpan和colunmSpan默认值为1)

    Stacked Layouts:分组布局

         QStackedLayout类把子控件进行分组或者分页,一次只显示一组或者一页,隐藏其他组或者页上的控件。

    使用这些Qt布局管理类的另一个原因是,在程序、系统改变字体,语言或者在不同的平台上运行时,布局管理器能够自动调整窗体里所有控件的大小和尺寸。

     其他可进行布局管理的类:这些类的共同特点是提供了更加灵活的布局管理,在一定程度上用户能够控制窗体内控件的大小。

    QSplitter,QScrollArea,QMainWindow,QWorkspace(对多文档的支持)

     

    2)         布局管理中结合控件的sizePolicy属性,进行调整

       结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。

    控件的sizePolicy说明控件在布局管理中的缩放方式。Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。一个QSizePolicy的所有变量对水平方向和垂直方向都适用。下面列举了一些最长用的值:

    A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。

    B. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以

    放大。

    C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小

    的允许尺寸。

    D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小

    E. Expandint:控件可以自行增大或者缩小

    注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)

    1.QHBoxLayout是水平布局,将从左往右(orright to left for right-to-left languages )widget布局成水平行


    2.QVBoxLayout是垂直布局,从顶部到底部


    3.QGridLayout 是二位的网格布局。它可以容纳多个单元格:


    4.QFormLayout是两列label-field式的表单布局

    代码举例:

    下面代码创建QHBoxLayout来管理5个QPushButtons的几何图形:

    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();

    QGridLayout示例如下:

        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();

    QFormLayout示例如下:

        QWidget *window = new QWidget;
        QPushButton *button1 = new QPushButton("One");
        QLineEdit *lineEdit1 = new QLineEdit();
        QPushButton *button2 = new QPushButton("Two");
        QLineEdit *lineEdit2 = new QLineEdit();
        QPushButton *button3 = new QPushButton("Three");
        QLineEdit *lineEdit3 = new QLineEdit();
     
        QFormLayout *layout = new QFormLayout;
        layout->addRow(button1, lineEdit1);
        layout->addRow(button2, lineEdit2);
        layout->addRow(button3, lineEdit3);
     
        window->setLayout(layout);
        window->show();
    布局技巧:

    当使用布局的时候,在创建子widget时,没必要给它传递父类。布局会自动重新定义它们的父类(通过QWidget::setParent())以确保它们是装载布局的widget的子类。

    注意1:布局中的控件是装载布局控件的子控件,不是布局的子控件。控件只能以其他控件作为父类,不可以以布局作为父类。在布局上,可以使用addLayout来嵌套布局;被嵌套的布局,将变成上层布局的子布局。

    向布局添加widgets:

    添加布局到widgets时,布局过程执行如下:

    1.所有widgets将根据它们的 QWidget::sizePolicy() and QWidget::sizeHint()首先分配一些空间。

    2. 如果有widgets设置了大于0的拉伸系数,接下来它们将按照拉伸系数的比例来分配空间。

    3. 如果有widgets设置的拉伸系数是0,它将在没有其他widgets需要空间时获取更多空间。其中,带Expanding大小策略的widget将首先获得空间。

    4. 所有分配了小于最小空间(或者设置了最小的sizehint)的widget将按要求分配最小空间。(在拉伸系数成为决定因子时,widgets没必要再用最小值或者最小hint)。

    5. 任何分配了大于最大空间的widget将按要求分配最大空间。(拉伸系数起着决定作用)

    拉伸系数:

            通常,widgets创建的时候没有设置拉伸系数。当widget整理到一个布局中时,它们将根据QWidget::sizePolicy()或者最小大小hint(取决于谁更大)分配一定空间。拉伸系数被用于按比例改变widget的分配空间。

            如果3个widget用QHBoxLayout 来布局,不带拉伸系数,它们将得到像下面的布局:

           

            如果带上拉伸系数,情况将变成这样:

           

    自定义widget的布局:

           当编写自定义widget类时,需要显示提供它的布局属性。如果widget有Qt自带的布局,它能够自己满足自己。如果没有任何子布局,或者使用手动布局,可以通过下面的机制来改变widget的行为:

    1.实现QWidget::sizeHint() 来返回首先大小

    2.实现QWidget::minimumSizeHint()来返回widget可以拥有的最小空间

    3.调用QWidget::setSizePolicy来描述widget所需的空间

           当size hint、minimum size或size policy改变时,调用QWidget::updateGeometry()。这将促使布局重新进行计算。连续多次调用QWidget::updateGeometry()只会发生一次布局重新计算。

    即便实现了QWidget::heightForWidth(),也有必要提供合理的sizeHint()。

    进一步了解,参见:Trading Height for Width.

    布局问题:

            The use of rich text in a label widget can introduce some problemsto the layout of its parent widget. Problems occur due to the way rich text ishandled by Qt's layout managers when the label is word wrapped.

    Incertain cases the parent layout is put into QLayout::FreeResize mode, meaningthat it will not adapt the layout of its contents to fit inside small sizedwindows, or even prevent the user from making the window too small to beusable. This can be overcome by subclassing the problematic widgets, andimplementing suitable sizeHint() andminimumSizeHint() functions.

    Insome cases, it is relevant when a layout is added to a widget. When you set thewidget of a QDockWidget ora QScrollArea (with QDockWidget::setWidget() andQScrollArea::setWidget()), the layout mustalready have been set on the widget. If not, the widget will not be visible.

           在QLabel中使用富文本会给布局的父类widget带来一些问题。问题发生的原因是因为当label被文字环绕时,富文本被Qt的布局管理器控制。

           在某些情况下,父类布局被放入QLayout::FreeResize模式,这意味着它将不适应内容布局所设置的最小窗口,或者甚至阻止用户让窗口小到不可用的情况。这个可以通过将问题控件作为子类来解决,并实现合适的sizeHint()minimumSizeHint()函数。

           在一些情况下,当布局被添加到widget时需要特别注意。当设置QDockWidget ora QScrollArea widget时(用QDockWidget::setWidget() andQScrollArea::setWidget()),布局必须已经被设置到widget上。否则,这些widget将不可见。

    手动布局:

              如果想自定义一个独特的布局,可以按 如上所述地自定义一个widget。实现QWidget::resizeEvent()来计算所需的大小分配并在每个子类中调用setGeometry() 。

    需要布局需要重新计算大小时,widget将提供一个事件接口QEvent::LayoutRequest 。实现QWidget::event()来接收QEvent::LayoutRequest事件。

    自定义布局管理:

              自定义布局的唯一方法是继承QLayout来完成自己布局管理器。Border Layout 和Flow Layout 例子将说明如何来完成。

    下面将举个例子来说明。CardLayout 类,受同名java布局管理的启发。它分层管理每个元素,每个元素的通过QLayout::spacing()来设置位移量。

    编写自定义布局类,必须定义以下内容:

    由布局控制的存放元素的数据结构。每个元素都是一个QLayoutItem。在这个例子中,我们将使用QList 。

    1. addItem(),描述如何添加元素到布局。

    2.setGeometry(),描述如何完成布局

    3.sizeHint(),布局的首选大小

    4.itemAt(),描述如何递归布局

    5.takeAt(),描述如何移除布局中的元素。

    在大多数情况下,还需要实现minimumSize()

    头文件
    
    card.h
    #ifndef CARD_H
    #define CARD_H
     
    #include <QtGui>
    #include <QList>
     
    class CardLayout : public QLayout
    {
    public:
        CardLayout(QWidget *parent, int dist): QLayout(parent, 0, dist) {}
        CardLayout(QLayout *parent, int dist): QLayout(parent, dist) {}
        CardLayout(int dist): QLayout(dist) {}
        ~CardLayout();
     
        void addItem(QLayoutItem *item);
        QSize sizeHint() const;
        QSize minimumSize() const;
        int count() const;
        QLayoutItem *itemAt(int) const;
        QLayoutItem *takeAt(int);
        void setGeometry(const QRect &rect);
     
    private:
        QList<QLayoutItem*> list;
    };
    #endif
    
    实现文件
    
    card.cpp
    #include "card.h"
    int CardLayout::count() const
    {
            // QList::size() returns the number of QLayoutItems in the list
        return list.size();
    }
     
    int CardLayout::count() const
    {
            // QList::size() returns the number of QLayoutItems in the list
        return list.size();
    }
     
    int CardLayout::count() const
    {
            // QList::size() returns the number of QLayoutItems in the list
        return list.size();
    }
     
    CardLayout::~CardLayout()
    {
         QLayoutItem *item;
         while ((item = takeAt(0)))
             delete item;
    }
     
    void CardLayout::setGeometry(const QRect &r)
    {
        QLayout::setGeometry(r);
     
        if (list.size() == 0)
            return;
     
        int w = r.width() - (list.count() - 1) * spacing();
        int h = r.height() - (list.count() - 1) * spacing();
        int i = 0;
        while (i < list.size()) {
            QLayoutItem *o = list.at(i);
            QRect geom(r.x() + i * spacing(), r.y() + i * spacing(), w, h);
            o->setGeometry(geom);
            ++i;
        }
    }
    QSize CardLayout::sizeHint() const
    {
        QSize s(0,0);
        int n = list.count();
        if (n > 0)
            s = QSize(100,70); //start with a nice default size
        int i = 0;
        while (i < n) {
            QLayoutItem *o = list.at(i);
            s = s.expandedTo(o->sizeHint());
            ++i;
        }
        return s + n*QSize(spacing(), spacing());
    }
     
    QSize CardLayout::minimumSize() const
    {
        QSize s(0,0);
        int n = list.count();
        int i = 0;
        while (i < n) {
            QLayoutItem *o = list.at(i);
            s = s.expandedTo(o->minimumSize());
            ++i;
        }
        return s + n*QSize(spacing(), spacing());
    }
     
    

    进一步说明:

    自定义布局没有控制宽和高。

    忽略了 QLayoutItem::isEmpty(),这意味着布局将把隐藏widget作为可见的。

    对于复杂布局,通过缓存计算将大大提高速度。在那种情况下,实现QLayoutItem::invalidate() 来标记数据是脏数据。

    调用QLayoutItem::sizeHint()等的代价比较大。在通过函数中,需要再次使用,最好将结果保存在本地变量中。

    在同样函数的同一个元素中,不应该调用两次 QLayoutItem::setGeometry()。 这个调用将耗费巨大,如果它用几个子widget,因为布局管理器每次都要做一个完整的布局。替代方法:先计算geometry,然后再设置(这种事情,不仅应该在布局时注意,在实现resizeEvent()时也需要按同样方法来做)。

    参考:

    1. Qt手册《LayoutManagement》

    窗体小部件和布局:

    窗体小部件:

    窗体小部件(Widgets)是Qt中创建用户界面的主要元素。窗体小部件可以显示数据和状态信息,接受用户输入,和提供组织其他窗体小部件的容器。

    没有嵌入到父级窗体小部件的部件被称为窗口(window)。

    布局:

    布局是一个种高雅而灵活的方式来自动把子类窗体小部件组织到它们的容器中。每个窗体小部件通过sizeHint和sizePolicy属性向布局提供大小需求,布局根据可用空间进行分配。

    窗体小部件的样式:

    样式(styles)绘制窗体小部件,并封装了GUI的外观和感觉。Qt的内置窗体小部件使用QStyle类完成几乎所有的绘制工作,以确保它们看来确实是一致的、本地窗体小部件。

    QSS(Qt Style Sheets)允许自定义窗体小部件的外观。

    窗体小部件的类:

    QtWidget Gallery

    基础部件:

    QCheckBox

    Checkbox with a text label

    QComboBox

    Combined button and popup list

    QCommandLinkButton

    Vista style command link button

    QDateEdit

    Widget for editing dates based on the QDateTimeEdit widget

    QDateTimeEdit

    Widget for editing dates and times

    QDial

    Rounded range control (like a speedometer or potentiometer)

    QDoubleSpinBox

    Spin box widget that takes doubles

    QFocusFrame

    Focus frame which can be outside of a widget's normal paintable area

    QFontComboBox

    Combobox that lets the user select a font family

    QLCDNumber

    Displays a number with LCD-like digits

    QLabel

    Text or image display

    QLineEdit

    One-line text editor

    QMenu

    Menu widget for use in menu bars, context menus, and other popup menus

    QProgressBar

    Horizontal or vertical progress bar

    QPushButton

    Command button

    QRadioButton

    Radio button with a text label

    QScrollArea

    Scrolling view onto another widget

    QScrollBar

    Vertical or horizontal scroll bar

    QSizeGrip

    Resize handle for resizing top-level windows

    QSlider

    Vertical or horizontal slider

    QSpinBox

    Spin box widget

    QTabBar

    Tab bar, e.g. for use in tabbed dialogs

    QTabWidget

    Stack of tabbed widgets

    QTimeEdit

    Widget for editing times based on the QDateTimeEdit widget

    QToolBox

    Column of tabbed widget items

    QToolButton

    Quick-access button to commands or options, usually used inside a QToolBar

    QWidget

    The base class of all user interface objects

    高级部件:

    QCalendarWidget

    Monthly based calendar widget allowing the user to select a date

    QColumnView

    Model/view implementation of a column view

    QDataWidgetMapper

    Mapping between a section of a data model to widgets

    QDesktopWidget

    Access to screen information on multi-head systems

    QListView

    List or icon view onto a model

    QMacCocoaViewContainer

    Widget for Mac OS X that can be used to wrap arbitrary Cocoa views (i.e., NSView subclasses) and insert them into Qt hierarchies

    QMacNativeWidget

    Widget for Mac OS X that provides a way to put Qt widgets into Carbon or Cocoa hierarchies depending on how Qt was configured

    QTableView

    Default model/view implementation of a table view

    QTreeView

    Default model/view implementation of a tree view

    QUndoView

    Displays the contents of a QUndoStack

    QWSEmbedWidget

    Enables embedded top-level widgets in Qt for Embedded Linux

    QWebView

    Widget that is used to view and edit web documents

    QX11EmbedContainer

    XEmbed container widget

    QX11EmbedWidget

    XEmbed client widget

    Phonon::VideoWidget

    Widget that is used to display video

    组织者部件:

    QButtonGroup

    Container to organize groups of button widgets

    QGroupBox

    Group box frame with a title

    QSplitter

    Implements a splitter widget

    QSplitterHandle

    Handle functionality of the splitter

    QStackedWidget

    Stack of widgets where only one widget is visible at a time

    QTabWidget

    Stack of tabbed widgets

    抽象部件类:

    QAbstractButton

    The abstract base class of button widgets, providing functionality common to buttons

    QAbstractScrollArea

    Scrolling area with on-demand scroll bars

    QAbstractSlider

    Integer value within a range

    QAbstractSpinBox

    Spinbox and a line edit to display values

    QDialog

    The base class of dialog windows

    QFrame

    The base class of widgets that can have a frame



    展开全文
  • Qt布局管理器

    万次阅读 多人点赞 2018-05-30 10:25:07
    简述Qt布局系统提供了一个简单的和强有力的方式,来自动排列窗口子控件布局。所有QWidget子类可以使用布局管理他们的子控件。QWidget::setLayout()函数可以为一个控件布局。当通过这种方式布局以后,它负责以下...

    简述

    Qt的布局系统提供了一个简单的和强有力的方式,来自动排列窗口子控件布局。

    所有QWidget子类可以使用布局来管理他们的子控件。QWidget::setLayout()函数可以为一个控件布局。当通过这种方式布局以后,它负责以下任务:

    • 布置子控件。
    • 最高层窗口可感知的默认大小。
    • 最高层窗口可感知的最小大小。
    • 调整大小的处理。
    • 当内容改变的时候自动更新:
      • 字体大小、文本或者子控件的其它内容。
      • 隐藏或者显示子控件。
      • 移除一些子控件。

    | 版权声明:一去、二三里,未经博主允许不得转载。

    Qt的布局类

    Qt的布局类使用手写的C++代码设计的,所以很容易理解和使用。

    使用Qt Designer创建的界面生成的代码也使用了布局类。涉及用户界面开发时,Qt Designer非常有用,因为它避免了编译、链接、运行这样一个循环。

    描述
    QBoxLayout 水平或垂直排列控件
    QButtonGroup 组织按钮的容器
    QFormLayout 管理输入控件和其相关的标签
    QGraphicsAnchor 表示在QGraphicsAnchorLayout中两个项目之间的锚
    QGraphicsAnchorLayout 在图形视图中可以将锚连接到一起
    QGridLayout 网格布局(多行多列)
    QGroupBox 带标题的分组框
    QHBoxLayout 水平排列控件
    QLayout 几何管理器的基类
    QLayoutItem 抽象的操作布局Item
    QSizePolicy 描述水平和垂直大小调整的策略
    QSpacerItem 布局中的空间隔
    QStackedLayout 切换控件,同一时间只有一个控件可见
    QStackedWidget 切换控件,同一时间只有一个控件可见
    QVBoxLayout 垂直排列控件
    QWidgetItem 表示一个控件的布局项

    水平、垂直、网格、表单布局

    为窗口提供一个好布局的最佳方式是使用内置的布局管理器:QHBoxLayout、QVBoxLayout、QGridLayout和QFormLayout。这些类都派生自QLayout,QLayout又派生自QObject(非QWidget),布局窗口自动地把子窗口按照它们被构造地顺序进行布局。要生成更复杂的布局,可以在其它布局里面嵌入另一个布局。

    • QHBoxLayout:把子窗口从左到右排列在一个水平行上。

    这里写图片描述

    • QVBoxLayout:把子窗口从上到下排列在一个垂直列上。

    这里写图片描述

    • QGridLayout:把子窗口排列在一个二维的网格中,窗口可占据多个单元格。

    这里写图片描述

    • QFormLayout:把子窗口按照标签-输入框的形式排列在两列。

    这里写图片描述

    代码布局

    下面的代码创建一个管理五个按钮的水平布局,上面的第一张图所示:

    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();

    对于QVBoxLayout代码是相同的,除了QHBoxLayout 和QVBoxLayout区别以外。对于QGridLayout有点不同,因为需要指定子控件的行和列的位置:

    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();

    第三个QPushButton占据2列。通过指定QGridLayout:: addWidget()的第五参数为2来实现。

    QFormLayout将在一行上添加两个控件,通常是QLabel和QLineEdit。在同一行中添加QLabel和QLineEdit,将把QLineEdit设置为QLabel的伙伴(在一起。。。(⊙o⊙))。下面的代码将使用QFormLayout将3个QPushButton和相应QLineEdit排列起来。

    QWidget *window = new QWidget;
    QPushButton *button1 = new QPushButton("One");
    QLineEdit *lineEdit1 = new QLineEdit();
    QPushButton *button2 = new QPushButton("Two");
    QLineEdit *lineEdit2 = new QLineEdit();
    QPushButton *button3 = new QPushButton("Three");
    QLineEdit *lineEdit3 = new QLineEdit();
    
    QFormLayout *layout = new QFormLayout;
    layout->addRow(button1, lineEdit1);
    layout->addRow(button2, lineEdit2);
    layout->addRow(button3, lineEdit3);
    
    window->setLayout(layout);
    window->show();

    使用布局提示

    当使用布局的时候,构建子控件的时候不需要指定parent,布局将会自动的指定parent(使用QWidget::setParent()),使它们成为安装了该布局的界面的子控件。

    注意:布局中的控件是安装了该布局的界面的子控件,而非布局自身的,控件只能以控件作为parent,不能是布局。

    也可以在布局中使用addLayout()来添加布局,内部的布局就会变成它的子布局。

    为布局添加控件

    当添加一个控件到一个布局中,布局过程工作如下:

    • 所有的控件将最初根据它们的 QWidget::sizePolicy()和QWidget::sizeHint()而被分配到一定空间中。

    • 如果任何一个控件有一个伸展因素设置,而且数值大于零,那么它们就会被根据它们的伸展因素的比例分配空间。

    • 如果任何一个控件有一个伸展因素设置而且数值为零,那么只有当其它控件不再需要空间的时候才会得到更多的空间。在这当中,空间会首先被根据延展大小策略分配给控件。

    • 任何控件被分配的空间的大小如果小于它们的最小大小(或者是在没有规定最小大小时的最小大小的提示),它们就会被按它们所需要的最小大小分配空间。(如果控件的伸展因素是它们的决定因素的情况下,它们不必有最小大小或者最小大小的提示。)

    • 任何控件被分配的空间的大小如果大于它们的最大大小,它们就会被按它们所需要的最大大小分配空间。(如果控件的伸展因素是它们的决定因素的情况下,它们不必有最大大小。)

    伸展因素

    控件通常是在没有伸展因素设置的情况下被生成的。当它们被布置到一个布局中时,控件会被根据它们的QWidget::sizePolicy()或者它们的最小大小的提示中大的那一个分配给整个空间的一部分。伸展因素是用来根据控件互相的比例来改变它们所被分配的空间。

    如果你使用一个QHBoxLayout来布置没有伸展参数设置的三个控件,我们就会得到像下面这样的布局:

    这里写图片描述

    如果我们给每个控件设置一个伸展因素,它们就会被按比例布置(但是不能小于最小大小的提示),举例来说:

    这里写图片描述

    布局中自定义控件

    当你创建自己的控件类时,也应该传递它的布局属性。如果这个控件有一个QLayout,这样的话就已经被处理了。如果这个控件不包括任何子控件,或者使用自定义布局,需要重新实现下面这些QWidget的成员函数:

    • QWidget::sizeHint() 返回控件的优先选用的大小。
    • QWidget::minimumSizeHint() 返回控件所能有的最小大小。
    • QWidget::setSizePolicy() 指定控件所需要的空间。

    只要大小提示、最小大小提示或者大小策略发生改变,都要调用QWidget::updateGeometry()。这会引起布局的重新计算。对updateGeometry()的多重调用只会引起一次重新计算。

    如果你的控件的优先选用的高度依赖于它的实际宽度(比如一个自动断词的标签),在sizePolicy()中设置hasHeightForWidth()标记,并且重新实现QWidget::heightForWidth()。

    即使你实现了heightForWidth(),提供一个好的sizeHint()仍然是必需的。

    进一步实现,请参考:Trading Height for Width.。

    手动布局

    如果要生成一种特殊的布局,也可以按上面的描述来生成一个自定义控件。重新实现QWidget::resizeEvent()来计算所需要分配的大小并且给每一个子控件调用setGeometry()。

    当布局需要重新计算的时候,控件会得到一个类型是QEvent::LayoutRequest的事件。重新实现被通知QEvent::LayoutRequest事件的QWidget::event()。

    如何编写自定义布局管理器

    手动布局另一种方法是通过继承QLayout类来实现自己的布局管理器。

    请参考:

    展开全文
  • Qt布局管理器的使用(一)

    千次阅读 2014-08-31 15:25:30
    Qt中的控件布局
  • qt布局管理器入门

    2018-09-14 21:17:04
    1.Qt布局管理器的简介 Qt Designer 是一个可视化的基于 Qt 的用户界面设计工具。用来生成 ui 定义文件,而不考虑具体的语言。很好使用,掌握其中的布局管理是学习好Qt Designer的关键。 布局管理器——在创建...
  • 布局管理器[Qt教程]

    千次阅读 2020-02-23 18:08:13
    1、布局管理器 2、QBoxLayout和QGridLayout 1、QBoxLayout 2、QGridLayout 3、小结 3、QFormLayout和QStackedLayout 1、QFormLayout 2、QStackedLayout 3、小结 4、布局管理综合实例 1、需求分析 2、编程...
  • Qt中的布局管理器

    千次阅读 2017-09-12 20:11:18
    Qt中窗口组件的基类QWidget有两组重载函数用于实现窗口组件的绝对定位://定位窗口的坐标 void move(const QPoint &) void move(int x, int y) //定义窗口占据的大小 void resize(const QSize &) void resize(int w,...
  • Qt designer 中的布局与打破布局

    万次阅读 2012-09-04 15:53:08
    如果想让控件能随着窗口的改变而适应窗口,那么你应该使用布局管理器。当使用了窗口管理器后你就不能自定义窗口里面的个别控件了。如果不得不改变控件,那么你就得“打破布局。 布局管理器中有: 1.水平布局 2....
  • Qt 布局管理器 基础学习是本文要介绍的内容,学习Qt的时候,参照帮助手册和相关书籍,其中的例子几乎都是手动的编写代码。至于方便设计界面的Qt designer的例子几乎就没有,想在designer中实现子窗口...1.Qt布局管理器
  • QT 布局管理器的嵌套使用

    千次阅读 2015-10-01 21:51:05
    int main(int argc,char *argv[]) { QApplication a(argc,argv); QWidget *win=new QWidget(0); QLineEdit *line=new QLineEdit(win); line->setText("Line");...QTextEdit *text=new QTextEdit(win);...
  • QT布局管理器有水平布局、垂直布局、栅格布局、窗体布局,如图1左边列表所示 图1 这里我就以我实际的工程为例,在图1的右侧就是实际的资源界面,最上面是一个Tab Widget,中间是一些Button、La
  • 使用Qt Designer来设计界面

    万次阅读 多人点赞 2017-09-27 16:25:58
    介绍Qt Designer,是一个直观可见的全方位 GUI 构造,它所 设计出来的用户界面能够在多种平台上使用。它是 Qt SDK 的一部分,也是最为重要的开发 工具之一。利用 Qt Designer,我们可以拖放各种 Qt 控件构造图形...
  • 使用Qt Designer进行布局

    万次阅读 2018-08-14 20:48:08
    欢迎加入QQ群:853840665,群内分享大量资料,供大家学习  在使用Form之前,需要将Form上的对象放置到布局中。这确保在应用程序中预览或...通过选择需要管理的对象并使用主工具栏、菜单或上下文菜单应用到标准布局...
  • QT布局管理器(QVBoxLayout,QHBoxLayout)不同部分比例大小设置方法 默认情况如果将多个控件加入到QT的布局管理器中(QVBoxLayout、QHBoxLayout)所有控件占用的宽度/高度是等比例大小的。然后,在实际应用和...
  • 设置背景图片 //设置背景图片 //QPixmap pixmap(":/png/background.png"); QPixmap pixmap(":/png/back640-480.png"); QPalette palette; pa
  • Qt的5种常用布局搭建

    万次阅读 2017-05-10 20:29:42
    Qt布局详解:   界面开发首先要对整个界面进行布局,使窗体上的所有的控件必须有一个合适的尺寸和位置。那么做出来的界面才看起来美观。 那么如何对界面进行布局呢?Qt提供了一些类负责排列窗体上的控件,主要有:...
  • 最近在做本科毕设,用到了Qt,无奈本人实在是太过于小白了,很多东西都进行了很久的探索,比如今天说到的窗体控件布局...一把辛酸泪  首先就是创建一个GUI文件,然后进行UI设计,这里就只需要从左边进行拖拽,这个...
  • Qt图片自适应窗口控件大小

    万次阅读 热门讨论 2011-09-06 11:58:53
    最近在用Qt设计一个小程序, 想让一幅图片自适应窗口大小,由于本人比较笨,一直找不到好方法。 找到了很多方法但都会出一些小问题, 刚刚摸索出解决办法了,在些记录。 思想: 1 显示图像是用...
  • 详解 QT 布局管理界面 图文并茂

    万次阅读 2014-08-02 21:30:55
    水平布局管理器可以把它所管理的部件以水平的顺序依次排开,例如上图中中间的“Centigrade”和“Fahrenheit”两段文字,就是水平排列的,这个时候就可以用水平布局管理器来实现。 垂直管理器类似,它可以把它所管理...
1 2 3 4 5 ... 20
收藏数 7,758
精华内容 3,103
热门标签
关键字:

qt布局管理器