百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

haoteby 2024-11-09 13:01 32 浏览

在一些实际项目中,程序配置界面会有很多的配置参数项(超过几百条),并且这些配置参数项需要通过接口来动态添加。本文就来重点讲下,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_OBJECT

public:
    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_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE


class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    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>

相关推荐

一日一技:用Python程序将十进制转换为二进制

用Python程序将十进制转换为二进制通过将数字连续除以2并以相反顺序打印其余部分,将十进制数转换为二进制。在下面的程序中,我们将学习使用递归函数将十进制数转换为二进制数,代码如下:...

十进制转化成二进制你会吗?#数学思维

六年级奥赛起跑线:抽屉原理揭秘。同学们好,我是你们的奥耀老师。今天一起来学习奥赛起跑线第三讲二进制计数法。例一:把十进制五十三化成二进制数是多少?首先十进制就是满十进一,二进制就是满二进一。二进制每个...

二进制、十进制、八进制和十六进制,它们之间是如何转换的?

在学习进制时总会遇到多种进制转换的时候,学会它们之间的转换方法也是必须的,这里分享一下几种进制之间转换的方法,也分享两个好用的转换工具,使用它们能够大幅度的提升你的办公和学习效率,感兴趣的小伙伴记得点...

c语言-2进制转10进制_c语言 二进制转十进制

#include<stdio.h>intmain(){charch;inta=0;...

二进制、八进制、十进制和十六进制数制转换

一、数制1、什么是数制数制是计数进位的简称。也就是由低位向高位进位计数的方法。2、常用数制计算机中常用的数制有二进制、八进制、十进制和十六进制。...

二进制、十进制、八进制、十六进制间的相互转换函数

二进制、十进制、八进制、十六进制间的相互转换函数1、输入任意一个十进制的整数,将其分别转换为二进制、八进制、十六进制。2、程序代码如下:#include<iostream>usingna...

二进制、八进制、十进制和十六进制等常用数制及其相互转换

从大学开始系统的接触计算机专业,到现在已经过去十几年了,今天整理一下基础的进制转换,希望给还在上高中的表妹一个入门的引导,早日熟悉这个行业。一、二进制、八进制、十进制和十六进制是如何定义的?二进制是B...

二进制如何转换成十进制?_二进制如何转换成十进制例子图解

随着社会的发展,电器维修由继电器时代逐渐被PLC,变频器,触摸屏等工控时代所替代,特别是plc编程,其数据逻辑往往涉及到数制二进制,那么二进制到底是什么呢?它和十进制又有什么区别和联系呢?下面和朋友们...

二进制与十进制的相互转换_二进制和十进制之间转换

很多同学在刚开始接触计算机语言的时候,都会了解计算机的世界里面大多都是二进制来表达现实世界的任何事物的。当然现实世界的事务有很多很多,就拿最简单的数字,我们经常看到的数字大多都是十进制的形式,例如:我...

十进制如何转换为二进制,二进制如何转换为十进制

用十进制除以2,除的断的,商用0表示;除不断的,商用1表示余0时结束假如十进制用X表示,用十进制除以2,即x/2除以2后为整数的(除的断的),商用0表示;除以2除不断的,商用1表示除完后的商0或1...

十进制数如何转换为二进制数_十进制数如何转换为二进制数举例说明

我们经常听到十进制数和二进制数,电脑中也经常使用二进制数来进行计算,但是很多人却不清楚十进制数和二进制数是怎样进行转换的,下面就来看看,十进制数转换为二进制数的方法。正整数转二进制...

二进制转化为十进制,你会做吗?一起来试试吧

今天孩子问把二进制表示的110101改写成十进制数怎么做呀?,“二进制”简单来说就是“满二进一”,只用0和1共两个数字表示,同理我们平常接触到的“十进制”是“满十进一”,只用0-9共十个数字表示。如果...

Mac终于能正常打游戏了!苹果正逐渐淘汰Rosetta转译

Mac玩家苦转译久矣!WWDC2025苹果正式宣判Rosetta死刑,原生游戏时代终于杀到。Metal4光追和AI插帧技术直接掀桌,连Steam都连夜扛着ARM架构投诚了。看到《赛博朋克2077》...

怎么把视频的声音提出来转为音频?音频提取,11款工具实测搞定

想把视频里的声音单独保存为音频文件(MP3/AAC/WAV/FLAC)用于配音、播客、听课或二次剪辑?本文挑出10款常用工具,给出实测可复现的操作步骤、优缺点和场景推荐。1)转换猫mp3转换器(操作门...

6个mp4格式转换器测评:转换速度与质量并存!

MP4视频格式具有兼容性强、视频画质高清、文件体积较小、支持多种编码等特点,适用于网络媒体传播。如果大家想要将非MP4格式的视频转换成MP4的视频格式的话,可以使用MP4格式转换器更换格式。本文分别从...