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())

问题解决!

时间: 2024-12-12 22:52:26

QListWdiget insertItem顺序问题的相关文章

iOS程序执行顺序和UIViewController 的生命周期(整理)

说明:此文是自己的总结笔记,主要参考: iOS程序的启动执行顺序 AppDelegate 及 UIViewController 的生命周期 UIView的生命周期 言叶之庭.jpeg 一. iOS程序的启动执行顺序 程序启动顺序图 iOS启动原理图.png 具体执行流程 程序入口进入main函数,设置AppDelegate称为函数的代理 程序完成加载[AppDelegate application:didFinishLaunchingWithOptions:] 创建window窗口 程序被激活[

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect

修饰符-包-内部类-代码块执行顺序

1.访问权限修饰符     从大到小的顺序为:public--protected--default--private     private--只能在同一类中使用;     default--不用写出来,默认不加.可以被同一包中的类使用     protected--可以被不同包的子类使用     public--可以被不同包的其它类使用 2.各种修饰符的修饰对象(可修饰哪些:类/接口/方法/属性)(多个修饰符连用是可以没有顺序的!)     1)访问权限修饰符:public/default--

顺序表算法设计笔记

1.已知长度为 n 的线性表 A 采用顺序存储结构.设计一个时间复杂度为O(n).空间复杂度为O(1)的算法,该算法删除线性表中所有值为 x 的元素数据元素. 以下两种方法都不满足要求: 如果删除一个值为 x 的元素都进行移动, 其时间复杂度为O(n^2),时间复杂度为O(1). 如果借助一个新的顺序表, 存放将A中所有不为x的元素,其时间复杂度O(n), 空间复杂度为O(n). 解法一:设删除 A 中所有值等于 x 元素后的顺序表为A1, 显然A1包含在 A 中, 为此A1重用 A 的空间.

UML和模式应用5:细化阶段(5)---系统顺序图

1.前言 系统顺序图(SSD)是为阐述系统相关的输入和输出事件而快速.简单的创建的制品,它们是操作契约和对象设计的输入. SSD展示了直接与系统交互的外部参与者.系统(作为黑盒)以及由参与者发起的系统事件. 应为每个用例的主成功场景,以及频繁发生的或者复杂的替代场景绘制SSD. 2.系统顺序图对其它制品的影响 图 系统顺序图对其它UP制品的影响 3. 为何绘制SSD? 因为需要准确的知道什么是外部输入的事件,这些事件时系统行为分析的重要部分 软件系统要为如下三种事件响应: 来自参与者(人或计算机

顺序结构显示日期与时间

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms; namespace 顺序结构时间日期{ public partial class Form1 : Form { public Form1() {

ASP.NET 母版页和内容页中的事件触发顺序

母版页和内容页触发事件的先后顺序,触发事件的规则一般是初始化事件是从最里边的控件到最外边的控件,其他事件则是从最外边控件到最里边控件. 下面是一个测试: 第一次触发的是母版页的Init事件. 第二次触发的是内容页的Init事件. 第三次触发的是内容页的Load事件 第四次触发的是母版页的Load事件 总结: 母版页与内容页触发事件的顺序: 1.母版页Init事件. 2.内容页Init事件. 3.内容页Load事件 4.母版页Load事件. 5.内容页PreRender事件. 6.母版页PreRe

html、css、js文件加载顺序及执行情况

今天看书,看到html,css,js加载执行情况,发现自己并不是真正的了解,网上搜了半小时依然未弄明白,就在这时我找到了让我恍然大悟的一段话,如下: HTML页面加载和解析流程 1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件. 2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件. 3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件. 4. 浏览器继续载入html中&

NAT与ACL执行顺序解析

防火墙数据包处理流程图 ACL与NAT的顺序不是固定的,各厂商数据流先ACL或先NAT不一. 引用<浅析ACL与NAT的执行顺序>-张少芳  一文中的结论如下: H3C 出站:先匹配出站ACL,然后进行地址转换 入站:先进行地址转换,然后匹配入站ACL CISCO 出站:先进行地址转换,然后匹配出站ACL 入站:先匹配入站ACL,然后进行地址转换(即上图所示数据流顺序) 结论 H3C设备和CISCO设备在对ACL与NAT的执行顺序处理上完全相反.由于在实际的网络中可能存在来自不同厂商的设备,因