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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QScrollArea, наследование.  (Прочитано 6669 раз)
Kero
Гость
« : Январь 20, 2012, 14:54 »

Здравствуйте.
Хочу изменить paintEvent в QScrollArea, чтобы в ее углу указывались ряд характеристик. Кто может подсказать, как это правильно сделать? Я понимаю, что надо наследоваться, но почему-то когда пишу в зоне viewport(), то текст не отображается или обрезается почему-то.
Записан
twp
Гость
« Ответ #1 : Январь 20, 2012, 15:13 »

глянь пример в QtSDK\Examples\4.7\widgets\codeeditor\ как там отрисовываются номера строк
Записан
Kero
Гость
« Ответ #2 : Январь 20, 2012, 15:35 »

Это немного не то, что хотелось.
Надо, чтобы в ScrollArea отображался как обычно текст и + пара слов были фиксированы при прокручивании ползунка.
На просторах интернета наткнулся на похожее обсуждение. Советуют "Переопредели painEvent в классе viewport'a. ".
Кто-нибудь подскажет, как это сделать и поможет ли тут это?
Записан
twp
Гость
« Ответ #3 : Январь 20, 2012, 15:38 »

отрисовка вьюпорта происходит непосредственно в painEvent ScrollArea, так что "Переопредели painEvent в классе viewport'a. " это бред
Записан
Kero
Гость
« Ответ #4 : Январь 20, 2012, 15:45 »

Это было взято отсюда.
http://forum.vingrad.ru/forum/s/382cf1a9ab933347e650a9d665184e7b/topic-242728.html
Записан
twp
Гость
« Ответ #5 : Январь 20, 2012, 15:52 »

лучше читать ассистент
Цитировать
void QAbstractScrollArea::paintEvent ( QPaintEvent * event ) [virtual protected]

Reimplemented from QWidget::paintEvent().

This event handler can be reimplemented in a subclass to receive paint events (passed in event), for the viewport() widget.

Note: If you open a painter, make sure to open it on the viewport().
Записан
Kero
Гость
« Ответ #6 : Январь 20, 2012, 16:00 »

Что я делаю тогда неправильно?
Код
C++ (Qt)
NamedScroll::NamedScroll(QWidget *parent) :
   QScrollArea(parent)
{
   l1 = new QLabel();
   QVBoxLayout *layout = new QVBoxLayout(this);
   layout ->addWidget(l1);
   this->setLayout(layout);
}
 
void NamedScroll::paintEvent(QPaintEvent *event)
{
   mName = "0 \n 1 \n 2 \n 3 \n 4 \n 6 \n 7 \n 8 \n 9 \n 10 \n 11 \n 12 \n 13 \n 14 \n 15";
   l1->setText(mName);
   QScrollArea::paintEvent(event);
   QPainter paint(viewport());
   QRect mRect = this->viewport()->rect();
   paint.setPen(Qt::black);
   paint.drawText(mRect, Qt::AlignRight | Qt::AlignBottom, mNumber);
   update();
}
 
Получается, что текст mName не прокручивается, а пишется ровно столько строчек, сколько влезает.
Кроме прочего, если увеличиваю размер шрифта для drawText, то он обрезается.
Если добавить
paint.fillRect(mRect,Qt::black);
то будет закрашено небольшая полоска внизу ScrollArea.
« Последнее редактирование: Январь 20, 2012, 16:05 от Пантер » Записан
twp
Гость
« Ответ #7 : Январь 20, 2012, 16:13 »

что-то не вижу вызова
Код
C++ (Qt)
void QScrollArea::setWidget ( QWidget * widget )
 
Записан
Kero
Гость
« Ответ #8 : Январь 20, 2012, 16:23 »

Вроде добавил. Ничего не изменилось.
Код
C++ (Qt)
   QVBoxLayout *layout = new QVBoxLayout(this);
   l1 = new QLabel("123321");
   layout ->addWidget(l1);
   this->setLayout(layout);
   setBackgroundRole(QPalette::Dark);
   setWidget(l1);
 
« Последнее редактирование: Январь 20, 2012, 16:34 от Kero » Записан
twp
Гость
« Ответ #9 : Январь 20, 2012, 16:51 »

ну так а зачем устанавливать layout для ScrollArea? ей он не нужен, и по идее можно вообще обойтись без layout. Если же нужно скомпоновать несколько виджетов, то тогда да, например
Код
C++ (Qt)
   QHBoxLayout *layout = new QHBoxLayout();
   QLabel *l1 = new QLabel("Label1");
   QLabel *l2 = new QLabel("Label2");
   QLabel *l3 = new QLabel("Label3");
   layout ->addWidget(l1);
   layout ->addWidget(l2);
   layout ->addWidget(l3);
   QWidget *w = new QWidget();
   w->setLayout(layout);
   setWidget(w);
 
Записан
Kero
Гость
« Ответ #10 : Январь 23, 2012, 03:12 »

Проблема была в следующем: сам QScrollArea создавался в Qt Designer, поэтому ему автоматически ставился в соответствие scrollAreaWidgetContents. Затем QScrollArea преобразовался в свой класс, а WidgetContents оставался, который в дальнейшем, похоже, перекрывал widget созданный в конструкторе своего класса. Так как, если уменьшить размеры WidgetContents то данные видны, правда почему-то не прокручиваются. Сам WidgetContents почему-то удалить нельзя.

Создаю теперь новый ScrollArea динамически и добавляю его на форму. Но:
1) Почему-то не появляется полоса прокрутки.
2) ViewPort рисует только на свободной от элементов зоне. Как можно рисовать на всем пространстве ScrollArea, под созданными Label.

Код
C++ (Qt)
ScrollArea::ScrollArea(QWidget *parent) :
   QScrollArea(parent)
{
   QWidget *w = new QWidget();
   QHBoxLayout *layout = new QHBoxLayout();
   l1 = new QLabel("Label \n Label1 \n Label1 \n Label1 \n Label1 \n Label1 \n");
   layout ->addWidget(l1);
   w->setLayout(layout);
   setWidget(w);
}
 
 
 
void NamedLabel::paintEvent(QPaintEvent *event)
{
   QScrollArea::paintEvent(event);
   // Текст надписи меняется, размер должен увеличиться, но полоса прокрутки не появляется. Изменение SizePolicy не помогает.
   mName = "1 \n 2 \n 3 \n 4 \n 6 \n 7 \n8 !!! \n 1 \n 2 \n 3 \n 4 \n 6 \n 7 \n 8";
   l1->setText(mName);
 
   QPainter paint(viewport());
   QRect mRect = this->viewport()->rect();
   paint.fillRect(mRect,Qt::yellow);
   // Надпись не видно
   paint.drawText(mRect, Qt::AlignLeft | Qt::AlignTop, "Меня не видно");
   paint.drawText(mRect, Qt::AlignRight | Qt::AlignBottom, "Меня видно");
   paint.end();
}
 
« Последнее редактирование: Январь 23, 2012, 04:34 от Kero » Записан
Kero
Гость
« Ответ #11 : Январь 23, 2012, 13:31 »

Все, думаю тему можно закрывать.
Описанная проблема, решилась другим способом. Просто отнаследовался от QLabel, который находился в стандартном QScrollArea, в нем дорисовал под текстом нужную информацию. В самой программе связал ScrollBar с позицией этой информации, чтобы информация сдвигалась и выглядело как на фиксированном месте.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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