自学内容网 自学内容网

Qt-多元素控件

Qt中的多元素控件

Qt提供的多元素控件有:

这里的多元素控件都是两两一对的。

xxWidget和xxView的一个比较简单的理解就是:

xxView是更底层的实现, xxWidget是基于xxView封装来的。

可以说,xxView使用起来比较麻烦,但是能实现更复杂的功能。

xxWidget使用起来简单,但是功能有限。

xxWidget 和 xxView 之间的区别
以 QTableWidget 和 QTableView 为例.
QTableView 是基于 MVC 设计的控件. QTableView ⾃⾝不持有数据. 使⽤ QTableView 的
时候需要⽤⼾创建⼀个 Model 对象 (⽐如 QStandardModel ), 并且把 Model 和
QTableView 关联起来. 后续修改 Model 中的数据就会影响 QTableView 的显⽰; 修改
QTableView 的显⽰也会影响到 Model 中的数据(双向绑定).
QTableWidget 则是 QTableView 的⼦类, 对 Model 进⾏了封装. 不需要⽤⼾⼿动创建
Model 对象, 直接就可以往 QTableWidget 中添加数据了

后续主要就是介绍了xxWidget了。

QListWidget 

使⽤ QListWidget 能够显⽰⼀个纵向的列表

比如:

每个选项都可以被选中。

核心属性:

核心方法:

核心信号:

在上述介绍中, 涉及到⼀个关键的类, QListWidgetItem .
这个类表⽰ QListWidget 中的⼀个元素.
核⼼⽅法如下, 本质上就是⼀个 "⽂本+图标" 构成的

使⽤ ListWidget 

我们也可以先用list View,然后右键,可以将其变形成ListWidget

 

ListWidget ListView 的⼦类, 功能⽐ ListView 更丰富 

 比如这样一个界面,我们想对这个listWidget进行新增和删除。

如上,这个信号就是当前选中是否发生改变,第一个形参表示当前选中的,第二个形参表示上次选中的。

 这个Qt帮我们生成的slot会报错,这是因为我们没有包含QListWidgetItem这个类。

关于新增和删除按钮的槽函数定义:

补充:

QTabWidget 

使⽤ QTableWidget 表⽰⼀个表格控件. ⼀个表格中包含若⼲⾏, 每⼀⾏⼜包含若⼲列.
表格中的每个单元格, 是⼀个 QTableWidgetItem 对象

 

QTableWidget 核⼼⽅法

 

QTableWidgetItem 核⼼信号 

 

 QTableWidgetItem 核⼼⽅法

 

使⽤ QTableWidget 

 

 效果:

我们可以再初始化一下数据:
 

 

 

然后编写槽函数

 

演示:
 

默认情况下, 单元格中的内容直接就是可编辑的.
如果不想让⽤⼾编辑, 可以设置 ui->tableWidget-
>setEditTriggers(QAbstractItemView::NoEditTriggers);

 

 

Tree Widget 

使⽤ QTreeWidget 表⽰⼀个树形控件. ⾥⾯的每个元素, 都是⼀个 QTreeWidgetItem , 每个
QTreeWidgetItem 可以包含多个⽂本和图标, 每个⽂本/图标为⼀个 列.
可以给 QTreeWidget 设置顶层节点(顶层节点可以有多个), 然后再给顶层节点添加⼦节点, 从⽽构成树形结构.

 

可以想象成这样:

 

QTreeWidget 核⼼⽅法 

 

QTreeWidget 核⼼信号 

 

 QTreeWidgetItem 核⼼属性

 

 

QTreeWidgetItem 核⼼⽅法 

 

使⽤ QTreeWidget 

 

初始化:
 

 定义槽函数

void Widget::on_pushButton_addtop_clicked()
{
    QString text = ui->lineEdit->text();
    if(text.isEmpty()) return;
    QTreeWidgetItem* item = new QTreeWidgetItem();
    item->setText(0,text);
    ui->treeWidget->addTopLevelItem(item);
    ui->lineEdit->clear();
}


void Widget::on_pushButton_addcur_clicked()
{
    // 获取当前选中的结点
    QTreeWidgetItem* curItem = ui->treeWidget->currentItem();
    if(curItem == nullptr) return;

    QString text = ui->lineEdit->text();
    if(text.isEmpty()) return;
    QTreeWidgetItem* newItem = new QTreeWidgetItem();
    newItem->setText(0,text);
    // 将item添加到选中结点
    curItem->addChild(newItem);
    // 展开父结点,就是每次添加完后会自动展开s
    curItem->setExpanded(true);

    ui->lineEdit->clear();
}


void Widget::on_pushButton_delcur_clicked()
{
    // 获取当前选中的结点
    QTreeWidgetItem* curItem = ui->treeWidget->currentItem();
    if(curItem == nullptr) return;

    // 这里还需要再获取当期结点的父结点
    QTreeWidgetItem* parent = curItem->parent();
    if(parent == nullptr)
    {
        // 说明自身已经是顶层结点了。
        int index = ui->treeWidget->indexOfTopLevelItem(curItem);
        ui->treeWidget->takeTopLevelItem(index);
    }
    else
    {
        parent->removeChild(curItem);
    }
}

在删除槽函数的操作那里,需要先判断当前删除的结点是否是顶层结点,两种情况的删除方式不一致,这也是Qt在这里设计的有点挫的地方。

演示效果:

 

上面的这些控件,数据都是在内存中保存的,程序重启之后就会重置。 


原文地址:https://blog.csdn.net/m0_74099572/article/details/143958300

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!