Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: izoomer от Апрель 07, 2007, 23:18



Название: Как поменять внешний вид QSCrollBar у QAbstarctItemView
Отправлено: izoomer от Апрель 07, 2007, 23:18
[QT-4.2.0 Linux]
Есть свой QAbstarctItemView , требуется в нем сделать свой скролл бар ... то есть например ... прозрачный с двумя треуголничками своего дизайна для вверх вниз ... и ползунок фикисрованного размера ... думал сделать через создание своего QScrollBar с переопределением QPaintEvent и последующей привязкой его к своему виверу через setVerticalScrollBar .... а как в PaintEvent указать что рисую стрелку ВВЕРХ , стрелку ВНИЗ и слайдер ? .... вот в чем вопрос ...

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

Вот создал такой вот свой скроллБар ...
Код:

#ifndef JSCROLLBAR_H
#define JSCROLLBAR_H

#include <QScrollBar>
#include <QStyle>
#include <QStyleOption>
#include <QPainter>

/**
@author root <root@localhost>
*/
class JScrollBar : public QScrollBar
{
public:
    JScrollBar();

    ~JScrollBar();
    void paintEvent ( QPaintEvent * event );
protected:

};

#endif



JScrollBar::JScrollBar()
{
}


JScrollBar::~JScrollBar()
{
}

/*!
    \fn JScrollBar::paintEvent ( QPaintEvent * event )
 */
void JScrollBar::paintEvent ( QPaintEvent * event )
{

    QPainter painter;
painter.begin(this);
painter.setBrush(QBrush(Qt::white, Qt::SolidPattern));
painter.drawRect(QRect(0,0,20,20));
painter.end();
     QStyleOptionSlider option;
     option.initFrom(this);
     style()->drawControl(QStyle::CE_ScrollBarSlider, &option, &painter, this);
}


затем его приделываю к своему виверу ...
Код:

JScrollBar * myScrollBar = new JScrollBar();
myListView->setVerticalScrollBar(myScrollBar);


а ничего не рисует .... покажите где не так или исправте как правильно. Заранее спасибо.

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

 решил делать через свой слайдер ... портому как сам скролл может распологаться в другом месте экрана, не обязательно быть привязаным к правому краю виджета .... а вот как поменять внешний вид слайдера ... что бы полоски не было, а был только слайдер (его передвигать буду программно) ... спасибо.


Название: Как поменять внешний вид QSCrollBar у QAbstarctItemView
Отправлено: Racheengel от Апрель 08, 2007, 13:01
а если переделать стиль? QStyle?


Название: Как поменять внешний вид QSCrollBar у QAbstarctItemView
Отправлено: goer от Апрель 08, 2007, 19:47
Код:

public:
    void paintEvent ( QPaintEvent * event );


А зачем открывать функцию для общего доступа? В виджете(базовом классе) она объявлена в защищенной секции.

Код:

void JScrollBar::paintEvent ( QPaintEvent * event )
{

    QPainter painter;
   painter.begin(this);
   painter.setBrush(QBrush(Qt::white, Qt::SolidPattern));
   painter.drawRect(QRect(0,0,20,20));
   painter.end();
}


Возможно этот код что то и рисует, но в любом случае

Код:

QStyleOptionSlider option;
     option.initFrom(this);
     style()->drawControl(QStyle::CE_ScrollBarSlider, &option, &painter, this);


зарисовывает скролом, определенным в текущем стайле, поверх нарисованого.

Если хочешь чтоб твой скрол перенял вид от базового скрола, то нарисуй сначала базовый скрол, а потом поверх рисуй свое. Я так делал когда надо было научить кнопку(QPushButton) размещать сверху иконку, а снизу надпись.
Нарисовать базовый скрол первым можно еще так:

Код:

void JScrollBar::paintEvent ( QPaintEvent * event )
{
   [b]QScrollBar::paintEvent ( event );[/b]

   QPainter painter;
   painter.begin(this);
   painter.setBrush(QBrush(Qt::white, Qt::SolidPattern));
   painter.drawRect(QRect(0,0,20,20));
   painter.end();
}