龙空技术网

Qt C++实战:Qt如何实现界面布局自动排版、自定义滚动条?

QT教程 204

前言:

现在你们对“用qt做界面”可能比较关心,你们都需要学习一些“用qt做界面”的相关文章。那么小编也在网摘上搜集了一些对于“用qt做界面””的相关文章,希望你们能喜欢,朋友们快快来了解一下吧!

在一些实际项目中,程序配置界面会有很多的配置参数项(超过几百条),并且这些配置参数项需要通过接口来动态添加。本文就来重点讲下,Qt界面如何利用滚动条显示超多配置参数项,同时还要实现界面布局自动排版等功能。

本示例利用QGridLayhout网格布局管理器,来管理所有的配置参数项,实现界面布局自动排版;同时利用QScrollArea实现界面自定义滚动条的功能,当配置参数项的显示超出当前界面的可视高度,自动显示垂直滚动条。

先看最终配置界面效果:

截图一:

截图二:

下面开始编码实现。

2 增加配置参数项目界面

增加一个继承于QWidget的ui界面类CheckBoxSetItemsWidget。这个类主要有二个作用,一是QWidget做为封装,可以方便的集成到别的界面;二是单独类设计可以添加到QScrollArea实现滚动条功能。

首先需要先修改CheckBoxSetItemsWidget界面为垂直布局(QVBoxLayout),修改方式详见文末。

然后在上方放一个水平布局管理器(QHBoxLayout),在下方放一个网格布局管理器(QGridLayout)。

在界面上方的水平布局管理器里面,添加一个QCheckBox用于实现全选和反选,和一个水平弹簧(QSpacerItem)用于在水平方向自动撑开。

CheckBoxSetItemsWidget.ui界面设计如下图:

CheckBoxSetItemsWidget类设计:

#ifndef CHECKBOXSETITEMSWIDGET_H#define CHECKBOXSETITEMSWIDGET_H#include <QWidget>#include <QString>namespace Ui {class CheckBoxSetItemsWidget;}class CheckBoxSetItemsWidget : public QWidget{    Q_OBJECTpublic:    explicit CheckBoxSetItemsWidget(QWidget *parent = nullptr);    ~CheckBoxSetItemsWidget();    // 设置一行显示几个配置参数    void setRowCount(int iRowCount = 5);    // 添加配置参数项函数    void addCheckBoxItem(const QString& qstrName, bool bChecked = true);private slots:    // 全选&反选功能函数    void slotSelectAllClicked(bool checked = false);private:    Ui::CheckBoxSetItemsWidget *ui;    // 一行配置5个QCheckBox配置参数项    int m_iRowCount{ 5 };};#endif // CHECKBOXSETITEMSWIDGET_H
构造函数代码:
CheckBoxSetItemsWidget::CheckBoxSetItemsWidget(QWidget *parent) :    QWidget(parent),    ui(new Ui::CheckBoxSetItemsWidget){    ui->setupUi(this);    // 初始界面    ui->m_pCheckBoxSelectAll->setText("全选");    ui->m_pCheckBoxSelectAll->setChecked(true);    // 连接信号槽    connect(ui->m_pCheckBoxSelectAll, &QCheckBox::clicked, this, &CheckBoxSetItemsWidget::slotSelectAllClicked);}
添加配置参数项代码:
// 添加配置参数项函数代码。void CheckBoxSetItemsWidget::addCheckBoxItem(const QString &qstrName, bool bChecked){    QCheckBox* p_check_box = new QCheckBox(qstrName, this);    p_check_box->setChecked(bChecked);    int i_row = ui->m_pGridLayout->count() / m_iRowCount;    int i_col = ui->m_pGridLayout->count() % m_iRowCount;    ui->m_pGridLayout->addWidget(p_check_box, i_row, i_col);}
全选&反选代码:
// 全选&反选功能函数代码void CheckBoxSetItemsWidget::slotSelectAllClicked(bool checked){    int i_count = ui->m_pGridLayout->count();    for (int i = 0; i < i_count; ++i)    {        QCheckBox* p_check_box = (QCheckBox*)ui->m_pGridLayout->itemAt(i)->widget();        assert(nullptr != p_check_box);        p_check_box->setChecked(checked);    }}
3 集成配置参数项目界面

我们把CheckBoxSetItemsWidget配置参数项目界面集成到主界面。

首先需要先修改MainWindow界面为垂直布局(QVBoxLayout),修改方式详见文末。

MainWindow类设计:

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACEnamespace Ui { class MainWindow; }QT_END_NAMESPACEclass MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = nullptr);    ~MainWindow();    // 添加模拟配置参数项数据    void addParamDatas();protected:    // 初始界面    void initForm();private:    Ui::MainWindow *ui;};#endif // MAINWINDOW_H
构造函数代码:
MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::IMainWindow){    ui->setupUi(this);    this->setWindowTitle("QScrollArea & QGridLayout & QCheckBox实战示例");    initForm();    addParamDatas();}
初始界面代码:
void MainWindow::initForm(){    // 创建滚动条控件对象    auto p_scroll_area = new QScrollArea(this);    // 创建配置参数项界面    auto* p_check_box_items_widget = new CheckBoxSetItemsWidget(p_scroll_area);    // 将配置参数项界面加入到滚动条    p_scroll_area->setWidget(p_check_box_items_widget);    p_scroll_area->setWidgetResizable(true);    // 将滚动条控件加入到界面布局    QLayout* p_layout = ui->centralwidget->layout();    p_layout->addWidget(p_scroll_area);}
添加配置参数项代码:
// 添加配置参数项数据void MainWindow::addParamDatas(){    auto* p_scroll_area = (QScrollArea*)ui->centralwidget->layout()->itemAt(0)->widget();    auto* p_check_box_items_widget = (CheckBoxSetItemsWidget*)p_scroll_area->widget();    // 生成300组模拟配置参数    for (int i = 0; i < 300; ++i)    {        QString qstr_name = QString("CheckBox%0").arg(i);        p_check_box_items_widget->addCheckBoxItem(qstr_name, true);    }}
附录1:如何手工修改QWidget界面的默认布局修改CheckBoxSetItemsWidget界面为垂直布局(QVBoxLayout):

右键CheckBoxSetItemsWidget.ui文件,用(普通文本编辑器)打开,找到()代码,在下面增加()一行代码,保存关闭文本编辑器。

CheckBoxSetItemsWidget.ui源码如下例子:

<ui version="4.0"> <author/> <comment/> <exportmacro/> <class>CheckBoxSetItemsWidget</class> <widget class="QWidget" name="CheckBoxSetItemsWidget">  <layout class="QVBoxLayout" name="verticalLayout_1" />  <property name="geometry">   <rect>    <x>0</x>    <y>0</y>    <width>400</width>    <height>300</height>   </rect>  </property>  <property name="windowTitle">   <string>Form</string>  </property> </widget> <pixmapfunction/> <connections/></ui>
修改MainWindow界面为垂直布局(QVBoxLayout):

右键MainWindow.ui文件,用(普通文本编辑器)打开,找到()代码,在下面增加()一行代码,保存关闭文本编辑器。

MainWindow.ui源码如下例子:

<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"> <class>IMainWindow</class> <widget class="QMainWindow" name="MainWindow">  <property name="geometry">   <rect>    <x>0</x>    <y>0</y>    <width>800</width>    <height>600</height>   </rect>  </property>  <property name="windowTitle">   <string>MainWindow</string>  </property>  <widget class="QWidget" name="centralwidget">   <layout class="QVBoxLayout" name="verticalLayout_1"/>  </widget>  <widget class="QMenuBar" name="menubar"/>  <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/></ui>

标签: #用qt做界面