Qt-多元素控件

锦通  论坛元老 | 2024-11-26 07:48:04 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1588|帖子 1588|积分 4764

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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 

 
初始化:
 
 定义槽函数
  1. void Widget::on_pushButton_addtop_clicked()
  2. {
  3.     QString text = ui->lineEdit->text();
  4.     if(text.isEmpty()) return;
  5.     QTreeWidgetItem* item = new QTreeWidgetItem();
  6.     item->setText(0,text);
  7.     ui->treeWidget->addTopLevelItem(item);
  8.     ui->lineEdit->clear();
  9. }
  10. void Widget::on_pushButton_addcur_clicked()
  11. {
  12.     // 获取当前选中的结点
  13.     QTreeWidgetItem* curItem = ui->treeWidget->currentItem();
  14.     if(curItem == nullptr) return;
  15.     QString text = ui->lineEdit->text();
  16.     if(text.isEmpty()) return;
  17.     QTreeWidgetItem* newItem = new QTreeWidgetItem();
  18.     newItem->setText(0,text);
  19.     // 将item添加到选中结点
  20.     curItem->addChild(newItem);
  21.     // 展开父结点,就是每次添加完后会自动展开s
  22.     curItem->setExpanded(true);
  23.     ui->lineEdit->clear();
  24. }
  25. void Widget::on_pushButton_delcur_clicked()
  26. {
  27.     // 获取当前选中的结点
  28.     QTreeWidgetItem* curItem = ui->treeWidget->currentItem();
  29.     if(curItem == nullptr) return;
  30.     // 这里还需要再获取当期结点的父结点
  31.     QTreeWidgetItem* parent = curItem->parent();
  32.     if(parent == nullptr)
  33.     {
  34.         // 说明自身已经是顶层结点了。
  35.         int index = ui->treeWidget->indexOfTopLevelItem(curItem);
  36.         ui->treeWidget->takeTopLevelItem(index);
  37.     }
  38.     else
  39.     {
  40.         parent->removeChild(curItem);
  41.     }
  42. }
复制代码
在删除槽函数的操作那里,需要先判断当前删除的结点是否是顶层结点,两种情况的删除方式不一致,这也是Qt在这里设计的有点挫的地方。
演示效果:

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表