使用qlistwidget 实现定时刷新自定义委托显示c++实现
时间: 2023-11-27 21:02:51 浏览: 76
Qt 侧边栏+自定义气泡提示对话框;Qt5.15.2+vs2019编译器
5星 · 资源好评率100%
可以通过以下步骤实现:
1. 创建自定义类并实现相关属性和方法,如下所示:
```cpp
class Item {
public:
Item(QString name, int price):m_name(name), m_price(price){}
QString getName() const {return m_name;}
int getPrice() const {return m_price;}
private:
QString m_name;
int m_price;
};
```
2. 创建自定义委托类并实现相关方法,如下所示:
```cpp
class ItemDelegate : public QStyledItemDelegate {
public:
ItemDelegate(QObject* parent = nullptr): QStyledItemDelegate(parent) {}
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
Q_UNUSED(option);
Q_UNUSED(index);
QLineEdit* editor = new QLineEdit(parent);
return editor;
}
void setEditorData(QWidget* editor, const QModelIndex& index) const override {
QString value = index.model()->data(index, Qt::EditRole).toString();
QLineEdit* lineEdit = dynamic_cast<QLineEdit*>(editor);
lineEdit->setText(value);
}
void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override {
QLineEdit* lineEdit = dynamic_cast<QLineEdit*>(editor);
QString value = lineEdit->text();
model->setData(index, value, Qt::EditRole);
}
void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
Q_UNUSED(index);
editor->setGeometry(option.rect);
}
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
Q_UNUSED(option);
QString name = index.model()->data(index.model()->index(index.row(), 0), Qt::DisplayRole).toString();
int price = index.model()->data(index.model()->index(index.row(), 1), Qt::DisplayRole).toInt();
Item item(name, price);
painter->drawText(option.rect, Qt::AlignLeft | Qt::AlignVCenter, item.getName());
painter->drawText(option.rect, Qt::AlignRight | Qt::AlignVCenter, QString::number(item.getPrice()));
}
};
```
在自定义委托类中,重写了 createEditor、setEditorData、setModelData、updateEditorGeometry 和 paint 方法。其中,createEditor 方法用于创建自定义编辑器,setEditorData 和 setModelData 方法分别用于将数据从模型传递到编辑器和将数据从编辑器传递回模型,updateEditorGeometry 方法用于设置编辑器的位置和大小,paint 方法用于绘制自定义项的内容。
3. 创建 QListWidget 控件并设置定时器,如下所示:
```cpp
#include <QApplication>
#include <QWidget>
#include <QListWidget>
#include <QTimer>
#include <QStyledItemDelegate>
#include <QLineEdit>
#include "item.h"
#include "itemdelegate.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QListWidget listWidget;
listWidget.setItemDelegate(new ItemDelegate(&listWidget));
QTimer timer;
timer.start(1000);
QObject::connect(&timer, &QTimer::timeout, [&]() {
QList<Item> items = {Item("item1", 10), Item("item2", 20), Item("item3", 30)};
listWidget.clear();
for (const auto& item : items) {
QListWidgetItem* listWidgetItem = new QListWidgetItem(&listWidget);
listWidgetItem->setData(Qt::DisplayRole, item.getName());
listWidgetItem->setData(Qt::UserRole, item.getPrice());
listWidget.addItem(listWidgetItem);
}
});
listWidget.show();
return a.exec();
}
```
在定时器触发的 lambda 表达式中,创建 Item 实例列表并将其添加到 QListWidget 控件中。每次刷新前先清空 QListWidget,然后使用 QListWidgetItem 将 Item 实例的名称和价格添加到 QListWidget 中,并使用 setItemDelegate 方法设置自定义委托类。
这样就可以实现定时刷新自定义委托的显示了。
阅读全文