【Qt】界面布局

03-03 1267阅读

Qt常用布局

除Qt Designer支持可视化设计和布局界面之外,Qt 提供了代码方式来进行界面布局,

【Qt】界面布局
(图片来源网络,侵删)

以下是几种常用的界面布局方式:

  1. 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout):

    • QHBoxLayout和QVBoxLayout分别用于水平和垂直方向上的布局。你可以将QWidget添加到这些布局中,并设置伸展因子(stretch factor)、对齐方式(alignment)、间距(spacing)等。这两种布局是最常见的布局方式,而且效果很好。
    • 栅格布局(QGridLayout):

      • QGridLayout允许你以行和列的方式来进行布局。你可以指定每个控件所在的行、列以及占据的行数和列数,从而创建一个网格状的布局。
      • 表单布局(QFormLayout):

        • QFormLayout是用于表单输入的布局管理器,它将标签和输入控件成对地进行布局,非常适合用于输入表单等场景。
        • 堆叠布局(QStackedLayout):

          • QStackedLayout可以让你在同一个空间内进行多个页面或控件的切换,只显示其中一个控件,常用于实现向导式的页面切换功能。
          • 网格网格包布局(QGridLayout):

            • QGridLayout 是一个灵活的网格布局,可以非常精确地控制控件的位置以及跨度。

通过合理地选择和使用这些不同类型的布局管理器,可以很方便地实现界面的布局,并且能够很好地适应不同的窗口大小和语言环境。

Qt的UI设计器很方便,为什么还要手写代码?

  1. 定制化需求: UI设计器可以满足许多通用的布局和控件需求,但是当你有一些特殊的、定制化的界面需求时,有时候需要通过手写代码来实现更灵活的布局和交互效果。

  2. 动态创建界面: 当需要动态地在程序运行时创建或修改界面元素时,代码创建界面会更为方便。有时候一个界面的布局需要根据数据或其他条件来动态调整,这时候手写代码比可视化界面更灵活。

  3. 复杂逻辑: 一些复杂的界面逻辑、事件处理、动画效果等可能很难通过UI设计器的可视化工具直接实现,这时候手写代码将更为方便。

  4. 团队协作: 在团队协作中,有时候为了维护代码的一致性和可读性,团队可能会选择采用手写代码的方式来创建界面。

虽然UI设计器提供了很多便利,但是它并不能完全替代手写代码。在实际的软件开发过程中,通常会结合使用UI设计器和手写代码的方式,根据实际需求来选择合适的方式来构建界面。

水平布局

水平布局头文件:#include

创建水平布局:QHBoxLayout *layout = new QHBoxLayout(父窗口指针);

布局相关方法:

  • addWidget:在布局里添加一个控件
  • addLayout:在布局里添加布局
  • setMargin(int margin):设置布局与其包含的控件之间的间距。
  • setSpacing(int spacing):设置布局内部控件之间的间距(spacing)。
  • addSpacing(int spacing):向布局中添加一个指定宽度的空白区域。
  • addStretch(int stretch = 0):向布局中添加一个伸展因子(stretch factor)。

    下面是一个简单的介绍如何在Qt中创建水平布局的步骤:

    步骤1:包含必要的头文件

    #include 
    #include 
    #include 
    #include 
    #include 
    

    步骤2:创建父级QWidget

    QWidget *parentWidget = new QWidget;
    

    步骤3:创建要放入水平布局中的控件

    QLabel *label = new QLabel("Name:");
    QLineEdit *lineEdit = new QLineEdit();
    QPushButton *button = new QPushButton("Submit");
    

    步骤4:创建水平布局并将控件添加到布局中

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(label);
    layout->addWidget(lineEdit);
    layout->addWidget(button);
    

    步骤5:将水平布局设置为父级QWidget的布局

    parentWidget->setLayout(layout);
    

    以上成功创建了一个包含标签、文本框和按钮的水平布局。当将父QWidget放置在窗口或另一个布局管理器中时,水平布局将会被正确显示。

    需要注意的是,在把控件加入到布局中时,它们会按加入的顺序从左至右进行排列。如果窗口大小不够大,控件可能会被挤到下一行。这时候可以设置伸展因子使得布局更灵活。

    竖直布局

    竖直布局头文件:#include

    创建竖直布局:QVBoxLayout *layout = new QVBoxLayout(父窗口指针);

    下面是一个简单的介绍如何在Qt中创建竖直布局的步骤:

    步骤1:包含必要的头文件

    #include 
    #include 
    #include 
    #include 
    #include 
    

    步骤2:创建父级QWidget

    QWidget *parentWidget = new QWidget;
    

    步骤3:创建要放入竖直布局中的控件

    QLabel *label1 = new QLabel("Name:");
    QLineEdit *lineEdit1 = new QLineEdit();
    QLabel *label2 = new QLabel("Email:");
    QLineEdit *lineEdit2 = new QLineEdit();
    QPushButton *button = new QPushButton("Submit");
    

    步骤4:创建竖直布局并将控件添加到布局中

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label1);
    layout->addWidget(lineEdit1);
    layout->addWidget(label2);
    layout->addWidget(lineEdit2);
    layout->addWidget(button);
    

    步骤5:将竖直布局设置为父级QWidget的布局

    parentWidget->setLayout(layout);
    

    以上成功创建了一个包含标签、文本框和按钮的竖直布局。当将父QWidget放置在窗口或另一个布局管理器中时,竖直布局将会被正确显示。

    与水平布局类似,也可以使用一些布局的方法来调整外边距、内部空白和添加伸展因子等。

    栅格布局

    使用QGridLayout来创建栅格布局,该布局将控件放置在一个二维网格内,使其在行和列中对齐。

    水平布局头文件:#include

    创建水平布局:QGridLayout* layout = new QGridLayout(父窗口指针);

    添加控件:addWidget()

    添加布局:addLayout()

    设置水平间距:setHorizontalSpacing()

    设置垂直间距:setVerticalSpacing()

    以下是一个简单的介绍如何在Qt中创建栅格布局的步骤:

    步骤1:包含必要的头文件

    #include 
    #include 
    #include 
    #include 
    #include 
    

    步骤2:创建父级QWidget

    QWidget *parentWidget = new QWidget;
    

    步骤3:创建要放入栅格布局中的控件

    QLabel *label1 = new QLabel("Name:");
    QLineEdit *lineEdit1 = new QLineEdit();
    QLabel *label2 = new QLabel("Email:");
    QLineEdit *lineEdit2 = new QLineEdit();
    QPushButton *button = new QPushButton("Submit");
    

    步骤4:创建栅格布局并将控件添加到布局中

    QGridLayout *layout = new QGridLayout;
    layout->addWidget(label1, 0, 0);  // 将 label1 放在第 0 行、第 0 列
    layout->addWidget(lineEdit1, 0, 1); // 将 lineEdit1 放在第 0 行、第 1 列
    layout->addWidget(label2, 1, 0); // 将 label2 放在第 1 行、第 0 列
    layout->addWidget(lineEdit2, 1, 1); // 将 lineEdit2 放在第 1 行、第 1 列
    layout->addWidget(button, 2, 0, 1, 2); // 将 button 放在第 2 行、第 0 列,并且占据2列
    

    步骤5:将栅格布局设置为父级QWidget的布局

    parentWidget->setLayout(layout);
    

    以上创建了一个包含标签、文本框和按钮的栅格布局。当将父QWidget放置在窗口或另一个布局管理器中时,栅格布局将会被正确显示。

    栅格布局允许在行和列中对齐控件,并支持控件占据多个单元格。

    分裂器布局

    在Qt中,可以使用QSplitter类来创建分隔布局,这允许用户在窗口内部拖动分隔器来改变子控件的大小。这对于需要动态调整子控件大小的应用程序非常有用。

    下面是一个简单的介绍,介绍如何在Qt中创建一个分隔器布局:

    步骤1:需要包含必要的头文件:

    #include 
    #include 
    #include 
    

    步骤2:使用QSplitter类来创建一个分隔器布局,并将要放置在其中的控件添加到分隔器中。

    QSplitter *splitter = new QSplitter(Qt::Horizontal); // 创建一个水平分隔器
    QLabel *label = new QLabel("Left Panel"); // 创建一个标签
    QTextEdit *textEdit = new QTextEdit(); // 创建一个文本编辑框
    splitter->addWidget(label); // 将标签放入分隔器中
    splitter->addWidget(textEdit); // 将文本编辑框放入分隔器中
    

    步骤3:将分隔器布局放入窗口的布局中,或者将其设置为窗口的主布局,以便在应用程序中显示出来。

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(splitter);
    setLayout(mainLayout);
    

    以上,当运行应用程序时,会看到一个可以拖动的分隔器,用来调整左侧和右侧控件的大小。

    使用QSplitter可以轻松地创建分隔布局,使得窗口中的控件可以以用户友好的方式进行动态调整大小。

    布局删除重构

    在Qt中,对于已经创建的布局,如果想要删除并重构它们,可以采取以下步骤:

    1. 删除布局:首先,需要从父级QWidget中删除已经存在的布局。

    假设有一个布局对象 layout,可以使用以下代码将其从父级QWidget中删除:

    QWidget *parentWidget = ...; // 获取父级QWidget的指针
    delete parentWidget->layout(); // 删除父级QWidget上的布局
    
    1. 清理子控件:在删除布局之后,需要清理掉所有在该布局中的子控件,以确保不会留下任何残余。
    QLayout *layout = parentWidget->layout(); // 获取父级QWidget上的布局
    QLayoutItem *child;
    while ((child = layout->takeAt(0)) != 0) { // 逐个删除布局中的子控件
        delete child->widget(); // 删除子控件
        delete child; // 释放子控件所占用的内存
    }
    
    1. 重新构建布局:将删除的布局替换为新的布局。
    QVBoxLayout *newLayout = new QVBoxLayout; // 创建一个新的垂直布局
    // 添加控件到新布局中
    newLayout->addWidget(new QPushButton("New Button"));
    newLayout->addWidget(new QLabel("New Label"));
    // 将新布局设置为父级QWidget的布局
    parentWidget->setLayout(newLayout);
    

    通过上述步骤,可以将现有布局删除并重构为一个全新的布局。这在某些情况下是非常有用的,尤其是在需要动态调整界面布局的情况下。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]