C++ 使用qt自定义代理更正高亮显示

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 &

我正在制作一个表控件,它除了显示其模型的DisplayRole中的文本数据外,还显示一些其他文本数据。在所有其他方面,文本和单元格显示应相同。我遇到的问题是突出显示单元格的正确显示

我目前正在使用以下代码:

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);
    }