簡體   English   中英

QListView 通過 QStyledItemDelegate::createEditor 設置自定義編輯器

[英]QListView set Custom Editor via QStyledItemDelegate::createEditor

我想在每個QListView單元格中顯示自定義小部件(3 個標簽寬度不同 fonts 和 2 個工具按鈕)。 小部件必須處理鼠標事件才能正確處理 hover 事件和按鈕單擊 (因此我不能只在QStyledItemDelegate::paint()中繪制它)。

這是我希望列表視圖中的每一行的樣子:
在此處輸入圖像描述

主要思想: QAbstractItemView::openPersistentEditor()


#include <QApplication>

#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QToolButton>
#include <QVBoxLayout>

#include <QDateTime>

#include <QListView>
#include <QStringListModel>
#include <QStyledItemDelegate>

class Form : public QWidget
{
    //Q_OBJECT

public:
    explicit Form(QWidget *parent = nullptr)
    {
        verticalLayout = new QVBoxLayout(this);
        horizontalLayout = new QHBoxLayout();

        labelTitle = new QLabel(this);
        labelTitle->setFont(QFont("Calibri", 12, QFont::Bold));
        horizontalLayout->addWidget(labelTitle);

        toolButtonEdit = new QToolButton(this);
        toolButtonEdit->setText("E");
        horizontalLayout->addWidget(toolButtonEdit);

        toolButtonRemove = new QToolButton(this);
        toolButtonRemove->setText("R");
        horizontalLayout->addWidget(toolButtonRemove);

        verticalLayout->addLayout(horizontalLayout);

        labelDate = new QLabel(this);
        labelDate->setFont(QFont("Calibri", 8));
        verticalLayout->addWidget(labelDate);

        labelText = new QLabel(this);
        labelText->setFont(QFont("Calibri", 10));
        verticalLayout->addWidget(labelText);

        verticalLayout->setStretch(2, 1);

        setMinimumSize(QSize(300, 50));
    }

public:
    QVBoxLayout *verticalLayout;
    QHBoxLayout *horizontalLayout;
    QLabel *labelTitle;
    QToolButton *toolButtonEdit;
    QToolButton *toolButtonRemove;
    QLabel *labelDate;
    QLabel *labelText;
};


class MyDelegate : public QStyledItemDelegate
{
public:
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        auto editor = new Form(parent);
        return editor;
    }

    void setEditorData(QWidget *ed, const QModelIndex &index) const override
    {
        QVariant var = index.model()->data(index, Qt::DisplayRole);

        if (Form *editor = dynamic_cast<Form*>(ed))
        {
            editor->labelTitle->setText("SYMBOL");
            editor->labelDate->setText("date-time");
            editor->labelText->setText(var.toString());
        }
    }
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem& option, const QModelIndex &)const override
    {
        editor->setGeometry(option.rect);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Form form(nullptr);
    form.labelTitle->setText("TITLE");
    form.labelDate->setText(QDateTime::currentDateTime().toString());
    form.labelText->setText("text body");
    form.show();

    auto model = new QStringListModel;
    model->setStringList(QStringList()
        << "text body 1"
        << "text body 2"
        << "text body 3");

    auto view = new QListView(nullptr);
    view->setModel(model);

    int rowCount = model->rowCount();
    for (int row = 0; row < rowCount; ++row)
    {
        QModelIndex index = model->index(row, 0);
        view->openPersistentEditor(index);
    }

    view->show();

    return a.exec();
}

以下是列表視圖的實際外觀:
在此處輸入圖像描述


如何設置這樣一個自定義小部件來顯示視圖單元格?

請注意,當您定義自己的委托MyDelegate時,您從未實際使用它(即通過調用QAbstractItemView::setItemDelegate() 。因此,在調用openPersistentEditor()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM