Russian Qt Forum
Ноябрь 23, 2024, 23:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QStylePainter и checkBox  (Прочитано 4448 раз)
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); то тоже выбъет ошибку, помогите разобраться в чем причина
Записан
twp
Гость
« Ответ #1 : Март 30, 2011, 09:59 »

а что возвращает painter->device()? случайно не 0?
Записан
blood_shadow
Гость
« Ответ #2 : Март 30, 2011, 10:14 »

а что возвращает painter->device()? случайно не 0?
нет, делал вывод ветка цикла идет по if (widget), а сообщение
qDebug() << "Error in void EmailDelegate::paint() in case Column_Default"; не выводиться так как в
ветке if (widget) есть ретурн
Записан
twp
Гость
« Ответ #3 : Март 30, 2011, 10:17 »

а что за ошибка просиходит?
Записан
blood_shadow
Гость
« Ответ #4 : Март 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;
 
           }
 
не отрисовывает чекбокс, остается пустая ячейка, если на нее клацнуть, выбивается ошибка
Записан
twp
Гость
« Ответ #5 : Март 30, 2011, 11:00 »

а во время падения приложения, стэк вызовов доступен?
и еще, может так попробовать получить виджет
Код:
    const QStyleOptionViewItemV3 *v3 = qstyleoption_cast<const QStyleOptionViewItemV3 *>(&option);
    QWidget *widget = v3 ? v3->widget : 0;
« Последнее редактирование: Март 30, 2011, 11:20 от twp » Записан
blood_shadow
Гость
« Ответ #6 : Март 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;
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.139 секунд. Запросов: 21.