马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
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

初始化:

定义槽函数
- 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在这里设计的有点挫的地方。
演示效果:

上面的这些控件,数据都是在内存中保存的,程序重启之后就会重置。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |