我有一个特殊效果要求实现(其实很弱智,也变成特殊效果,汗一下自己):两个QRadioButton切换的时候,让旁边的QListWidget自动变化不同的背景色。想了很多办法:
1. 控件自己刷新,不行
list_widget->update();
list_widget->repaint();
QCoreApplication::processEvents(); // 加上这句也不行
2. 试图使用QListView的dataChanged(),可这是个保护函数,由于QListWidget封装的太好了,看到它背后的view类实现,因此也不行。
3. 试图构造QModelIndex,然后使用QAbstractItemView的update()函数,成功刷新第一行,而且居然真的只刷新那一行,其余行保持了一个错误的颜色:
QPoint pt(0,0);
QModelIndex t3 = list_widget->indexAt(pt);
list_widget->update(t3);
但是试图每行都刷新,但是无奈始终无法取到每一行的高度,无法取到高度
for (int i=0; i<list_widget->count(); i++) {
QSize si = list_widget->item(i)->sizeHint();
int len = si.width();
int hi = si.height();
QPoint pt(hi*i, i);
QModelIndex t3 = list_widget->indexAt(pt);
list_widget->update(t3); // view
}
4. 选中的时候,会不会自动刷新?实践证明也不行:
list_widget->setcurrentrow(list_widget->count()-1);
5. 最后想了一个笨办法,只适用于低频率变化,不适于不断刷新:
list_widget->hide(); // 试过了,不调用隐藏,只调用显示是没有用的
list_widget->show();
------------------------------------------------------------------------------------
总结1:QModelIndex很难从外部构造,通常都是内部类实现的时候提供并加以处理。相关的方法大多数也都是内部函数,只有一个update()函数不是,这个函数虽然好用但却又很难构造它的参数,而且这个函数只刷新某一行,剩下的行即使错误也不管。
总结2:虽然很多办法都不行,但是增加item的时候,QListWidget会整体刷新,鼠标移过QListWidget的时候也会整体刷新。
总结3:我记得在学wxPython的时候,解决过这个不间断刷新的问题,回头把代码找出来看看。
原文:http://www.cnblogs.com/findumars/p/4312219.html