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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как нарисовать рамку у QListView ?  (Прочитано 5723 раз)
izoomer
Гость
« : Декабрь 19, 2006, 16:18 »

Пробую так рисовать на QListView
Код:

myView::myView(QWidget *parent)
    : QListView(parent)
{
}

void myView::paintEvent(QPaintEvent *event)
{

    QStyleOptionViewItem option = viewOptions();

    QPainter painter(viewport());
    painter.save();

    QPen pen(Qt::blue, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    painter.setPen(pen);
    QRectF rectangle(option.rect.x(), option.rect.y(), option.rect.width(),option.rect.height());
    painter.drawRoundRect(rectangle,5,5);
    painter.restore();
}

а все итемы перекрываются хотя прокрутка работает и видно что итемы там есть (за прямоугольником моим)
как рисовать на фоне за итемами ?
Записан
Alexandr Az
Гость
« Ответ #1 : Декабрь 19, 2006, 16:56 »

Расскажи зачем save вызываешь.....
Ну а чего они должны быть видны то, где они у тебя рисуются? Я не вижу. Отселя вывод - пусть рисуются с базового класса, тобишь вызови QListView::paintEvent(event). Либо я полностью не вкурил твой вопрос...................
Записан
izoomer
Гость
« Ответ #2 : Декабрь 19, 2006, 17:36 »

да, это я как начинающий туплю ....
делаю так
Код:

myView::myView(QWidget *parent)
    : QListView(parent)
{
}

void myView::paintEvent(QPaintEvent *event)
{
    QStyleOptionViewItem option = viewOptions();

    QPainter painter(viewport());

    QPen pen(Qt::blue, 20, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    painter.setPen(pen);
    QRect rectangle(option.rect.x(), option.rect.y(), option.rect.width()-10,option.rect.height()-10);
    painter.drawRoundRect(rectangle,10,10);

    QListView::paintEvent(event);
}

рисуются и итемы мои и "прямоугольник мой"-и вижу где то в углу непонятный кусочек синего цвета (видать какие то остатки моего ректангла). Причем он прокручивается вместе со списком моим, а мне то нужно заменить тот бардюр стандартный которы у QListViev на мою рамку .
Что не так ?
Заранее прошу прощения за банальные вопросы.
Записан
Alexandr Az
Гость
« Ответ #3 : Декабрь 19, 2006, 17:54 »

Какой бардюр то, который обрамляет то сам виджет? Так ты его здесь (в этом методе) не перерисуешь
Записан
izoomer
Гость
« Ответ #4 : Декабрь 19, 2006, 20:00 »

а как же быть ?!

добавлено спустя 1 минуту:

 можно ли как то убрать этот бардюр и рисовать уже свои в видимой области (тем более у меня нет скроллбара в моем виевере)

добавлено спустя 1 час 52 минуты:

 если при таком коде
Код:

    QPainter painter(viewport());
    QPen pen(Qt::green, 10, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    painter.setPen(pen);
    painter.drawText(rect(),Qt::AlignLeft,"Test DRive this List");
    QListView::paintEvent(event);

мы получаем rect от QWidget .
Текст отображается, но прокручивается вместе со списком. Я так понимаю что нужно рисовать на паинтере не от QAbstractItemView, получаемом посредством QPainter painter(viewport()) а использовать painter от родителя ( QFrame или QWidget ) подсажите - как получить painter от родителя в моем случае?
Записан
Alexandr Az
Гость
« Ответ #5 : Декабрь 20, 2006, 11:03 »

Как по мне (могу ошибаться) - то никак.
Получить паинтер от родителя - мона. но он аботать не будет, защищено спецом. гы. Получить мона так QPainter paint(this). Вьюпорт спецом сделан - чтобы ты мог рисовать  токи в области скролинга (точнее получать эту область). Вотс. (грубо, неверно, но доходчиво). Метод drawFrame, гы, не есть виртуальный, так что в пролёте, тем более его abstractScrollArea нагло его игнорирует. Во всем этом я могу жутко ошибатся конечно, но навряд. Вообще надо проще делать все. Как по мне - я бы сделал так: Запретил рисование какой либо рамки (простым выставлением проперти соответствующих) у QFrame, а твой лист воткнул бы на любой созданый виджет, который не наследуется от scrollArea и рисовал бы на нём что хотел. Хотя проще конечно сказать, чем сделать........ Если найдёшь как достучатся до рамки у потомков scrollArea свиснешь, самому интересно.............
Записан
izoomer
Гость
« Ответ #6 : Декабрь 20, 2006, 14:50 »

та наверно так и сделаю - покладу на виджет и на виджетет нарусую все что надо .... до рамки потом буду достукиваться :-)
хотя получилось так сделать .....
Код:

myView::myView(QWidget *parent)
    : QListView(parent)
{
}

void myView::paintEvent(QPaintEvent *event)
{
    QPainter painter(viewport());
    QPen pen(Qt::green, 10, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    painter.setPen(pen);
    painter.drawRect(rect());
    QListView::paintEvent(event);
}

установив перед этим для этого виджета
Код:

    my_list->setFrameStyle(QFrame::NoFrame);
    QPalette p = my_list->palette();
    p.setBrush(QPalette::Base, Qt::transparent);
    my_list->setPalette(p);

    myDelegate *delegate = new myDelegate(this);
    my_list->setItemDelegate(delegate);

а делегаты рисую с отступами с учетом толщины рамки.
ДУмаю все таки будет лучше на виджет положить другой и рисовать на нем все что надо.
Мне бы теперь сделать список свой от QAbstractItemView. Нет ли у кого примеров (chart не предлагать из примеров)?
Например есть список из восьми итемов вот хотелось быб что бы выглядело так в приложении :
---------------------------
| item_7 ...........................|
| item_8 ...........................|
|--------------------------|
| item_1 ............................|
|--------------------------|
| item_2 ............................|
| item_3 ............................|
---------------------------|

и по кругу при навигации список крутился и выделенный итем по высоте выше остальных ?
Вот как такое сделать ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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