setItemWidget设置自定义窗口注意事项
QListWidgetQLIstWidget中有一个setItemWidget( QListWidgetItem *item, QWidget *widget)函数接口 ,通常用来设置显示我们自定义的QWidget, 然后将item 与 我们自定义的QWidget 相关联。需要注意的是:QListWidgetItem *ITEM = new QListWidgetItem();QSize size
QListWidget
QLIstWidget中有一个setItemWidget( QListWidgetItem *item, QWidget *widget) 函数接口 ,通常用来设置显示我们自定义的QWidget, 然后将item 与 我们自定义的QWidget 相关联。
需要注意的是:
QListWidgetItem *ITEM = new QListWidgetItem();
QSize size = ITEM->sizeHint(); // 如果通过这中模式设置
ITEM->setSizeHint(QSize(size.width(), 56));
ui.listWidget->addItem(ITEM);
widget->setSizeIncrement(size.width(), 56);
ui.listWidget->setItemWidget(ITEM, widget);
// 如果通过这中模式设置 切记一定要设置item sizeHint 因为你实际ui中宽高与控件显示出来宽高还是有差距的, 可能由于窗口中控件挤压或者其他导致(特别是QtreeWidget 中当 QTreeWidget 绑定item 与QWidget时 如果是collpsez状态可能在未show(渲染)之前其size与大小还有区别), 所以建议使用setsizeHint设置item大小。
1:
QListWidgetItem 一般不指定对应的QListWidget, 解释如下当传递过来的参数parent,如果其model是sorted,那么它在insert时将会调用< 操作运算符导致不确定的操作,建议不指定父窗口,而是通过insertitem即可。
2.
应该先添加item,再去将item与QWidget绑定
void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)
{
Q_D(QListWidget);
/*
当addItem函数在该函数之后,这个时候因为并没有执行addItem,item没有和QListWidget建立绑定关联,所以这里得到的索引值index是不对的,所以会显示不出来,所以需要先执行addItem,
再执行该函数,index就能取到正确的值,就能正常显示了
*/
QModelIndex index = d->listModel()->index(item);
QAbstractItemView::setIndexWidget(index, widget);
}
3.
如果要删除对应item 时,removeItemWidget,只是将 old widget deleted 但是item并没有deleted 所以item还存在。
void removeItemWidget(QListWidgetItem* item);
源码里面是 调用 setItemWidget(item,Q_NULLPtr);
4.
QListWidgetItem* takeItem(int row); 此时返回的item,并没有被删除,只是从listwidget中remove掉了, 还需要自己手动delete,不然此时item不受qt管控,会导致未知问题。
5.
有时候我们qlistwidget 进行如下设置
auto listWidget = ui->listWidget;
//The items are laid out using LeftToRight flow, with Large size and Free movement
listWidget->setViewMode(QListView::IconMode); //icon mode
listWidget->setResizeMode(QListView::Fixed); //fixed
listWidget->setMovement(QListView::Static);//static 避免新增item, 导致原有item样式布局位置geometry问题
listWidget->setWordWrap(true);
listWidget->setSpacing(15);
listWidget->setSelectionMode(QAbstractItemView::SingleSelection);
listWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);//设置滚轮滚动策略
listWidget->verticalScrollBar()->setSingleStep(10); //设置滚轮滚动速度
当添加item足够多时, 可能会超过原有widget高度, 此时添加item可能会导致添加item 并不能全部显示, 此时需要设置 QAbstractItemView::EnsureVisible, 确保添加item能够全部显示出来。
QListWidgetItem* topItem = new QListWidgetItem(ui->listWidget, QListWidgetItem::UserType);
ui->listWidget->scrollToItem(topItem, QAbstractItemView::EnsureVisible);
还有一些情况导致geometry, 需要repaint刷新界面等。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)