Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: izoomer от Декабрь 19, 2006, 16:18



Название: как нарисовать рамку у QListView ?
Отправлено: 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();
}

а все итемы перекрываются хотя прокрутка работает и видно что итемы там есть (за прямоугольником моим)
как рисовать на фоне за итемами ?


Название: как нарисовать рамку у QListView ?
Отправлено: Alexandr Az от Декабрь 19, 2006, 16:56
Расскажи зачем save вызываешь.....
Ну а чего они должны быть видны то, где они у тебя рисуются? Я не вижу. Отселя вывод - пусть рисуются с базового класса, тобишь вызови QListView::paintEvent(event). Либо я полностью не вкурил твой вопрос...................


Название: как нарисовать рамку у QListView ?
Отправлено: izoomer от Декабрь 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 на мою рамку .
Что не так ?
Заранее прошу прощения за банальные вопросы.


Название: как нарисовать рамку у QListView ?
Отправлено: Alexandr Az от Декабрь 19, 2006, 17:54
Какой бардюр то, который обрамляет то сам виджет? Так ты его здесь (в этом методе) не перерисуешь


Название: как нарисовать рамку у QListView ?
Отправлено: izoomer от Декабрь 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 от родителя в моем случае?


Название: как нарисовать рамку у QListView ?
Отправлено: Alexandr Az от Декабрь 20, 2006, 11:03
Как по мне (могу ошибаться) - то никак.
Получить паинтер от родителя - мона. но он аботать не будет, защищено спецом. гы. Получить мона так QPainter paint(this). Вьюпорт спецом сделан - чтобы ты мог рисовать  токи в области скролинга (точнее получать эту область). Вотс. (грубо, неверно, но доходчиво). Метод drawFrame, гы, не есть виртуальный, так что в пролёте, тем более его abstractScrollArea нагло его игнорирует. Во всем этом я могу жутко ошибатся конечно, но навряд. Вообще надо проще делать все. Как по мне - я бы сделал так: Запретил рисование какой либо рамки (простым выставлением проперти соответствующих) у QFrame, а твой лист воткнул бы на любой созданый виджет, который не наследуется от scrollArea и рисовал бы на нём что хотел. Хотя проще конечно сказать, чем сделать........ Если найдёшь как достучатся до рамки у потомков scrollArea свиснешь, самому интересно.............


Название: как нарисовать рамку у QListView ?
Отправлено: izoomer от Декабрь 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 ............................|
---------------------------|

и по кругу при навигации список крутился и выделенный итем по высоте выше остальных ?
Вот как такое сделать ?