Qt 之model/view (自定义委托代理)

简介

通过model和tableview配合使用能够很好的管理数据,就能够实现比较复杂的功能,例如复选框,进度条,自定义按钮等。网上关于这部分的教程比较多,但大多都不详细,因此结合网上的资料给出一个比较详细的教程。

效果

在这里插入图片描述

部分源代码

头文件.h

#ifndef BTNDELEGATE_H
#define BTNDELEGATE_H
#include <QStyledItemDelegate>
#include <QObject>
class QTableView;
class QPushButton;
class QPersistentModelIndex;
class BtnDelegate: public QStyledItemDelegate
{
    Q_OBJECT
public:
    enum BtnStatus
    {
        None_Status = -1,
        Hover_Status,
        Pressed_Status
    };
public:
    BtnDelegate(QObject *parent = nullptr);
    ~BtnDelegate() override;
    QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index) const override;
    // painting绘制按钮
    void paint(QPainter *painter,const QStyleOptionViewItem &option, const QModelIndex &index) const override;
    bool editorEvent(QEvent *event, QAbstractItemModel *model,const QStyleOptionViewItem &option, const QModelIndex &index) override;
    bool helpEvent(QHelpEvent *event,QAbstractItemView *view,const QStyleOptionViewItem &option,const QModelIndex &index) override;
    void setBtns(const QList<QPushButton *> &value);
    void setBtnWidth(int value);
    void setBtnHeight(int value);
    void setBtnHSpace(int value);
Q_SIGNALS:
    void Signal0(int);
    void Signal1(int);
    void Signal2(int);
    void Signal3(int);
private:
    BtnStatus currentStatus = None_Status;
    QPoint mousePoint;
    int btnWidth;
    int btnHeight;
    int btnHSpace;
    QList<QPushButton*> btns;
};

#endif // BTNDELEGATE_H

源文件.cpp


BtnDelegate::BtnDelegate(QObject *parent): QStyledItemDelegate(parent)
{

}

BtnDelegate::~BtnDelegate()
{
    foreach(auto var,btns)
    {
        if(var)
        {
            delete var;
            var = nullptr;
        }
    }
    btns.clear();
}

QWidget *BtnDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_UNUSED(parent)
    Q_UNUSED(option)
    Q_UNUSED(index)
    return nullptr;
}

void BtnDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyledItemDelegate::paint(painter,option,index);
    int count = btns.count();
    int hMarginHalf = (option.rect.width() - btnWidth*count - btnHSpace*(count-1))/2;
    int vMarginHalf = (option.rect.height()-btnHeight) / 2;

    for(int i=0;i<btns.count();i++)
    {
        int x = option.rect.left() + i * btnWidth + hMarginHalf + btnHSpace * i;
        int y = option.rect.top() + vMarginHalf;
        QStyleOptionButton styleOptionBtn;
        styleOptionBtn.rect = QRect(x,y,btnWidth,btnHeight);
        styleOptionBtn.state |= QStyle::State_Enabled;
        if(styleOptionBtn.rect.contains(mousePoint))
        {
            if(currentStatus == BtnStatus::Hover_Status)
                styleOptionBtn.state = QStyle::State_MouseOver;
            if(currentStatus == BtnStatus::Pressed_Status)
                styleOptionBtn.state = QStyle::State_Sunken;
        }
        QWidget* widget = btns.at(i);
        widget->style()->drawControl(QStyle::CE_PushButton,&styleOptionBtn,painter,widget);
    }
}

void BtnDelegate::setBtns(const QList<QPushButton *> &value)
{
    btns = value;
}

void BtnDelegate::setBtnWidth(int value)
{
    btnWidth = value;
}

void BtnDelegate::setBtnHeight(int value)
{
    btnHeight = value;
}

void BtnDelegate::setBtnHSpace(int value)
{
    btnHSpace = value;
}

```cpp
 QPushButton* btn =  new QPushButton;
    btn->setToolTip(QStringLiteral("初始参数"));
    btn->setStyleSheet(QStringLiteral(
                                   "QPushButton { border-image: url(:/imgs/imgs/res_rcd/edit01.png); } \
                                    QPushButton::hover { border-image: url(:/imgs/imgs/res_rcd/edit02.png); } \
                                    QPushButton::pressed { border-image: url(:/imgs/imgs/res_rcd/edit02.png); } \
                                    QPushButton::disabled { border-image: url(:/imgs/imgs/res_rcd/edit02.png); }"));

参考:https://blog.csdn.net/liang19890820/article/details/50974059

源代码地址

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值