QTableView 表格中插入图片、勾选框、下拉框
效果图
QT的Delegate,可以实现TableView中每一个单元格的显示形式。本例利用Delegate的paint函数绘制出图片、勾选框、下拉框样式。
具体代码:
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionViewItem viewOption(option);
if (option.state.testFlag(QStyle::State_HasFocus))
viewOption.state = viewOption.state ^ QStyle::State_HasFocus;
if(index.column() == 0){ //图片
const QAbstractItemModel * model=index.model();
QVariant var=model->data(index,Qt::DisplayRole);
if(var.isNull()) var=false;
QPixmap show=var.toBool()? QPixmap(":/svg/plus.svg"): QPixmap(":/svg/minus.svg");
QRect rect=option.rect;
show = show.scaled(rect.width(), rect.height(),
Qt::KeepAspectRatio);
int width=show.width();
int height=show.height();
int x=rect.x()+rect.width()/2-width/2;
int y=rect.y()+rect.height()/2-height/2;
painter->drawPixmap(x,y,show);
}else if (index.column() == 1) { //勾选框
bool d = index.model()->data(index, Qt::EditRole).toBool();
QStyleOptionButton checkBoxStyle;
checkBoxStyle.state = d ? QStyle::State_On : QStyle::State_Off;
checkBoxStyle.state |= QStyle::State_Enabled;
checkBoxStyle.iconSize = QSize(32, 32);
checkBoxStyle.rect = option.rect;
QCheckBox checkBox;
QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkBoxStyle, painter, &checkBox);
}else if (index.column() == 2) { //下拉框
QString value = index.model()->data(index, Qt::EditRole).toString();
QStyleOptionComboBox comboBoxStyle;
comboBoxStyle.currentText = value;
comboBoxStyle.state |= QStyle::State_Enabled;
comboBoxStyle.rect = option.rect;
QApplication::style()->drawComplexControl(QStyle::CC_ComboBox, &comboBoxStyle, painter);
QApplication::style()->drawControl(QStyle::CE_ComboBoxLabel, &comboBoxStyle, painter);
}
}