QListWidget小例子

2023-03-17 15:05:29 浏览数 (2)

❝该例子演示如何实现QListWidget窗口列表的动态「添加」「删除」。❞

演示

一. 实现

  1. 小例子主要由MyListWidget和ItemWidget组成。
  2. 使用QListWidget的insertItem动态添加一项元素;
  3. 使用QListWidget的removeItemWidget动态删除一项元素;
  4. 使用QListWidget的setItemWidget设置指定的QWidget模板。
  5. 由于ItemWidget继承QWidget和QListWidgetItem,于是就有了以下操作:
代码语言:javascript复制
/* 添加一项元素到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水平滑动示例》。

0 人点赞