问题描述
使用默认的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); //降序排序
效果图

491

被折叠的 条评论
为什么被折叠?



