كيف يرسم المرء خلفية الصف بأكمله في qstyledemdelegate؟
-
19-09-2019 - |
سؤال
لدي Qtableview الذي أقوم بإعداد qstyledemdemdelegate مخصص.
بالإضافة إلى لوحة العناصر المخصصة، أريد أن أسلوب لون خلفية الصف للدول التحديد / المحومات. الشكل الذي سأذهب إليه شيء مثل شاشة KGET هذه:خلفية صف KGET http://www.binaryelysium.com/images/kget_background.jpeg
هنا هو رمزي:
void MyDelegate::paint( QPainter* painter, const QStyleOptionViewItem& opt, const QModelIndex& index ) const
{
QBrush backBrush;
QColor foreColor;
bool hover = false;
if ( opt.state & QStyle::State_MouseOver )
{
backBrush = opt.palette.color( QPalette::Highlight ).light( 115 );
foreColor = opt.palette.color( QPalette::HighlightedText );
hover = true;
}
QStyleOptionViewItemV4 option(opt);
initStyleOption(&option, index);
painter->save();
const QStyle *style = option.widget ? option.widget->style() : QApplication::style();
const QWidget* widget = option.widget;
if( hover )
{
option.backgroundBrush = backBrush;
}
painter->save();
style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, widget);
painter->restore();
switch( index.column() )
{
case 0: // we want default behavior
style->drawControl(QStyle::CE_ItemViewItem, &option, painter, widget);
break;
case 1:
// some custom drawText
break;
case 2:
// draw a QStyleOptionProgressBar
break;
}
painter->restore();
}
والنتيجة هي أن كل خلية فردية تتلقى خلفية moustover فقط عندما يكون الماوس فوقه، وليس الصف بأكمله. من الصعب وصفه هنا هو لقطة شاشة:نتيجة الكود أعلاه http://www.binaryelysium.com/images/loader_bg.jpeg
في تلك الصورة، كان الماوس فوق اليسار معظم الخلية، وبالتالي الخلفية المميزة .. لكنني أريد أن يتم رسم الخلفية عبر الصف بأكمله.
كيف يمكنني تحقيق ذلك؟
تحرير: مع بعض الفكر الذي أدركته أن حالة QStyle :: State_Mouseover لا يتم تمريرها فقط للخلية الفعلية التي انتهت بها الماوس، وعندما يتم استدعاء طريقة الطلاء للخلايا الأخرى في صف QStyle :: State_Mouseover ليس كذلك تعيين.
لذلك يصبح السؤال موجودا ل QStyle :: State_mouseover_صف الدولة (الإجابة: لا)، فكيف أذهب حول تحقيق ذلك؟
المحلول
عليك أن تخبر الرأي بتحديث خلاياها عندما يكون الماوس على صف واحد، لذلك أود أن أقترح تتبع ذلك في النموذج الخاص بك. ثم في حدث الطلاء، يمكنك طلب هذه البيانات من مؤشر النموذج باستخدام دور بيانات مخصص.
نصائح أخرى
void TrackDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem viewOption(option);
if (viewOption.state & QStyle::State_HasFocus)
viewOption.state = viewOption.state ^ QStyle::State_HasFocus;
QImage image(m_RowBackGroundImagePath);
QPixmap pixmap(m_RowBackGroundImagePath);
qDebug()<<"forward"<<pixmap.width()<<pixmap.height();
pixmap.scaled(option.rect.width(),option.rect.height());
qDebug()<<"back"<<pixmap.width()<<pixmap.height();
qDebug()<<option.rect.width()<<option.rect.height();
QBrush brush(pixmap);
painter->save();
painter->fillRect(option.rect, brush/*QColor(238, 233, 233, 255)*/);
painter->restore();
viewOption.rect = QRect(option.rect.x(), option.rect.y(), option.rect.width(), option.rect.height());
//viewOption.palette.setColor(QPalette::Text, QColor(Qt::red));
//viewOption.palette.setBrush ( QPalette::ButtonText, brush1);
QItemDelegate::paint(painter, viewOption,index);
int progress = index.model()->data(index,Qt::DisplayRole).toInt();
QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = QRect(option.rect.x(), option.rect.y()+(SETHEIGHT - PROGRESSBARHEIGHT)/2, option.rect.width(), /*option.rect.height()*/PROGRESSBARHEIGHT);
//qDebug()<<progressBarOption.rect.x()<<progressBarOption.rect.y()<<progressBarOption.rect.height()<<progressBarOption.rect.width();
//qDebug()<<option.rect.x()<<option.rect.y()<<option.rect.height()<<option.rect.width();
progressBarOption.state |= QStyle::State_Enabled;
progressBarOption.direction = QApplication::layoutDirection();
progressBarOption.fontMetrics = QApplication::fontMetrics();
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.textAlignment = Qt::AlignCenter;
progressBarOption.textVisible = true;
progressBarOption.progress = progress < 0 ? 0 : progress;
progressBarOption.text = QString().sprintf("%d%%", progressBarOption.progress);
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
break;
}