❝该例子演示如何实现QListWidget窗口列表的动态「添加」和「删除」。❞
演示
一. 实现
- 小例子主要由MyListWidget和ItemWidget组成。
- 使用QListWidget的
insertItem
动态添加一项元素; - 使用QListWidget的
removeItemWidget
动态删除一项元素; - 使用QListWidget的
setItemWidget
设置指定的QWidget模板。 - 由于ItemWidget继承QWidget和QListWidgetItem,于是就有了以下操作:
/* 添加一项元素到QListWidget中 */
ItemWidget *itemWidget = new ItemWidget(this);
this->insertItem(this->count()-1, itemWidget);
/* 使用相同的ItemWidget */
this->setItemWidget(itemWidget, itemWidget);
二. 源码
代码语言:javascript复制#include <QPushButton>
#include <QListWidget>
#include <QListWidgetItem>
#include <QHBoxLayout>
#include <QLabel>
class ItemWidget : public QWidget, public QListWidgetItem
{
Q_OBJECT
public:
ItemWidget(QListWidget *parent = NULL) :
QWidget(parent),
m_listWidget(parent)
{
QPushButton *deleteButton = new QPushButton(QStringLiteral("删除"));
deleteButton->setStyleSheet(button_qss.arg("#EC7063"));
deleteButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QLabel *label = new QLabel(QString("Index: %1 => Hello world!").arg(m_listWidget->count()));
QHBoxLayout *h = new QHBoxLayout;
h->addWidget(label, 4);
h->addWidget(deleteButton, 1);
this->setLayout(h);
this->setSizeHint(QSize(300, 50));
QObject::connect(deleteButton, &QPushButton::clicked, [&](){
m_listWidget->removeItemWidget(this);
this->deleteLater();
});
}
private:
QListWidget *m_listWidget;
};
class MyListWidget : public QListWidget
{
Q_OBJECT
public:
MyListWidget(QWidget *parent = 0)
: QListWidget(parent)
{
this->resize(480, 320);
QPushButton *addButton = new QPushButton(QStringLiteral("添加"));
addButton->setStyleSheet(button_qss.arg("#1ABC9C"));
QListWidgetItem *item = new QListWidgetItem(this);
item->setSizeHint(QSize(width(), 50));
this->insertItem(0, item);
this->setItemWidget(item, addButton);
connect(addButton, &QPushButton::clicked, [&](){
ItemWidget *itemWidget = new ItemWidget(this);
this->insertItem(this->count()-1, itemWidget);
this->setItemWidget(itemWidget, itemWidget);
});
}
};
三. 按钮样式
代码语言:javascript复制const QString button_qss = R"(
QPushButton {
border: 0px;
border-radius: 2px;
margin: 0px;
padding: 0px;
font-size: 16px;
background: transparent;
color: black;
outline: none;
}
QPushButton:pressed {
outline: none;
background: #EC7063;
color: white;
}
QPushButton:hover {
outline: none;
background: %1;
color: white;
}
)";
四. 相关
- 2019-08-26期《分享QListWidget水平滑动示例》。