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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: paintEvent прорисовка виджета  (Прочитано 4102 раз)
TranE91
Гость
« : Апрель 18, 2011, 05:06 »

 Qt изучаю не так уж много, время обрезает возможность углубиться. Проблемка такова:
Код:
class A: public QWidget
{
  friend class B;
  QList<B> list_B;
/*...*/
}
class B
{
  friend class C;
  QList<C> list_C;
 /*...*/
}
class C
{
  /*...*/
}
Как же все-таки в данном случае организовать прорисовку всех классов виджета, через одного единственного класса А?
Как понял, если выразить данную постановку задачи как от унаследованных членов графической сцены, то выглядеть это будет как-то так:
Код:
class A: QGraphicsScene
{
  friend class B;
  QList<B> list_B;
public:
  QGraphicsScene retA()
  {
     /*прокручиваем весь список*/
        this->addItem( list_B.pop_back()); 
      /* что-то еще делаем и возвращаем this*/
  }
/*...*/
}
class B: public QGraphicsItemGroup
{
  friend class C;
  QList<C> list_C;
public:
   /*делаем подобную операцию, с добавлением элементов класса С в группу В*/
   /*реализуем обязательные виртуальные функции [i]boundingRect[/i] and [i]paint[/i]*/
 
}
class C: public QGraphicsItem
{
  /*реализуем обязательные виртуальные функции [i]boundingRect[/i] and [i]paint[/i]*/
}
Как же все это прорисовать при создании виджета?
Записан
blood_shadow
Гость
« Ответ #1 : Апрель 18, 2011, 10:26 »

ни вижу причин чудить с друзьями класса, друзья классы как мне кажется нарушают инкапсуляцию
если необходимо в каждом классе сделать возможность своего "особенного" рисования,
это можно реализовать через виртуальные ф-ции и наследование, то есть:
Код
C++ (Qt)
class A
{
public:
   A() {}
   void virtual somePaint() { /* realization */}
};
 
class B : public A
{
public:
   B() {}
   void somePaint() { /* B-specific realization */}
}
 
class C : public A
{
public:
   C() {}
   void somePaint() { /* C-specific realization */}
}
 
 

более того чтобы класс А представлял только интерфейс его можно сделать абстрактным,
и заставить все классы переопределять void somePaint() в обязательном порядке:
Код
C++ (Qt)
class A
{
public:
   A() {}
   void virtual somePaint() = 0;
};
 
Если же класс А не будет абстрактным и в классах-потомках не переопределять виртуальную
ф-цию, то для классов B и C будет вызываться void A::somePaint()
Записан
TranE91
Гость
« Ответ #2 : Апрель 18, 2011, 17:38 »

Хм, вот насчет виртуальных ф-ий спасибо конечно за идейку, но дело в том, что при реализации поставленной мне задачи, юедт не совсем правильно реализовать систему с помощью наследования.
Нужно реализовать нотный стан (табулатуру).
Дорожка: включает в себя список Тактов. Такт: включает в себя список Нот. Пока что только такая идея систематизации пришла на ум.
Записан
blood_shadow
Гость
« Ответ #3 : Апрель 18, 2011, 19:26 »

Хм, вот насчет виртуальных ф-ий спасибо конечно за идейку, но дело в том, что при реализации поставленной мне задачи, юедт не совсем правильно реализовать систему с помощью наследования.
Нужно реализовать нотный стан (табулатуру).
Дорожка: включает в себя список Тактов. Такт: включает в себя список Нот. Пока что только такая идея систематизации пришла на ум.
эта схема организации подходит для контейнеров например:
одну дорожку можно представить как -> QList <QStringList> думаю должно подойти
Записан
TranE91
Гость
« Ответ #4 : Апрель 19, 2011, 02:47 »

Ну что-то наподобие того, что я в самом начале предлагал использовать, только без наследования.
Теперь столкнулся с другой проблемкой, прорисовкой.

Код
C++ (Qt)
#ifndef TRACK_H
#define TRACK_H
 
#include <QtGui>
 
class Track : public QWidget
{
   Q_OBJECT
public:
   Track(QWidget *parent = 0);
 
   QSize sizeHint() const;
   void paintEvent(QPaintEvent *);
};
#endif // TRACK_H
Код
C++ (Qt)
#include "track.h"
#include "note.h"
Track::Track(QWidget *parent) :
   QWidget(parent)
{    
   setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);    
}
 
void Track::paintEvent(QPaintEvent *e)
{
  QPainter painter;
  painter.begin(this);
  painter.drawLine(0,0,100,500);
  painter.end();
  Note n;
  n.paint();
  /*
   Note *n = new Note();
  n->paint();
*/

}
 
QSize Track::sizeHint() const
{
   return QSize(900,76);
}
 
Код
C++ (Qt)
#ifndef NOTE_H
#define NOTE_H
#include "track.h"
class Note : public Track
{
   Q_OBJECT
public:
   Note(QWidget *parent = 0):
           Track(parent) {}
   void paint()
   {
       QPainter pa;
       pa.begin(this);
       pa.drawLine(0,0,900,900);
       pa.end();
   }
   void paintEvent(QPaintEvent *)
    {}
   QSize sizeHint() const
   {
       return QSize(900,76);
   }
};
#endif // NOTE_H
 
Код:
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::end: Painter not active, aborted
Почему же тут не прорисовывается элемент Note?
« Последнее редактирование: Апрель 19, 2011, 03:18 от TranE91 » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Апрель 19, 2011, 10:15 »

Цитата: assistant::QPainter
Warning: When the paintdevice is a widget, QPainter can only be used inside a paintEvent() function or in a function called by paintEvent(); that is unless the Qt::WA_PaintOutsidePaintEvent widget attribute is set. On Mac OS X and Windows, you can only paint in a paintEvent() function regardless of this attribute's setting.

И непонятно - какой вообще смысл в Note? Ведь как виджет он не используется.
Кто мешает отрисовать линию в Track::paintEvent()?
« Последнее редактирование: Апрель 19, 2011, 10:24 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
blood_shadow
Гость
« Ответ #6 : Апрель 19, 2011, 11:25 »

вообщем как сказали выше нельзя рисовать по виджету вне QPaintEvent()
если у тебя столь простые ноты можно вообще не организовать для них отдельный класс
если же класс надо, и реализововать такие примитивные действия как рисования линий,
то ненужно наследоватся от Track и QWidget, ты же не рисуешь виджет, посмотри в ассистанте
Star Delegate Example
Записан
TranE91
Гость
« Ответ #7 : Апрель 19, 2011, 19:52 »

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


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