Qt QListWidget获取已查看项目的列表

Qt QListWidget获取已查看项目的列表,qt,qlistwidget,Qt,Qlistwidget,假设我有一个包含很多项的listwidget。当用户滚动查看更多项目时,我希望对正在查看的项目执行操作。是否可能触发一个事件itemsViewedChanged(QListWidgetItems*items),该事件提供用户当前查看的项目 如果没有,我如何实现这样的功能 感谢您的回答我不知道预先存在的方法,但是我在QTreeWidget中实现了类似的方法来处理仅可见项的图标加载,我将用于QListWidget的一般技术将更简单一些(请原谅语法,我通常使用PyQt,因此在C++中这可能会关闭):

假设我有一个包含很多项的listwidget。当用户滚动查看更多项目时,我希望对正在查看的项目执行操作。是否可能触发一个事件itemsViewedChanged(QListWidgetItems*items),该事件提供用户当前查看的项目

如果没有,我如何实现这样的功能


感谢您的回答

我不知道预先存在的方法,但是我在QTreeWidget中实现了类似的方法来处理仅可见项的图标加载,我将用于QListWidget的一般技术将更简单一些(请原谅语法,我通常使用PyQt,因此在C++中这可能会关闭):

QList MyListWidget::visibleItems(){
QList*输出=新的QList();
//确保我们有一些物品
如果(!this->count()){
返回输出;
}
//计算我们范围内的开始项和结束项
QListWidgetItem*minimumItem=this->itemAt(5,5);
QListWidgetItem*maximumItem=this->itemAt(5,this->height()-5);
如果(!minimumItem){minimumItem=this->item(0);}
如果(!maximumItem){maximumItem=this->item(this->count()-1);}
//获取起始行和结束行
int minimum_row=this->indexForItem(minimumItem)->row();
int maximum_row=this->indexForItem(maximumItem)->row();
对于(int行=最小行;行附加(此->项(行));
}
返回输出;
}

这将获得列表小部件的可见项列表。要在用户编辑时动态检查和修改内容,可以连接到valueChanged(int)和rangeChanged()列表小部件的信号。这样,当用户滚动或调整视图大小时,您会对信号做出反应,并收集现在可见的项目列表。

我不知道有什么预先存在的方法,但是我在QTreeWidget中实现了类似的功能,只处理可见项目的图标加载,这是我将使用的一般技术对于QListWidget,它会简单一点(请原谅语法,我通常使用PyQt,因此在C++中可能会禁用它):

QList MyListWidget::visibleItems(){
QList*输出=新的QList();
//确保我们有一些物品
如果(!this->count()){
返回输出;
}
//计算我们范围内的开始项和结束项
QListWidgetItem*minimumItem=this->itemAt(5,5);
QListWidgetItem*maximumItem=this->itemAt(5,this->height()-5);
如果(!minimumItem){minimumItem=this->item(0);}
如果(!maximumItem){maximumItem=this->item(this->count()-1);}
//获取起始行和结束行
int minimum_row=this->indexForItem(minimumItem)->row();
int maximum_row=this->indexForItem(maximumItem)->row();
对于(int行=最小行;行附加(此->项(行));
}
返回输出;
}

这将获得列表小部件的可见项列表。要在用户编辑时动态检查和修改内容,可以连接到valueChanged(int)和rangeChanged()列表小部件的信号。这样,当用户滚动或调整视图大小时,您会对信号做出反应并收集现在可见的项目列表。

真的谢谢!我会看一看,然后告诉您这是否解决了我的问题:)呃,我没有任何值更改(int)或范围更改()我的listwidget的插槽…抱歉-这些信号在QListWidget的垂直滚动条上,而不是列表小部件本身-listwidget()->verticalScrollbar()谢谢,但我如何连接这样的东西?我尝试了连接(ui->listwidget->verticalScrollbar,SIGNAL(),this,SLOT()),但它找不到任何信号。如何将信号准确地连接到小部件内部项的插槽(如当前情况下listwidget的垂直滚动条)?再次感谢:)真的谢谢!我会看一看,然后告诉你这是否解决了我的问题:)呃,我的listwidget没有任何valueChanged(int)或rangeChanged()插槽…对不起-这些信号在QListWidget的垂直滚动条上,而不是列表小部件本身-listwidget()->verticalScrollbar()谢谢,但我如何连接这样的东西?我尝试了连接(ui->listWidget->verticalScrollBar,SIGNAL(),this,SLOT()),但没有找到任何信号。如何准确地将信号连接到小部件内部项的插槽(如当前情况下listwidget的垂直滚动条)?再次感谢:)
QList<QListWidgetItem*> MyListWidget::visibleItems() {
    QList<QListWidgetItem>* output = new QList<QListWidgetItem*>();

    // make sure we have some items
    if ( !this->count() ) {
        return output;
    }

    // calculate the beginning and end items in our range
    QListWidgetItem* minimumItem = this->itemAt(5, 5);
    QListWidgetItem* maximumItem = this->itemAt(5, this->height() - 5);

    if ( !minimumItem ) { minimumItem = this->item(0); }
    if ( !maximumItem ) { maximumItem = this->item(this->count() - 1); }

    // get the start and end rows
    int minimum_row = this->indexForItem(minimumItem)->row();
    int maximum_row = this->indexForItem(maximumItem)->row();

    for (int row = minimum_row; row <= maximum_row; row++) {
        output->append(this->item(row));
    }

    return output;
}