setItemWidget设置自定义窗口注意事项

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刷新界面等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长,行则降至

无聊,打赏求刺激而已

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值