Russian Qt Forum

Qt => Model-View (MV) => Тема начата: blood_shadow от Март 29, 2011, 17:38



Название: QStylePainter и checkBox
Отправлено: blood_shadow от Март 29, 2011, 17:38
Добрый день,
создаю свой делегат с переопределенной ф-цией рисования:
Код
C++ (Qt)
void EmailDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                         const QModelIndex &index) const
{
 
   if (!index.isValid())
   {
       qDebug() << "index in void AccountDelegate::paint() not valid";
       return;
   }
 
   switch (index.column())
   {
       case Column_Number :
       {
           qDebug() << "In Column_Number";
           painter->save();
 
           if (option.state & QStyle::State_Selected)
               painter->fillRect(option.rect, option.palette.highlight());
 
           painter->setPen(option.state & QStyle::State_Selected
                           ? option.palette.highlightedText().color()
                               : option.palette.windowText().color());
 
           painter->drawText(option.rect, QString::number(index.row() + 1), QTextOption(Qt::AlignCenter));
 
           painter->restore();
 
           break;
       }
 
        case Column_Default :
        {
           qDebug() << "In Column_Default";
           QWidget *widget = dynamic_cast<QWidget *>(painter->device());
 
           if (widget)
           {
               QStylePainter sPainter(widget);
               QStyleOptionViewItem sOption;
 
               sOption.initFrom(widget);
               sOption.rect = option.rect;
               sOption.state |= QStyle::State_On;
 
               sPainter.drawControl(QStyle::CE_CheckBox, sOption);
 
               return;
 
           }
           qDebug() << "Error in void EmailDelegate::paint() in case Column_Default";
 
           break;
 
       }
 
....
}
 

Значения перечисления обозначают номера колонок, для колонки Column_Default я пытаюсь рисовать чек-бокс, но
проблема в том что программа выбивает с ошибкой(проблема именно в колонке Column_Default), более того если
закомментировать и оставить QStylePainter sPainter(widget); то тоже выбъет ошибку, помогите разобраться в чем причина


Название: Re: QStylePainter и checkBox
Отправлено: twp от Март 30, 2011, 09:59
а что возвращает painter->device()? случайно не 0?


Название: Re: QStylePainter и checkBox
Отправлено: blood_shadow от Март 30, 2011, 10:14
а что возвращает painter->device()? случайно не 0?
нет, делал вывод ветка цикла идет по if (widget), а сообщение
qDebug() << "Error in void EmailDelegate::paint() in case Column_Default"; не выводиться так как в
ветке if (widget) есть ретурн


Название: Re: QStylePainter и checkBox
Отправлено: twp от Март 30, 2011, 10:17
а что за ошибка просиходит?


Название: Re: QStylePainter и checkBox
Отправлено: blood_shadow от Март 30, 2011, 10:32
а что за ошибка просиходит?
да я вообще не могу понять в чем речь, идет по ветке if и после программа завершается с ошибкой,
если закомментировать и оставить только QStylePainter sPainter(widget); то тоже будет
ошибка, только что проверял, код
Код
C++ (Qt)
if (widget)
           {
               QStylePainter sPainter(widget);
               QStyleOptionViewItem sOption;
 
               sOption.initFrom(widget);
               sOption.rect = option.rect;
               sOption.state |= QStyle::State_On;
 
               sPainter.drawControl(QStyle::CE_CheckBox, sOption);
 
               return;
 
           }
 
не отрисовывает чекбокс, остается пустая ячейка, если на нее клацнуть, выбивается ошибка


Название: Re: QStylePainter и checkBox
Отправлено: twp от Март 30, 2011, 11:00
а во время падения приложения, стэк вызовов доступен?
и еще, может так попробовать получить виджет
Код:
    const QStyleOptionViewItemV3 *v3 = qstyleoption_cast<const QStyleOptionViewItemV3 *>(&option);
    QWidget *widget = v3 ? v3->widget : 0;


Название: Re: QStylePainter и checkBox
Отправлено: blood_shadow от Март 30, 2011, 14:12
а во время падения приложения, стэк вызовов доступен?
и еще, может так попробовать получить виджет
Код:
    const QStyleOptionViewItemV3 *v3 = qstyleoption_cast<const QStyleOptionViewItemV3 *>(&option);
    QWidget *widget = v3 ? v3->widget : 0;
жестокий завтык, позор мне...
Код
C++ (Qt)
case Column_Default :
       {
           qDebug() << "In Column_Default";
 
           const QWidget *widget = dynamic_cast<const QWidget *>(painter->device());
 
           if (widget)
           {
               QStyleOptionButton *buttonOption = new QStyleOptionButton;
 
               buttonOption->initFrom(widget);
               buttonOption->rect = option.rect;
               buttonOption->state |= QStyle::State_On;
               buttonOption->state |= QStyle::State_Enabled;
               buttonOption->state |= QStyle::State_Selected;
 
               QApplication::style()->drawControl(QStyle::CE_CheckBox, buttonOption, painter, widget);
 
               return;
 
           }
           qDebug() << "Error in void EmailDelegate::paint() in case Column_Default";
 
           break;
 
       }
 

QStyleOptionButton *buttonOption = new QStyleOptionButton;