QT(7)自定义Layout

这篇博客介绍了如何在QT中自定义BorderLayout,通过继承QLayout并实现相关方法,包括addItem、addWidget、sizeHint、minimumSize等,来创建一个能够按照北、南、西、东、中五个方向布局的管理器。博主详细讲解了BorderLayout的结构和实现过程,包括数据结构的设计、添加和删除组件、计算布局尺寸等,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

               

我们进一步学习构建稍微复杂一点的布局。通过对抽象类QLayout的继承来进行自己的布局。在这个例子中,我们将重构QLayout类为BorderLayout,QLayout是一个用于布局管理的基础抽象类,而也是QBoxLayout,QGridLayout,QFormLayout和QStackedLayout的继承类。资料来源:

  1. http://doc.qt.nokia.com/latest/layouts-borderlayout.html
  2. http://www.kuqin.com/qtdocument/customlayout.html

一、搭建project的主题框架

我们创建自己的布局类为BorderLayout,使用borderlayout.cpp和borderlayout.h,构造我们的窗口mywindow.h和mywindow.cpp,以及主程序qtmain.cpp。下面是mywindows.cpp的内容,执行后如图所示。

MyWindow:: MyWindow()
{
    QTextBrowser * centralWidget = new QTextBrowser;
    centralWidget->setPlainText(tr("Central widget"));

    BorderLayout * layout = new BorderLayout;
    layout -> addWidget (centralWidget,BorderLayout::Center);
    layout -> addWidget (createLabel("North"),BorderLayout::North);
    layout -> addWidget (createLabel("West"),BorderLayout::West);
    layout -> addWidget (createLabel("East 1"),BorderLayout::East);
    layout -> addWidget (createLabel("East 2"),BorderLayout::East);
    layout -> addWidget (createLabel("South"),BorderLayout::South);
    setLayout(layout);
    setWindowTitle(tr("Border Layout"));
}

QLabel * MyWindow::createLabel(const QString &text)
{
    QLabel * label = new QLabel(text);
    label->setFrameStyle(QFrame::Box |QFrame::Raised);
    return label;
}

二、重点在建立我们的类BorderLayout,我们先建立一个用来存放被布局处理的项目的数据结构QList,每个entry为ItemWrapper,存放组件和位置信息。QLayout的抽象组件为QLayoutItem,实际可以是QLabel等等具体的组件。我们在borderlayout.h中定义:

private:
    struct ItemWrapper
    {
        ItemWrapper(QLayoutItem * i,Position p){
            item = i;
      &

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值