【QListWidget如何自定义排序】


问题描述

使用默认的QListWidget::sortItems()对QListWidget中的QListWidgetItem进行排序只能按照默认的字典顺序进行排序, 而且也不能使用QListWidget::setItemWidget在QListWidgetItem放自定义的QWidget. 那如何进行自定义排序呢?

解决方法

1、继承并重写QListItemWidget的"<"运算符

MyListWidgetItem.h

#include <QListWidgetItem>
#include "MyWidget.h"

class MyListWidgetItem : public QListWidgetItem
{
public:
    MyListWidgetItem(MyWidget *myWidget = nullptr);

	//重写 "<" 运算符
    bool operator<(const QListWidgetItem &other) const override;

    MyWidget* m_widget;
};

MyListWidgetItem.cpp

#include "MyListWidgetItem.h"

MyListWidgetItem::MyListWidgetItem(MyWidget *myWidget) : QListWidgetItem()
{
    m_widget = myWidget;
}

bool MyListWidgetItem::operator<(const QListWidgetItem &other) const
{
	//MyWidget继承QWidget类,下段代码是按照MyWidget中的成员m_name进行升序排序的
    const MyListWidgetItem* otherItem = dynamic_cast<const MyListWidgetItem*>(&other);
    if (otherItem) {
        return m_widget->m_name < otherItem->m_widget->m_name;
    }
    return QListWidgetItem::operator<(other);
}

2.使用QListWidget::sortItems进行排序

代码如下(示例):

    MyWidget *widget1 = new MyWidget();
    MyWidget *widget2 = new MyWidget();
    MyWidget *widget3 = new MyWidget();
    
    widget1->m_name = "192.168.100.125";
    widget2->m_name = "192.168.100.100";
    widget3->m_name = "192.168.100.110";
    
    MyListWidgetItem* item1 = new MyListWidgetItem(widget1);
    MyListWidgetItem* item2 = new MyListWidgetItem(widget2);
    MyListWidgetItem* item3 = new MyListWidgetItem(widget3);

	//向QlistWidget增加MyListWidgetItem
    ui->listWidget->addItem(item1);
    ui->listWidget->addItem(item2);
    ui->listWidget->addItem(item3);

	//将MyWidget放入MyListWidgetItem中
    ui->listWidget->setItemWidget(item1, widget1);
    ui->listWidget->setItemWidget(item2, widget2);
    ui->listWidget->setItemWidget(item3, widget3);

	//自定义排序
    ui->listWidget->sortItems();					//默认升序排序
    ui->listWidget->sortItems(Qt::AscendingOrder);	//升序排序
    ui->listWidget->sortItems(Qt::DescendingOrder);	//降序排序

效果图

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值