我正在学习Qt,我遇到了一些困难。 我正在使用QTableWidget,当一个项目收到双击更改行颜色时:
m_model.setData(m_model.index(1,2) , QColor(Qt::blue), Qt::BackgroundColorRole);
但是现在我正在使用QTableView,我为此创建了一个QAbstractTableModel并且工作正常。我用QSortFilterProxyModel完成了一些过滤器,也可以正常工作。 但我没有成功改变行颜色。 我已经尝试过这样的事情:
bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (data(index, role) != value) {
qDebug() << index << value << role;
emit dataChanged(index, index, QVector<int>() << role);
return true;
}
return false;
}
不行。 在model :: setData()中,我写了一些调试,它在函数中加入,但不会改变颜色。
QModelIndex(1,2,0x0,MyModel(0x7fffffffe408)) QVariant(QColor, QColor(ARGB 1, 0, 0, 1)) 8
调试输出:
<div class="row">
<?php echo $form->labelEx($model,'transport_allowance'); ?>
<?php echo $form->dropDownList($model,'transport_allowance',array('Car'=>'Car','Others'=>'Others'),array('onchange'=>'return muFun(this.value)')); ?>
<?php echo $form->error($model,'transport_allowance'); ?>
</div>
<div id="others" style="display:none">
<div class="row">
<?php echo $form->labelEx($model,'transport_allowance'); ?>
<?php echo $form->textField($model,'transport_allowance'); ?>
<?php echo $form->error($model,'transport_allowance'); ?>
</div>
</div>
<div id="car" style="display:none">
<div class="row">
<?php echo $form->hiddenField($model,'transport_allowance',array('value'=>'450')); ?>
</div>
</div>
<script>
function muFun(obj){
if(obj=="Car"){
document.getElementById('car').style.display="block";
document.getElementById('others').style.display="none";
}else if(obj=="Others"){
document.getElementById('others').style.display="block";
document.getElementById('car').style.display="none";
}
}
</script>
答案 0 :(得分:0)
您可以在视图构造函数调用函数--setItemDelegate
中使用自己的项委托在委托重新实现绘画功能:
paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
从QStyleOptionViewItem获取有关几何的信息, 关于内容 - QModelIndex
要检查状态的一些标志,例如:
if(option.state & QStyle::State_Selected)
{
painter->save();
QPen pen(QColor(30, 144, 255, 255), 2, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
int w = pen.width()/2;
auto rect = option.rect;
rect.setX(0);
painter->setPen(pen);
painter->drawRect(rect.adjusted(w,w,-w,-w));
painter->restore();
}
至于双击事件 - 在视图中重新实现mouseDoubleClickEvent,获取索引(例如:indexAt(event-&gt; pos()))并存储一些颜色数据,然后在委托的绘画中使用该数据功能。