侧边栏壁纸
博主头像
三味的小站 博主等级

世界上没有偶然,有的只是必然的结果。

  • 累计撰写 63 篇文章
  • 累计创建 14 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
Qt

QTableView单元格显示图标

三味线
2019-03-29 / 0 评论 / 0 点赞 / 22 阅读 / 0 字

方法一:代理

新建一个代理类,重写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;
}

效果:

Snipaste_2019-03-29_10-28-02.png

部分效果需要使用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 Assistant中搜索stylesheet,在Qt Style Sheets Examples 中查看。

0

评论区