首页 > 代码库 > QListWdiget insertItem顺序问题

QListWdiget insertItem顺序问题

在使用QListWdiget inser一个item的时候使用如下代码出现了一点小问题.

listWidget->insertItem(row, new QListWidgetItem(listWidget))

这一段代码会使得insert的item总是在listWidget的最后. 这是一个很简单很常用的api, 简单得不能再简单了, 但是却发生了意想不到的问题. 查阅文档"Inserts the item at the position in the list given by row." 毫无营养.翻阅QListWidget的源码发现了倪端, insert代码片段如下:

void QListModel::insert(int row, QListWidgetItem *item)
{
    if (!item)
        return;

    item->view = qobject_cast<QListWidget*>(QObject::parent());
    if (item->view && item->view->isSortingEnabled()) {
        // sorted insertion
        QList<QListWidgetItem*>::iterator it;
        it = sortedInsertionIterator(items.begin(), items.end(),
                                     item->view->sortOrder(), item);
        row = qMax(it - items.begin(), 0);
    } else {
        if (row < 0)
            row = 0;
        else if (row > items.count())
            row = items.count();
    }
    beginInsertRows(QModelIndex(), row, row);
    items.insert(row, item);
    item->d->theid = row;
    endInsertRows();
}
呵呵原来问题很简单, insert的时候判断了item是否指定了parent, 如果指定了parent就会把row设置成为最大的值. 如果没有parent则按照指定的row.而我的代码中new QListWidgetItem的时候指定了parent造成了这个问题. 修改代码为

listWidget->insertItem(row, new QListWidgetItem())
问题解决!


QListWdiget insertItem顺序问题