方法一:代理
新建一个代理类,重写paint函数:
class CommonDelegate : public QStyledItemDelegate { Q_OBJECT public: CommonDelegate(); private: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; };
CommonDelegate::CommonDelegate() { } void CommonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem itemOption(option); if(itemOption.state&QStyle::State_HasFocus) { itemOption.state=itemOption.state^QStyle::State_HasFocus; } if(3==index.column()) { QPixmap pix; if(QString("结案")==index.data().toString()) pix.load(":/Resources/check.png"); else if(QString("激活")==index.data().toString()) pix.load(":/Resources/active.png"); QRect rect=option.rect; rect.adjust(0,6,0,0); rect.setSize(QSize(20,20)); pix.scaled(20,20,Qt::KeepAspectRatio); painter->setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform); painter->drawPixmap(rect,pix); } QStyledItemDelegate::paint(painter,itemOption,index); }
TableView设置:
this->setItemDelegate(new CommonDelegate());
效果:

图标和文字重叠,且点击后看不到图标,这不是我想要的效果。
方法二:重写Model
继承QSqlQueryModel(一般使用QSqlTableModel即可),重写data函数:
class SqlTableModel : public QSqlQueryModel { Q_OBJECT public: explicit SqlTableModel(QObject *parent=0); ~SqlTableModel(); QVariant data(const QModelIndex &idx, int role) const; };
QVariant SqlTableModel::data(const QModelIndex &idx, int role) const { QVariant value=QSqlQueryModel::data(idx,role); if(3==idx.column()&&Qt::DecorationRole==role) { QString PNType=idx.data().toString(); if(QString("结案")==PNType) { return QIcon(":/Resources/check.png"); } else if(QString("激活")==PNType) { return QIcon(":/Resources/active.png"); } } return value; }
效果:

部分效果需要使用QSS:
QTableView{ font-family:"Microsoft Yahei"; font-size:10pt; color: rgb(26,52,93); selection-color: black; selection-background-color: rgb(255,209,128); border: 0px; border-top: 1px solid lightgray; }
更多QSS使用方法,在Qt助手中搜索stylesheet,在Qt Style Sheets Examples 中查看。
文章评论