精华内容
下载资源
问答
  • QT5框架

    千次阅读 2017-04-13 10:51:51
    3qt qml和qt quick框架 QML语言 1qml中基本元素 11 基本可视化项 12基本的交互项事件处理 13状态 14图形效果 15动画和变换 16工作中的数据 17视图 18定位器布局管理 19实用 110变换1.Qt5安装 下


    # 1.Qt5安装

    下载qt5 http://download.qt.io/official_releases/qt/5.8/5.8.0/
    选择qt-opensource-linux-x64-5.8.0.run
    进入qt-opensource-linux-x64-5.8.0.run目录下,修改文件权限:qt-opensource-linux-x64-5.8.0.run;
    打开安装界面: ./qt-opensource-linux-x64-5.8.0.run;
    图形化界面安装;
    进入Qt5.3.1/Tools/QtCreater/bin/,可以鼠标双击qtcreater启动;
    ##1.1qt5中中文输入(qt5.5版本之后这个方法就无效了)
    安装fcitx-frontend-qt5,如果安装成功会在其下有个plugin目录
    sudo apt-get install fcitx-frontend-qt5
    然后将/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so 复制到 qt安装目录下的Tools/QtCreator/bin/plugins/platforminputcontexts/和5.4/gcc_64/plugins/platforminputcontexts/下

    Qt Creator是跨平台的 Qt IDE,Qt Creator 的设计目标是使开发人员能够利用 Qt 这个应用程序框架更加快速及轻易的完成开发任务。

    #2.Qt5框架

    2.1Qt的跨平台性(Linux、Unix、、Mac OS、Android、iOS)

    qt的跨平台性

    1.Qt/Windows对应的是GDI(Graphics Device Interface),它是Qt封装的与GDI交流的API。而GDI是Windows下图形绘制及显示的主要API。
    2.Qt/X11同样是对X Windows的编程接口。Linux本身是没有操作界面的,目前主流带有操作界面的Linux系统都是基于X WIndows,X Windows是C/S框架的(就是所有的鼠标事件传递到X Windows的服务端处理之后对应在屏幕上显示内容),Qt/X11使用Xlib直接与X服务器通信的。(GDI是集成到Windows内核的,而X Windows只是Linux系统的应用软件而已)
    3.Qt/Macintosh就不用说了。Carbon是Mac OS X下应用程序开发环境,包含了应用程序的图形部分。目前主流的Cocoa好像使用更好。
    上图主要说明的是UI部分,Qt跨平台都是调用本地的图形风格。

    ##2.2Qt模块
    qt5模块架构
    基本模块

    modedescription
    Qt Core其他模块使用的核心非图形类
    Qt Gui图形用户界面(GUI)组件的基类。 包括OpenGL
    Qt Multimedia音频,视频,广播和相机功能的类
    Qt Multimedia Widgets用于实现多媒体功能的基于窗口小部件的类
    Qt Network使网络编程更容易,更便携的类
    Qt QMLQML和JavaScript语言的类
    Qt Quick用自定义用户界面构建高度动态应用程序的声明性框架
    Qt Quick-2
    Qt SQL使用SQL进行数据库集成的类
    Qt Test单元测试Qt应用程序和库的类
    Qt Widgets使用C ++小部件来扩展Qt GUI的类

    扩展模块

    modedescription
    Qt 3D支持2D和3D渲染的近实时仿真系统的功能
    Qt Bluetooth提供对蓝牙硬件的访问
    Qt Concurrent在不使用低级线程原语的情况下编写多线程程序的类
    Qt D-Bus通过D-Bus协议进行进程间通信的类
    Qt Location在QML应用程序中显示地图,导航和放置内容
    Qt NFC提供对近场通信(NFC)硬件的访问
    Qt OpenGLOpenGL支持类。不推荐使用Qt GUI模块中的QOpenGL *类
    Qt Positioning提供位置,卫星和区域监控课程
    Qt Print Support使打印更容易和更便携的类
    Qt Script用于编写Qt应用程序的类可以编写脚本。不推荐使用Qt QML模块中的QJS *类
    Qt Script Tools使用Qt Script的应用程序的其他组件
    Qt SVG用于显示SVG文件内容的类。支持SVG 1.2 Tiny标准的一个子集
    Qt WebChannel提供从HTML客户端访问QObject或QML对象的功能,以便将Qt应用程序与HTML / JavaScript客户端无缝集成
    Qt WebChannel提供从HTML客户端访问QObject或QML对象的功能,以便将Qt应用程序与HTML / JavaScript客户端无缝集成
    Qt WebSockets提供符合RFC 6455的WebSocket通信
    Qt XML注意:这个模块不需要使用QXmlStreamReader和QXmlStreamWriter。他们已经是Qt Core的一部分了
    Qt XML Patterns支持XPath,XQuery,XSLT和XML模式验证

    ##2.3qt qml和qt quick框架

    QML是一种编程语言
    Qt Qml为QML语言开发应用程序提供一个框架
    Qt Quick是QML的一个标准库,提供两种接口:1.使用qml语言创建应用的qml接口和使用c++语言扩展qml的c++接口,使用QtQuick模块,设计者和开发者可以很容易使用QML建立带有流畅动画的用户界面,并将这些界面连接到后端的C++库上面。

    qt5中qml和qt quick完全分离,
    qt5中qt qml和qt quick框架

    这里Qt 4.x版本 提供的 Qt Quick 1 ,qt5.x版本主要用的是qt quick2.qt5.x版本为了兼容低版本,因此继承了qt quick1

    Quick1只能做一些变形旋转而没有更牛的特效了,因为QPainter确实不能做那个,然而qt quick2的功能比较厉害,因为经过了Qt GUI、OpenGL、Scene Graph三层封装。强调的是如何高效的绘制图形并按要求创建各种效果。所以里面包含了可视化类型(QML)、交互类型、动画、模型视图、粒子特效、渲染特效等。

    #3.QML语言
    介绍完了qt5框架,接下来学习下qml语言

    通常我们在构建ui界面的时候有两种方式,1.用qml语言来编写ui界面,2.我们创建的qt quick application目录中有个.ui.qml来绘制ui界面,(layout形式绘制)
    第二种方法绘制的ui界面占用的内存相对大些

    第二种方法绘制ui
    使用第一种方法就要学习qml语言

    ##3.1qml中基本元素:

    ###3.1.1 基本可视化项

    Item 基本的项元素 在QML中所有可视化都继承他
    Rectangle 基本的可视化矩形元素
    Gradient 定义一个两种颜色的渐变过程
    GradientStop 定义个颜色,被Gradient使用
    Image 在场景中使用位图
    BorderImage(特殊的项) 定义一张图片并当做边界
    AnimatedImage 为播放动画存储一系列的帧
    Text 在场景中使用文本
    TextInput 显示单行可编辑的纯文本
    TextEdit显示多行的可编辑文本
    IntValidator int 验证器
    DoubleValidator double 验证器
    RegExpValidator 验证字符串正则表达式
    TextEdit 显示多行可编辑文本

    ###3.1.2基本的交互项(事件处理)

    MouseArea 鼠标句柄交互
    MouseEvent鼠标事件
    WheelEvent滚动事件
    DrangEvent拖放事件
    FocusScope 键盘焦点句柄
    focus键盘事件
    Flickable 提供一种浏览整张图片的一部分的效果,具体看例子
    Flipable 提供一个平面,可以进行翻转看他的前面或后面,具体看例子
    Timer定时器

    ###3.1.3状态

    State 定义一个配置对象和属性的集合
    PropertyChanges 使用一个State描述属性的改变
    StateGroup 包含一个状态集合和状态变换
    ParentChange 重新定义父集,也就是换个父节点
    AnchorChanges 在一个状态中改变anchors

    ###3.1.4图形效果
    使用图形效果模块,要在.qml文件中导入
    import QtGraphicalEffects 1.0

    Gradient 定义一个两种颜色的渐变过程
    Blend混合效果
    Color颜色效果
    Distortion变形效果
    DropShadow阴影效果
    Blur模糊效果
    Glow发光效果
    OpacityMask遮罩效果

    ###3.1.5动画和变换

    Behavior 默认的属性变换动画
    SequentialAnimation 对定义的动画串行播放
    ParallelAnimation 对定义的动画并行播放
    PropertyAnimation 属性变换动画
    NumberAnimation 对实数类型属性进行的动画
    Vector3dAnimation 对QVector3d进行的属性
    ColorAnimation 颜色进行的变换动画
    RotationAnimation 对旋转进行的变换动画
    ParentAnimation 对父节点进行变换的动画,改变绑定的父节点
    AnchorAnimation 对anchor 进行改变的动画
    PauseAnimation 延迟处理
    SmoothedAnimation 允许属性平滑的过度
    SpringAnimation 一种加速的效果
    PropertyAction 允许在动画过程中对属性的直接改变
    ScriptAction 允许动画过程中调用脚本
    Transition 在状态变换中加入动作变化

    ###3.1.6工作中的数据

    Binding 在创建的时候绑定一些数据到一些属性
    ListModel 定义链表数据
    ListElement 定义ListModel的一个数据项
    VisualItemModel 包含可视化项(visual items)到一个view中,相当是一个容器
    VisualDataModel 包含一个model和一个delegate,model包含需要的数据,delegate设计显示的项的信息,具体的去看例子
    Package 他的目的是把VisualDataModel共享给多个view,具体还要学习
    XmlListModel 特殊的一个模式使用XPath表达式,使用xml来设置元素,参考例子
    XmlRole XmlListModel的一个特殊的角色

    ###3.1.7视图

    ListView 提供一个链表显示模型视图
    GridView 提供一个网格显示模型视图
    PathView 提供一个内容沿着路径来显示的模型
    Path 定义一个PathView使用的轨迹
    PathLine 定义一个线性的轨迹
    PathQuad 定义一个二次贝塞尔曲线的轨迹
    PathCubic 定义一个三次贝塞尔曲线的轨迹
    PathAttribute 允许绑定一个属性上,具体看例子
    PathPercent 修改item分配的轨迹 不是很明了其中的意思
    WebView 允许添加网页内容到一个canvas上

    ###3.1.8定位器(布局管理)

    Column 将几个子项目排成一列
    Row 将几个子项目排成一行
    Grid 设置它的子项目到一个网格上
    Flow 目的是不让他的子项重叠在一起,将子项目从前向后,像流一样布局
    anchors锚
    Layouts布局管理器
    LayoutMirroring在水平方向镜像锚布局

    ###3.1.9实用

    Connections 明确连接信号和信号句柄
    Component 封装QML items 想一个组件一样
    Timer 提供时间触发器
    QtObject 基本的元素只包含objectName属性
    Qt qml全局Qt object提供使用的枚举和函数
    WorkerScript 允许在QML使用线程
    Loader 控制载入item或组件
    Repeater 使用一个模型创建多个组件
    SystemPalette 为Qt palettes提供一个通道
    FontLoader 载入字体根据名字或URL
    LayoutItem 允许声明UI元素插入到qtGraphicsView 布局中

    ###3.1.10变换

    Scale 分派item 缩放行为
    Rotation 分派item 旋转行为
    Translate 分派item 移动行为

    下面文章将会介绍Qt quick中项目属性

    展开全文
  • QT 布局管理

    万次阅读 2010-03-11 09:45:00
    QT 布局管理作者:刘旭晖 Raymond 转载请注明出处Email:colorant@163.comBLOG:http://blog.csdn.net/colorant/ 狭义的说,QT布局管理框架指的是以QLayoutItem/QLayout为基类的布局管理体系(应该说,对于...

    QT 布局管理

    作者:刘旭晖 Raymond 转载请注明出处
    Email:colorant@163.com
    BLOG:http://blog.csdn.net/colorant/

     

    狭义的说,QT的布局管理框架指的是以QLayoutItem/QLayout为基类的布局管理体系(应该说,对于QGraphicsSystem, 还有以QGraphicsLayoutItem/QGraphicsLayout为基类的一系列相关子类)

     

    但是如果广义的说,布局就是管理控件的位置和尺寸的话,在QT中一共有三种方式

    • 绝对定位:在代码中调用QWidget::setGeometry()函数,对控件进行绝对定位
    • 手工定位:在resizeEvent等函数中,根据参数变化,撰写代码对控件进行定位
    • 使用布局管理器定位:使用QLayout类管理控件

    布局 VS 控件

    在GTK中,Layout和Widget并没有截然分开,不存在单独的Layout类,每个控件都要自己负责管理自己的子控件的布局,只不过有些控件管理的多些,或者基本上专门用来管理布局,而有些则管理的少一些。

     

    而在QT中,Layout和Widget是相对独立的类,但是Layout本身单独存在并没有意义,需要和Widget配合使用。而Widget本身不负责子控件的布局管理。你可以认为,Layout类其实只是一组预先撰写好的代码,在父控件尺寸变化时,根据预设参数和子控件的各种Geometry hint,管理控件的位置和尺寸。

     

    不过,也有一些例外,比如QMainWindow类,就自己管理预设的子控件的布局。

    一点内部逻辑

    **Layout如何管理Widget,层次关系**

    • 首先是要通过QWidget::setLayout函数,将一个QLayout类设置为控件的布局管理器。这一步实际也将这个控件设置为QLayout类的父控件。
    • 而后,通常通过QLayout::addWidget()等函数,将widget添加到Layout类的布局管理体系中

    但是,Layout本身并不是Widget的父控件,因为QWidget类的父控件只能是QWidget类,所以Layout将其管理的子控件的父控件重定向为自己的父控件。

     

    另外,因为QWidget类本身并不是一个QLayoutItem,而Qlayout的管理又是以QLayoutItem为单位。所以,在addWidget的操作中,QLayout还会创建一个QLayoutItem的子类QWidgetItem类来对应的包装代理添加进来的子控件。QWidgetItem对象最终会将QLayout布局管理体系中的布局参数信息装换、设置到它所代理的QWidget对象上


    分组式(堆栈式)布局

    QStackedLayout个人觉得叫分组布局有些歧义,还是直译堆栈布局比较合适。这个Layout类管理子控件的方式和其它QBoxLayout,QGridLayout等不太一样,比较特殊。QStackedLayout不侧重于子控件的位置管理,它所管理的子控件是叠加在一起的,主要控制哪个子控件位于最上层

     

    可以通过设置参数,决定只有当前顶层控件可见(默认行为),还是所有子控件都可见(这样可以实现一些比如叠加显示的效果,当然,要最上层的控件有透明的区域)。

     

    另外,不管堆叠参数如何设置,QStackedLayout的父控件的内容都是可见的,只要当前显示的子控件有透明区域。

     

    展开全文
  • QT布局

    千次阅读 2015-11-01 10:14:58
    在一个Widget中,Qt布局管理系统提供了一个简单而有效的方式来自动组织子widget,以保证他们能够很好地利用可用空间。 介绍 Qt包含一个布局管理类的集合,它们被用来描述widgets如何在应用程序的用户界面中呈现的...

    布局管理

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

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

    介绍

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

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

    l 子widget的定位

    l 窗口的合理默认空间

    l 窗口的合理最小空间

    l 调整大小处理

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

    n 字体、大小或者内容变化

    n 显示或 隐藏widget

    n 移除子widget

    Qt的布局类

    QGraphicsAnchorLayout

    Layout where one can anchor widgets together in Graphics View

    在制图视图中布局widget

    QGraphicsAnchor

    Represents an anchor between two items in a QGraphicsAnchorLayout

    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,一次只显示一个

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

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

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

    clip_image002

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

    clip_image004

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

    clip_image006

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

    clip_image008

    代码举例

    下面代码创建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. 所有分配了小于最小空间(或者设置了最小的size hint)的widget将按要求分配最小空间。(在拉伸系数成为决定因子时,widgets没必要再用最小值或者最小hint)。

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

    拉伸系数

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

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

    clip_image010

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

    clip_image012

    自定义widget的布局

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

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

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

    l 调用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 problems to the layout of its parent widget. Problems occur due to the way rich text is handled by Qt's layout managers when the label is word wrapped.

    In certain cases the parent layout is put into QLayout::FreeResize mode, meaning that it will not adapt the layout of its contents to fit inside small sized windows, or even prevent the user from making the window too small to be usable. This can be overcome by subclassing the problematic widgets, and implementing suitable sizeHint() andminimumSizeHint() functions.

    In some cases, it is relevant when a layout is added to a widget. When you set the widget of a QDockWidget or a QScrollArea (with QDockWidget::setWidget() andQScrollArea::setWidget()), the layout must already have been set on the widget. If not, the widget will not be visible.

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

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

    在一些情况下,当布局被添加到widget时需要特别注意。当设置QDockWidget or a 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()来设置位移量。

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

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

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

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

    l sizeHint(),布局的首选大小

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

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

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

    头文件

    card.h

    #ifndef CARD_H
    #define CARD_H
     
    #include 
    #include 
     
    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 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手册《Layout Management》

    窗体小部件和布局

    窗体小部件

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

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

    布局

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

    窗体小部件的样式

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

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

    窗体小部件的类

    Qt Widget 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提供了一些类负责排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLayout。(布局管理类)这些类简单易用,无论在代码中还是用Qt Designer开发程序都能用到。

    Qt 窗体布局 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

    1)         布局类简介

    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.1.1.       布局管理的三种方式

    Qt中有三种方式对窗体上的控件进行布局管理:绝对位置定位(absolute positioning),手工布局(manual layout),布局管理器(layout managers)

    1.1.1.1.      绝对位置定位(控件布局是固定位置,没有自适应功能)

    例子:

    QWidget *pWidget = new QWidget;

    QLabel label(pWidget);

    label.setText(QObject::tr("姓名:"));

    label.setGeometry(10,10,20,20);

     

    QLineEdit namedLineEdit("小明",pWidget);

    namedLineEdit.setGeometry(35,10,50,20);

     

    QPushButton *btn = new QPushButton(QObject::tr("关闭"),pWidget);

         btn->setGeometry(90,10,40,20);

    图例:

    Qt 窗体布局 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

    1.1.1.1.      手工布局

    给出控件的绝对位置,但是他们的尺寸根据窗口的大小确定,可以通过重写窗体控件的resizeEvent()实现对子控件的大小设置。

     

    1.1.1.1.      布局管理器

     

    例子1:运用QHBoxLayout、QVBoxLayout、QGridLayout布局

    Qt 窗体布局 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

     

     

     

     

    //leftLayout布局设置(表格布局)

    /* QGridLayout: 二维的单元格*/

         QGridLayout *leftLayout = new QGridLayout;

         leftLayout->addWidget(&namedLabel, 0, 0); //起始(0行,0列),尺寸(1行,1列)

         leftLayout->addWidget(&namedLineEdit, 0, 1);

         leftLayout->addWidget(&lookInLabel, 1, 0);

         leftLayout->addWidget(&lookInLineEdit, 1, 1);

         leftLayout->addWidget(&subDirCheckBox, 2, 0, 1, 2);//起始(3行,0列),尺寸(1行,2列)

         leftLayout->addWidget(&tableWidget, 3, 0, 1, 2);

         leftLayout->addWidget(&messageLabel, 4, 0, 1, 2);

       //rightLayout布局设置(垂直布局)

         QVBoxLayout *rightLayout = new QVBoxLayout;

         rightLayout->addWidget(&findButton);

         rightLayout->addWidget(&stopButton);

         rightLayout->addWidget(&closeButton);

    //布局管理器在指定的位置留出一块空间(Qt Designer中,可以加入一个spacer实现这一功能)

         rightLayout->addStretch();

         rightLayout->addWidget(&helpButton);

         //mainLayout布局设置(水平布局)

         QHBoxLayout *mainLayout = new QHBoxLayout;

         mainLayout->addLayout(leftLayout);

         mainLayout->addLayout(rightLayout);

         pWidget->setLayout(mainLayout);//设置Widget窗口控件的布局风格

         pWidget->setWindowTitle(QObject::tr("查找文件及文件夹"));

         

    例子1图列:

    Qt 窗体布局 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

     

     

    1.1.1.1.1.      例子2:运用Stacked Layouts:分组布局

    例子:

    //创建QWidget类的一个对象pWidget

    QWidget *pWidget = new QWidget;

    //创建一个布局管理器类 layout

    QHBoxLayout *manLayout = new QHBoxLayout;

    //左边的列表控件

    QListWidget *listWidget = new QListWidget(pWidget);

    listWidget->addItem(QObject::tr("外观设置"));

    listWidget->addItem(QObject::tr("网页浏览"));

           ...   

     

    //右边的分页控件

    QWidget *page1 = new QWidget(pWidget);

    <…page1上增加控件>

    QWidget *page2 = new QWidget(pWidget);

    <…page2上增加控件>

    <设置布局管理>

    QVBoxLayout *leftLayout = new QVBoxLayout;

    leftLayout->addWidget(listWidget);

    ....

    //右边分页布局(两页窗口)

    QStackedLayout *stackedLayout = new QStackedLayout;

    stackedLayout->addWidget(page1);

    stackedLayout->addWidget(page2);

     

    //通过调用QWidget::setLayout()函数,将layout布局管理器类添加到窗口部件对象pWidget中

    manLayout->addLayout(leftLayout);

    manLayout->addLayout(stackedLayout);

    pWidget->setLayout(manLayout);

     

    listWidget->setCurrentRow(0);

    //关联:列表与分组布局

    QObject::connect(listWidget, SIGNAL(currentRowChanged(int)),

    stackedLayout, SLOT(setCurrentIndex(int)));

    pWidget->show();

    图例:

    Qt 窗体布局 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

    Qt 窗体布局 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

    FROM: http://blog.chinaunix.net/uid-27717694-id-3791914.html



    展开全文
  • 关于Qt布局的例程

    2018-03-12 13:53:28
    关于Qt的水平布局 垂直布局 网格布局的使用例程,以及主框架窗口、分割窗口的使用等
  • Qt布局管理详解

    千次阅读 2017-05-26 15:53:27
    Qt布局管理手册:http://doc.qt.io/qt-5/qtwidgets-index.html#styleshttp://doc.qt.io/qt-5/qtwidgets-index.html#widgetshttp://doc.qt.io/qt-5/qtwidgets-index.html#layouts以下是Qt... 在一个Widget中,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()

    1. <span style=“font-size:12px;”>头文件  
    2.   
    3. card.h  
    4. #ifndef CARD_H  
    5. #define CARD_H  
    6.    
    7. #include <QtGui>  
    8. #include <QList>  
    9.    
    10. class CardLayout : public QLayout  
    11. {  
    12. public:  
    13.     CardLayout(QWidget parent, int dist): QLayout(parent, 0, dist) {}  
    14.     CardLayout(QLayout *parent, int dist): QLayout(parent, dist) {}  
    15.     CardLayout(int dist): QLayout(dist) {}  
    16.     ~CardLayout();  
    17.    
    18.     void addItem(QLayoutItem *item);  
    19.     QSize sizeHint() const;  
    20.     QSize minimumSize() const;  
    21.     int count() const;  
    22.     QLayoutItem *itemAt(intconst;  
    23.     QLayoutItem *takeAt(int);  
    24.     void setGeometry(const QRect &rect);  
    25.    
    26. private:  
    27.     QList<QLayoutItem> list;  
    28. };  
    29. #endif  
    30.   
    31. 实现文件  
    32.   
    33. card.cpp  
    34. #include “card.h”  
    35. int CardLayout::count() const  
    36. {  
    37.         // QList::size() returns the number of QLayoutItems in the list  
    38.     return list.size();  
    39. }  
    40.    
    41. int CardLayout::count() const  
    42. {  
    43.         // QList::size() returns the number of QLayoutItems in the list  
    44.     return list.size();  
    45. }  
    46.    
    47. int CardLayout::count() const  
    48. {  
    49.         // QList::size() returns the number of QLayoutItems in the list  
    50.     return list.size();  
    51. }  
    52.    
    53. CardLayout::~CardLayout()  
    54. {  
    55.      QLayoutItem item;  
    56.      while ((item = takeAt(0)))  
    57.          delete item;  
    58. }  
    59.    
    60. void CardLayout::setGeometry(const QRect &r)  
    61. {  
    62.     QLayout::setGeometry(r);  
    63.    
    64.     if (list.size() == 0)  
    65.         return;  
    66.    
    67.     int w = r.width() - (list.count() - 1)  spacing();  
    68.     int h = r.height() - (list.count() - 1)  spacing();  
    69.     int i = 0;  
    70.     while (i < list.size()) {  
    71.         QLayoutItem *o = list.at(i);  
    72.         QRect geom(r.x() + i  spacing(), r.y() + i * spacing(), w, h);  
    73.         o->setGeometry(geom);  
    74.         ++i;  
    75.     }  
    76. }  
    77. QSize CardLayout::sizeHint() const  
    78. {  
    79.     QSize s(0,0);  
    80.     int n = list.count();  
    81.     if (n > 0)  
    82.         s = QSize(100,70); //start with a nice default size  
    83.     int i = 0;  
    84.     while (i < n) {  
    85.         QLayoutItem *o = list.at(i);  
    86.         s = s.expandedTo(o->sizeHint());  
    87.         ++i;  
    88.     }  
    89.     return s + n*QSize(spacing(), spacing());  
    90. }  
    91.    
    92. QSize CardLayout::minimumSize() const  
    93. {  
    94.     QSize s(0,0);  
    95.     int n = list.count();  
    96.     int i = 0;  
    97.     while (i < n) {  
    98.         QLayoutItem *o = list.at(i);  
    99.         s = s.expandedTo(o->minimumSize());  
    100.         ++i;  
    101.     }  
    102.     return s + n*QSize(spacing(), spacing());  
    103. }  
    104.    
    105. </span>  

    头文件
    card.h
    
    #ifndef CARD_H
    #define CARD_H
    
    #include &lt;QtGui&gt;
    #include &lt;QList&gt;
    
    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 &amp;rect);
    
    private:
        QList&lt;QLayoutItem*&gt; 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 &amp;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 &lt; list.size()) {
            QLayoutItem *o = list.at(i);
            QRect geom(r.x() + i * spacing(), r.y() + i * spacing(), w, h);
            o-&gt;setGeometry(geom);
            ++i;
        }
    }
    QSize CardLayout::sizeHint() const
    {
        QSize s(0,0);
        int n = list.count();
        if (n &gt; 0)
            s = QSize(100,70); //start with a nice default size
        int i = 0;
        while (i &lt; n) {
            QLayoutItem *o = list.at(i);
            s = s.expandedTo(o-&gt;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 &lt; n) {
            QLayoutItem *o = list.at(i);
            s = s.expandedTo(o-&gt;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



    转载自:http://blog.csdn.net/fanyun_01/article/details/52623777

    展开全文
  • 初步学习Qt布局

    2015-04-16 14:07:12
    在一个Widget中,Qt布局管理系统提供了一个简单而有效的方式来自动组织子widget,以保证他们能够很好地利用可用空间。 介绍 Qt包含一个布局管理类的集合,它们被用来描述widgets如何在应用程序的用户界面中...
  • 基于Qt软件框架设计

    千次阅读 多人点赞 2019-04-23 11:56:01
    Qt,在很多人的认识里是一个做界面的框架,只用来做界面,而后端往往是用别的来实现。在本人的实践中, 我把界面与后端的实现都用Qt来实现了。 2、软件分层 一般来说,我们的软件架构会很成很多层,这里我们分三层...
  • qt视图框架Unity Asset Store packageand aUnity Asset Store软件包和开发人员社区的public repositoryfor the developer community.公共资源库获得。 Project Carte Blanche(PCB) is Unity Lab’s research ...
  • Qt布局管理

    千次阅读 2014-10-31 15:56:41
    QT 布局 管理 界面 图文并茂是本文介绍的内容,先来看内容。今天来实现一个温度转换器的 界面 。如下图: 水平 布局 管理器可以把它所管理的部件以水平的顺序依次排开,例如上图中中间的“Centigrade”和...
  • Qt新建项目及Qt设计框架

    千次阅读 2019-05-20 11:53:05
      首先打开Qt,新建一个工程项目项目,   名称和路径不能有中文出现,也不要使用空格,使用字母数字下划线命名   编译选择Qt自己的编译器   选择基类,三种基类的区别前文已经介绍过了,这里我选择...
  • QT框架简介

    千次阅读 2018-11-21 16:45:55
    刚开始接触QT开发的时候用的是Qt 5.6.0版本,开发过程中没有仔细了解过Qt具体的框架结构,只负责项目相关模块用C++进行开发和维护,对QT本身没有关注,只是当成一个开发工具而已。随着维护的内容深入,发现来对整个...
  • 编写自定义布局需要继承QGraphicsLayout,然后实现如下函数: setGeometry():布局的几何形状。 sizeHint():布局大小提示 count():项目数量 itemAt():根据索引获取项 removeAt():从布局中删除索引项。 代码...
  • Qt视图框架坐标

    2018-06-25 00:45:52
    qt的图形试图框架提供基于图元的模型视图编程,功能非常强大。1.图形视图的事件传递:View--------------&gt;Scene---------------&gt;Item事件先传给View,然后View传给Scene,最后Scene传给Item2.坐标系统...
  • 详解 QT 布局管理界面 图文并茂

    千次阅读 2014-07-10 07:50:43
    QT 布局管理界面 图文并茂是本文介绍的内容,先来看内容。今天来实现一个温度转换器的界面。如下图: 水平布局管理器可以把它所管理的部件以水平的顺序依次排开,例如上图中中间的“Centigrade”和...
  • Qt图形视图框架详解

    千人学习 2016-12-07 16:50:42
    Qt图形视图框架详解视频教程,介绍Qt中的Graphics View Framework,涉及View、Scene、Item的关系,如何自定义QGraphicsItem、处理Item之间的关联、如何布局及定义自己的布局Item、如何变幻Item、如何应用动画、如何...
  • Qt5.5.0 框架常用模块纲要

    千次阅读 2017-05-26 16:03:08
    Qt简史 Qt开发环境搭建配置以及编译运行方式 1-1 Qt开发环境搭建 1-2 Qt配置pro文件以及第三方库 1-3 Qt编译运行方式 Qt基础模块 2-1 Core 2-1-1 元对象系统 2-1-1-1 元对象 2-1-1-2 元类型之Q_DECLARE_METATYPE 2-1...
  • 1、图形视图框架布局项QGraphicsLayoutItem是一个抽象类,它定义了一组虚函数,用于描述 QGraphicsLayout 排列的任何对象的大小、大小策略和大小提示。 2、子类化 QGraphicsLayoutItem:如果创建 ...
  • python qt5 框架 Python是一种流行的语言,能够编写脚本以及面向对象的程序。 几个框架提供了Python的GUI(图形用户界面),并且大多数框架都擅长于简单,高效或灵活的事情。 最受欢迎的两个是wxPython和PyQt ,但...
  • Qt图形框架资料01

    千次阅读 2016-08-20 18:00:35
    QT中,GraphicsView是一个与QWdiget系列一点点不一样的系统。这个系统主要由下面几个框架类构成:QGraphicsView, QGraphicsScene, QGraphicsItem QGrahpicsView是从原生的QWidget继承过来,QGraphics-View...
  • QT 布局(转)

    2011-11-19 12:39:00
    狭义的说,QT布局管理框架指的是以QLayoutItem/QLayout为基类的布局管理体系(应该说,对于QGraphicsSystem, 还有以QGraphicsLayoutItem/QGraphicsLayout为基类的一系列相关子类) 但是如果广义的说,布局就是...
  • Qt框架学习总结

    2021-04-26 22:45:56
    参考书目 《C++ GUI Qt4编程》 一、Qt框架概述 1. 什么是Qt? 2. Qt的优点 3. 什么时候用Qt? 二、Qt体系 三、Qt编程练习 Spreadsheet 制作一个电子表格 项目总览 运行效果 关键代码
  • 详解 QT 布局管理界面 图文并茂(1) 2011-07-04 16:57 佚名 互联网 字号:T | T 本文介绍的是QT 布局管理界面 图文并茂,在QT下进行界面设计,可以使用水平、垂直和Grid布局管理器来进行。先来看...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,434
精华内容 2,173
关键字:

qt布局框架