كيف يرسم المرء خلفية الصف بأكمله في qstyledemdelegate؟

StackOverflow https://stackoverflow.com/questions/2434004

  •  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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top