当前位置: 首页 > article >正文

qt:多元素类,容器类,布局类

1.列表

List Widget

属性特点
currentRow当前被选中的是第几行
count一共有多少行
sortingEnabled是否允许排序
isWrapping是否允许换行
itemAlignment元素的对齐方式
selectRectVisible被选中的元素矩形是否可见
spacing元素之间的间隔
方法特点
addItem(const QString& label)
addItem(QListWidgetItem *item)
列表中添加元素
currentItem()返回 QListWidgetItem* 表示当前选中的元素
setCurrentItem(QListWidgetItem* item)设置选中哪个元素
setCurrentRow(int row)设置选中第几行的元素
insertItem(const QString& label, int row)
insertItem(QListWidgetItem *item, int row)
在指定的位置插入元素
item(int row)返回 QListWidgetItem* 表示第 row 行的元素
takeItem(int row)删除指定行的元素, 返回 QListWidgetItem* 表示是哪个元素被删除了

信号特点
currentItemChanged(QListWidgetItem* current, QListWidgetItem* old)选中不同元素时会触发. 参数是当前选中的元素和之前选中的元素
currentRowChanged(int)选中不同元素时会触发. 参数是当前选中元素的行数
itemClicked(QListWidgetItem* item)点击某个元素时触发
itemDoubleClicked(QListWidgetItem* item)双击某个元素时触发
itemEntered(QListWidgetItem* item)鼠标进入元素时触发

在上述介绍中涉及到⼀个关键的类:QListWidgetItem,这个类表示 QListWidget 中的一个元素。核心方法如下,本质上就是⼀个 “文本+图标” 构成的

setFont: 设置字体
setIcon: 设置图标
setHidden: 设置隐藏
setSizeHint: 设置尺寸
setSelected: 设置是否选中
setText: 设置文本
setTextAlignment: 设置文本对齐方式
这些方法允许我们自定义 Q List Widget Item 的外观和行为。

通过结合使用 QListWidget 的属性、方法和信号,以及 QListWidgetItem 的方法,可以创建高度定制化的列表控件

编写一个程序,演示程序,实现程序记录和增删功能

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::truebutton);

    connect(ui->pushButton_2,&QPushButton::clicked,this,&Widget::falsebutton);
    connect(ui->listWidget,&QListWidget::currentItemChanged,this,&Widget::print);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::truebutton()
{
    if(!ui->lineEdit->text().isEmpty())
    {
        ui->listWidget->addItem(ui->lineEdit->text());
    }
}
void Widget::falsebutton()
{
    int row=ui->listWidget->currentRow();
        ui->listWidget->takeItem(row);

}
void Widget::print(QListWidgetItem*pre1,QListWidgetItem*now1)
{
    if(pre1)
    { if(!pre1->text().isEmpty())
    {
        ui->textEdit->append("先前选中"+pre1->text());
    }
}
    if(now1)
{
    if(!now1->text().isEmpty())
    {
        ui->textEdit->append("现在选中"+now1->text());
    }
    }
}

2.表格

TableWidget,表格中的每一格都是一个QTableWidge tItem对象

QTableWidget方法特点
item(int row, int column)根据行数列数获取指定的 QTableWidgetItem*
setItem(int row, int column, QTableWidgetItem*)根据行数列数设置表格中的元素
currentItem()返回被选中的元素 QTableWidgetItem*
currentRow()返回被选中元素是第几行
currentColumn()返回被选中元素是第几列
row(QTableWidgetItem*)获取指定 item 是第几行
column(QTableWidgetItem*)获取指定 item 是第几列
rowCount()获取行数
columnCount()获取列数
insertRow(int row)在第 row 行处插入新行
insertColumn(int column)在第 column 列插入新列
removeRow(int row)删除第 row 行
removeColumn(int column)删除第 column 列
setHorizontalHeaderItem(int column, QTableWidgetItem*)设置指定列的表头
setVerticalHeaderItem(int row, QTableWidgetItem*)设置指定行的表头
QTableWidget tltem信号特点
cellClicked(int row, int column)点击单元格时触发
cellDoubleClicked(int row, int column)双击单元格时触发
cellEntered(int row, int column)鼠标进入单元格时触发
currentCellChanged(int row, int column, int previousRow, int previousColumn)选中不同单元格时触发
QTableWidget tltem方法特点
row()获取当前是第几行
column()获取当前是第几列
setText(const QString&)设置文本
setTextAlignment(int)设置文本对齐
setIcon(const QIcon&)设置图标
setSelected(bool)设置被选中
setSizeHint(const QSize&)设置尺寸
setFont(const QFont&)设置字体

写出演示程序,实现表格行列的增加和减少

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->tableWidget->insertRow(0);
    ui->tableWidget->insertRow(1);
    ui->tableWidget->insertRow(2);
    ui->tableWidget->insertColumn(0);
    ui->tableWidget->insertColumn(1);
    ui->tableWidget->insertColumn(2);
    ui->lineEdit->setClearButtonEnabled(true);
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::addrow);
    connect(ui->pushButton_2,&QPushButton::clicked,this,&Widget::addcolumn);
    connect(ui->pushButton_3,&QPushButton::clicked,this,&Widget::deleterow);
    connect(ui->pushButton_4,&QPushButton::clicked,this,&Widget::deletecolumn);
    }
void Widget::addcolumn()
{
    int column=ui->tableWidget->columnCount();
    ui->tableWidget->insertColumn(column);
    if(!ui->lineEdit->text().isEmpty())
    {
        ui->tableWidget->setHorizontalHeaderItem(column,new QTableWidgetItem(ui->lineEdit->text()));
    }
    else
    {
        qDebug()<<"请输入列名";
    }

}
void Widget::addrow()
{
    int row1=ui->tableWidget->rowCount();
    ui->tableWidget->insertRow(row1);
}
Widget::~Widget()
{
    delete ui;
}
void Widget::deleterow()
{
    int row1=ui->tableWidget->currentRow();
    ui->tableWidget->removeRow(row1);
}
void Widget::deletecolumn()
{
    int column=ui->tableWidget->currentColumn();
    ui->tableWidget->removeColumn(column);
}

 

3.树形图

QTreeWidget 每个节点是 QTreeWidge tItem,注意该树形结构没有根节点的设置,是从根节点的孩子进行设置,这样可以设置多个顶层节点

QTreeWIdget方法特点
clear()清空所有子节点
addTopLevelItem(QTreeWidgetItem* item)新增顶层节点
topLevelItem(int index)获取指定下标的顶层节点
topLevelItemCount()获取顶层节点个数
indexOfTopLevelItem(QTreeWidgetItem* item)查询指定节点是顶层节点中的下标
takeTopLevelItem(int index)删除指定的顶层节点,返回 QTreeWidgetItem* 表示被删除的元素
currentItem()获取当前选中的节点,返回 QTreeWidgetItem*
setCurrentItem(QTreeWidgetItem* item)选中指定节点
setExpanded(bool)展开/关闭节点
setHeaderLabel(const QString& text)设置 TreeWidget 的 header 名称
QTreeWidget信号

特点

currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* old)切换选中元素时触发
itemClicked(QTreeWidgetItem* item, int col)点击元素时触发
itemDoubleClicked(QTreeWidgetItem* item, int col)双击元素时触发
itemEntered(QTreeWidgetItem* item, int col)鼠标进入时触发
itemExpanded(QTreeWidgetItem* item)元素被展开时触发
itemCollapsed(QTreeWidgetItem* item)元素被折叠时触发
QTreeWidget tltem属性特点
text持有的文本
textAlignment文本对齐方式
icon持有的图标
font文本字体
hidden是否隐藏
disabled是否禁用
expanded是否展开
sizeHint尺寸大小
selected是否选中
QTreeWidget tltem信号特点
addChild(QTreeWidgetItem* child)新增子节点
childCount()子节点的个数
child(int index)获取指定下标的子节点,返回 QTreeWidgetItem*
takeChild(int index)删除对应下标的子节点
removeChild(QTreeWidgetItem* child)删除对应的子节点
parent()获取该元素的父节点

 创建一棵演示树

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QTreeWidgetItem *top1=new QTreeWidgetItem();
    top1->setText(0,"狗");
    QTreeWidgetItem*top2=new QTreeWidgetItem();
    top2->setText(0,"猫");
    ui->treeWidget->addTopLevelItem(top1);
    ui->treeWidget->addTopLevelItem(top2);
    QTreeWidgetItem *child11=new QTreeWidgetItem();
    child11->setText(0,"瘦猫");
    QTreeWidgetItem*child12=new QTreeWidgetItem();
    child12->setText(0,"胖猫");
    top2->addChild(child11);
    top2->addChild(child12);
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::inserttop);
    connect(ui->pushButton_2,&QPushButton::clicked,this,&Widget::insertthis);
    connect(ui->pushButton_3,&QPushButton::clicked,this,&Widget::deletethis);
}
void Widget::inserttop()
{
    QTreeWidgetItem*i1=new QTreeWidgetItem();
    if(!ui->lineEdit->text().isEmpty())
    i1->setText(0,ui->lineEdit->text());
    ui->treeWidget->addTopLevelItem(i1);

}
void Widget::insertthis()
{
    QTreeWidgetItem*i1=new QTreeWidgetItem();
    if(!ui->lineEdit->text().isEmpty())
        i1->setText(0,ui->lineEdit->text());
    QTreeWidgetItem*nowthis=ui->treeWidget->currentItem();
    nowthis->addChild(i1);
}
void Widget::deletethis()
{
     QTreeWidgetItem*nowthis=ui->treeWidget->currentItem();
    if(!nowthis)
     {
         return;
    }
    QTreeWidgetItem*parent=nowthis->parent();
    if(!parent)
    {
        int ed=ui->treeWidget->indexOfTopLevelItem(nowthis);
        ui->treeWidget->takeTopLevelItem(ed);
    }
    else
    {
        parent->removeChild(nowthis);
    }
}
Widget::~Widget()
{
    delete ui;
}

4.分组框

QGroupBox

属性特点
title分组框的标题
alignment分组框内部内容的对齐方式
flat是否是 “扁平” 模式;设置为 true时,分组框将不显示边框,呈现扁平化外观
checkable是否可选择;设为 true,则在 title前方会多出一个可勾选的部分
checked描述分组框的选择状态(前提是 checkable为 true

用的很少,不做过多演示

5.标签页

QTableWidget 

属性特点
tabPosition标签页所在的位置:
- North 上方
- South 下方
- West 左侧
- East 右侧
currentIndex当前选中了第几个标签页(从0开始计算)
currentTabText当前选中的标签页的文本
currentTabName当前选中的标签页的名字
currentTabIcon当前选中的标签页的图标
currentTabToolTip当前选中的标签页的提示信息
tabsClosable标签页是否可以关闭
movable标签页是否可以移动
信号属性
currentChanged(int)在标签页发生切换时触发,参数为被点击的选项卡编号。
tabBarClicked(int)在点击选项卡的标签条的时候触发,参数为被点击的选项卡编号。
tabBarDoubleClicked(int)在双击选项卡的标签条的时候触发,参数为被点击的选项卡编号。
tabCloseRequested(int)在标签页关闭请求时触发,参数为被请求关闭的选项卡编号。

编写按钮实现标签页的增减

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLabel*l1=new QLabel(ui->tab);
    l1->setText("标签页1");
    l1->resize(100,50);
    QLabel*l2=new QLabel(ui->tab_2);
    l2->setText("标签页2");
    l2->resize(100,50);
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::addtab);
    connect(ui->pushButton_2,&QPushButton::clicked,this,&Widget::losetab);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::addtab()
{
    int cnt=ui->tabWidget->count();
    QWidget*w=new QWidget();
    ui->tabWidget->addTab(w,QString("Tab")+QString::number(cnt+1));
    QLabel*l=new QLabel(w);
    l->setText("标签页"+QString::number(cnt+1));
    l->resize(100,50);
    ui->tabWidget->setCurrentIndex(cnt);
}
void Widget::losetab()
{
    int cnt=ui->tabWidget->currentIndex();
    ui->tabWidget->removeTab(cnt);
}

6.垂直布局

QVBoxLayout

属性说明
layoutLeftMargin左侧边距,设置或获取布局内容与容器左边界的距离
layoutRightMargin右侧边距,设置或获取布局内容与容器右边界的距离
layoutTopMargin上方边距,设置或获取布局内容与容器上边界的距离
layoutBottomMargin下方边距,设置或获取布局内容与容器下边界的距离
layoutSpacing相邻元素之间的间距,设置或获取布局中各元素之间的默认间隔

 qt creater中使用垂直布局

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QVBoxLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton*q1=new QPushButton("q1");
    QPushButton*q2=new QPushButton("q2");
    QPushButton*q3=new QPushButton("q3");
    QVBoxLayout*lay=new QVBoxLayout();
    lay->addWidget(q1);
    lay->addWidget(q2);
    lay->addWidget(q3);
    this->setLayout(lay);
}

Widget::~Widget()
{
    delete ui;
}

qt designer中,可以设置多个布局管理器,但是不会起作用,原因是一个Widget只能有一个布局管理器,多余的是新建一个Widget对象,所以不会有效

 7.水平布局

QHBoxLayout,属性和垂直布局一样,一般使用也完全相同,现在演示嵌套情况

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QVBoxLayout>
#include<QHBoxLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton*q1=new QPushButton("q1");
    QPushButton*q2=new QPushButton("q2");
    QPushButton*q3=new QPushButton("q3");
    QVBoxLayout*vb=new QVBoxLayout();
    this->setLayout(vb);
    vb->addWidget(q1);
    vb->addWidget(q2);
    vb->addWidget(q3);
    QPushButton*q4=new QPushButton("q4");
    QPushButton*q5=new QPushButton("q5");
    QPushButton*q6=new QPushButton("q6");
    QHBoxLayout*hb=new QHBoxLayout();
    hb->addWidget(q4);
    hb->addWidget(q5);
    hb->addWidget(q6);
    vb->addLayout(hb);
}

Widget::~Widget()
{
    delete ui;
}

8.网格布局

QGridLayout

属性特点
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上方边距
layoutBottomMargin下方边距
layoutHorizontalSpacing相邻元素之间水平方向的间距
layoutVerticalSpacing相邻元素之间垂直方向的间距
layoutRowStretch行方向的拉伸系数
layoutColumnStretch列方向的拉伸系数
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QGridLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton*q1=new QPushButton("q1");
    QPushButton*q2=new QPushButton("q2");
    QPushButton*q3=new QPushButton("q3");
    QPushButton*q4=new QPushButton("q4");
    QGridLayout*lay=new QGridLayout();
    lay->addWidget(q1,0,0);
    lay->addWidget(q2,0,1);
    lay->addWidget(q3,1,0);
    lay->addWidget(q4,1,1);
    this->setLayout(lay);
}


Widget::~Widget()
{
    delete ui;
}

注意,0,1代表是第几行第几列

设置列宽度(0则是不参与拉伸),按钮高度固定,所以列高度设置不明显

 

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QGridLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton*q1=new QPushButton("q1");
    QPushButton*q2=new QPushButton("q2");
    QPushButton*q3=new QPushButton("q3");
    QPushButton*q4=new QPushButton("q4");
    QPushButton*q5=new QPushButton("q5");
    QPushButton*q6=new QPushButton("q6");
    QGridLayout*lay=new QGridLayout();
    lay->addWidget(q1,0,0);
    lay->addWidget(q2,0,1);
    lay->addWidget(q3,1,0);
    lay->addWidget(q4,1,1);
     lay->addWidget(q5,0,2);
     lay->addWidget(q6,1,2);
     lay->setColumnMinimumWidth(0,200);
     lay->setColumnMinimumWidth(1,100);
    lay->setColumnMinimumWidth(2,400);

    this->setLayout(lay);
   
}


Widget::~Widget()
{
    delete ui;
}

设置垂直拉伸 

QSizePolicy::Ignored:忽略控件的尺寸,不对布局产生影响。
QSizePolicy::Minimum:控件的最小尺寸为固定值,布局时不会超过该值。
QSizePolicy::Maximum:控件的最大尺寸为固定值,布局时不会小于该值。
QSizePolicy::Preferred:控件的理想尺寸为固定值,布局时会尽量接近该值。
QSizePolicy::Expanding:控件的尺寸可以根据空间调整,尽可能占据更多空间。
QSizePolicy::Shrinking:控件的尺寸可以根据空间调整,尽可能缩小以适应空间。

再演示一下用比例设置列间距

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QGridLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton*q1=new QPushButton("q1");
    QPushButton*q2=new QPushButton("q2");
    QPushButton*q3=new QPushButton("q3");
    QPushButton*q4=new QPushButton("q4");
    QPushButton*q5=new QPushButton("q5");
    QPushButton*q6=new QPushButton("q6");
    q1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    q2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    q3->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    q4->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    q5->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    q6->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    QGridLayout*lay=new QGridLayout();
    lay->addWidget(q1,0,0);
    lay->addWidget(q2,0,1);
    lay->addWidget(q3,1,0);
    lay->addWidget(q4,1,1);
     lay->addWidget(q5,0,2);
     lay->addWidget(q6,1,2);
     lay->setRowStretch(0,1);
     lay->setRowStretch(1,6);
    lay->setRowStretch(2,3);

    this->setLayout(lay);

}


Widget::~Widget()
{
    delete ui;
}

网格也能嵌套 

9.表单布局
#include "widget.h"
#include "ui_widget.h"
#include<QFormLayout>
#include<QLabel>
#include<QLineEdit>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QFormLayout*lay=new QFormLayout();
    this->setLayout(lay);
    QLabel*l1=new QLabel("账号");
    QLabel*l2=new QLabel("密码");
    QLineEdit *e1=new QLineEdit();
    QLineEdit* e2=new QLineEdit();
    lay->addRow(l1,e1);
    lay->addRow(l2,e2);

}

Widget::~Widget()
{
    delete ui;
}
 10.space
属性特点
width宽度
height高度
hData

水平方向的 sizePolicy

- QSizePolicy::Ignored: 忽略控件的尺寸,不对布局产生影响。
- QSizePolicy::Minimum: 控件的最小尺寸为固定值,布局时不会超过该值。
QSizePolicy::Maximum: 控件的最大尺寸为固定值,布局时不会小于该值。
QSizePolicy::Preferred: 控件的理想尺寸为固定值,布局时会尽量接近该值。
QSizePolicy::Expanding: 控件的尺寸可以根据空间调整,尽可能占据更多空间。
QSizePolicy::Shrinking: 控件的尺寸可以根据空间调整,尽可能缩小以适应空间。

vData垂直方向的 sizePolicy 选项同上。

演示

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QSpacerItem>
#include<QHBoxLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton*q1=new QPushButton();
    QPushButton*q2=new QPushButton();
    QSpacerItem*sp=new QSpacerItem(200,20);
    QHBoxLayout *l=new  QHBoxLayout();
    this->setLayout(l);
    l->addWidget(q1);
    l->addSpacerItem(sp);
    l->addWidget(q2);
}

Widget::~Widget()
{
    delete ui;
}


http://www.kler.cn/a/560891.html

相关文章:

  • 基于Docker的前端环境管理:从开发环境到生产部署的实现方案
  • Rancher-产品架构
  • 2.3 变量
  • 基于大数据技术智能教学系统的设计与实现
  • 深入浅出ES6:现代JavaScript的基石
  • XML DOM4J 二、document对象
  • 离线环境如何玩转LLM?Ollama一键部署指南(Ubuntu)
  • Redis 集群的三种模式:一主一从、一主多从和多主多从
  • 【linux】全志t113平台修改ota升级配置文件,定向选择升级分区
  • AI赋能市场预测:ScriptEcho如何提升数据可视化效率
  • 自由学习记录(38)
  • 自动驾驶之BEV概述
  • 【UCB CS 61B SP24】Lecture 11 - Inheritance 4: Iterators, Object Methods学习笔记
  • 浅析 DeepSeek 开源的 FlashMLA 项目
  • 从三个维度了解 RPC(Remote Procedure Call,远程过程调用)
  • 算法打卡第十二弹——二叉树
  • Unity 协程
  • 【NLP 26、实践 ⑥ 引入bert,判断文本中是否有特定字符出现】
  • Linux 命令大全完整版(12)
  • 论文笔记:Scaling Sentence Embeddings with Large Language Models