QListWidget代码刷新界面

时间:2021-07-14 01:00:30

我有一个特殊效果要求实现(其实很弱智,也变成特殊效果,汗一下自己):两个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的时候,解决过这个不间断刷新的问题,回头把代码找出来看看。