C++ 使用qt自定义代理更正高亮显示
我正在制作一个表控件,它除了显示其模型的DisplayRole中的文本数据外,还显示一些其他文本数据。在所有其他方面,文本和单元格显示应相同。我遇到的问题是突出显示单元格的正确显示 我目前正在使用以下代码:C++ 使用qt自定义代理更正高亮显示,c++,qt,user-interface,C++,Qt,User Interface,我正在制作一个表控件,它除了显示其模型的DisplayRole中的文本数据外,还显示一些其他文本数据。在所有其他方面,文本和单元格显示应相同。我遇到的问题是突出显示单元格的正确显示 我目前正在使用以下代码: void MatchDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (option.state &
void MatchDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
painter->save();
QString str = qvariant_cast<QString>(index.data())+ "\n";
str += QString::number(qvariant_cast<float>(index.data(Qt::UserRole)));
if (option.state & QStyle::State_Selected)
painter->setBrush(option.palette.highlightedText());
else
painter->setBrush(qvariant_cast<QBrush>(index.data(Qt::ForegroundRole)));
painter->drawText(option.rect, qvariant_cast<int>(index.data(Qt::TextAlignmentRole)), str);
painter->restore();
}
void MatchDelegate::paint(QPainter*painter,const QStyleOptionViewItem&option,const QModelIndex&index)const
{
if(option.state&QStyle::state_选中)
painter->fillRect(option.rect,option.palete.highlight());
画师->保存();
QString str=qvariant\u cast(index.data())+“\n”;
str+=QString::number(qvariant_cast(index.data(Qt::UserRole));
if(option.state&QStyle::state_选中)
painter->setBrush(option.palete.highlightedText());
其他的
painter->setBrush(qvariant_cast(index.data(Qt::ForegroundRole));
painter->drawText(option.rect,qvariant_cast(index.data(Qt::TextAlignmentRole)),str);
画师->还原();
}
但是,结果如下所示:
文本颜色错误,单元格周围没有虚线,当控件失去焦点时,单元格将保持蓝色,而不是像默认单元格那样变为浅灰色
应如何更改绘制代码以解决这些问题?请尝试下面的代码,它将起作用 选中时,将drawControl设置为小心绘制虚线(让Qt在内部小心) 固定(虚线,文字颜色和多行)而选择单元格
void MatchDelegate::paint(QPainter*painter,const QStyleOptionViewItem&option,const QModelIndex&index)const
{
QStyleOptionViewItemV4 opt=选项;
initStyleOption(&opt,index);
const QWidget*widget=option.widget;
QString str=qvariant\u cast(index.data())+“\n”;
str+=QString::number(qvariant_cast(index.data(Qt::UserRole));
opt.text=“”;
//选择权
QStyle*style=widget?widget->style():QApplication::style();
if(option.state&QStyle::state_选中)
{
//选择时使用白色笔
画师->设置笔(Qt::白色);
painter->setBrush(option.palete.highlightedText());
//此调用将注意在选择时绘制虚线
样式->绘图控件(QStyle::CE_ItemViewItem,&opt,painter,widget);
}
其他的
{
painter->setPen(QPen(option.palete.foreground(),0));
painter->setBrush(qvariant_cast(index.data(Qt::ForegroundRole));
}
painter->drawText(option.rect,qvariant_cast(index.data(Qt::TextAlignmentRole)),str);
}
似乎您没有分别设置QPen.(画笔颜色和样式)白色和Qt::DashLine。如何根据调色板设置画笔?调用基类paint..QStyledItemDelegate::paint(画笔、选项、索引);“可能会解决您的问题。我希望重新实现该部分,而不仅仅是使用它。默认情况下,当您选择一个项目委托时,它将用高亮文本高亮显示虚线边框。我尝试过这一点。单元格高亮显示正确,但由于某些原因,带换行符的字符串不会显示在两行上。@Srv19已为multiln更新。”e支持。它很可能会得到解决。
void MatchDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItemV4 opt = option;
initStyleOption(&opt, index);
const QWidget *widget = option.widget;
QString str = qvariant_cast<QString>(index.data())+ "\n";
str += QString::number(qvariant_cast<float>(index.data(Qt::UserRole)));
opt.text = "";
//option
QStyle *style = widget ? widget->style() : QApplication::style();
if (option.state & QStyle::State_Selected)
{
// Whitee pen while selection
painter->setPen(Qt::white);
painter->setBrush(option.palette.highlightedText());
// This call will take care to draw, dashed line while selecting
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
}
else
{
painter->setPen(QPen(option.palette.foreground(), 0));
painter->setBrush(qvariant_cast<QBrush>(index.data(Qt::ForegroundRole)));
}
painter->drawText(option.rect, qvariant_cast<int>(index.data(Qt::TextAlignmentRole)), str);
}