简介
通过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