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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Размеры окна и QGraphicsScene.  (Прочитано 9496 раз)
Lunex.08
Гость
« : Май 02, 2011, 13:21 »

Добрый день.
Проблема в следующем:
когда я создаю свой класс, наследуемый от QGraphicsView и устанавливаю размеры сцены и окна одинаковыми, появляются полосы прокрутки. И хоть я полосы убираю, прокрутка все равно совершается(управление итэмами идет с помощью стрелок). Если же размеры окна больше размера сцены, то смещаются система координат сцены, объекты не перемещаются до самой границы окна и еще куча неудобств. Причем если я создаю объект непосредственно QGraphicsView, то всего этого нет.
Как можно сделать так, чтобы размеры сцены и окна были одинаковыми, да к тому же не было прокрутки?
Премного благодарен.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 02, 2011, 23:15 »

См.    QGraphicsView::fitInView().
Записан

Qt 5.11/4.8.7 (X11/Win)
Lunex.08
Гость
« Ответ #2 : Май 03, 2011, 12:05 »

Хм. Опробовал - но проблема с масштабированием объектов QGraphicsItem. Муторно. Спасибо за идею.  Может, я все-таки на ней и остановлюсь.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Май 03, 2011, 12:14 »

Цитировать
Хм. Опробовал - но проблема с масштабированием объектов QGraphicsItem. Муторно.
И что за муторные проблемы?
Записан

Qt 5.11/4.8.7 (X11/Win)
meego_man
Гость
« Ответ #4 : Май 03, 2011, 15:12 »

Попробуйте использовать
Код:
... resizeEvent (QResizeEvent* pEvent)
{
  ....
  setSceneRect (viewport()->rect());
}
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Май 03, 2011, 15:17 »

2 meego_man:
И зачем так  Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
Lunex.08
Гость
« Ответ #6 : Май 03, 2011, 15:47 »

Цитировать
Хм. Опробовал - но проблема с масштабированием объектов QGraphicsItem. Муторно.
И что за муторные проблемы?
К примеру изменяются размеры как объектов, так и системы координат. Плюс не пойму одну вещь:
по оси y если размеры сцены, окна и QGraphicsView::fitInView() совпадают, то все нормально. если же совпадают соответственно оси x, то уже идет прокрутка. Не пойму из-за чего.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Май 03, 2011, 15:51 »

Что-то не так делаешь.
Цитировать
К примеру изменяются размеры как объектов, так и системы координат.
Значит при изменении размера окна меняешь размер сцены, что делать никак нельзя.
Достаточно в QGraphicsView::resizeEvent() вызвать fitInView().
Записан

Qt 5.11/4.8.7 (X11/Win)
meego_man
Гость
« Ответ #8 : Май 03, 2011, 16:00 »

2 meego_man:
И зачем так  Непонимающий
затем чтобы не было полос прокрутки
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Май 03, 2011, 16:08 »

Цитата: meego_man
затем чтобы не было полос прокрутки
А чего же ты не указал, что в таком случае придётся пересчитать геометрию всех элементов сцены?

Вот работающий пример для понимания:
Код
C++ (Qt)
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>
 
class CircleItem : public QGraphicsItem
{
public:
CircleItem( qreal radius, QGraphicsItem* parent = 0 )
: QGraphicsItem( parent )
, radius_( radius ) {}
virtual ~CircleItem() {}
void paint( QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0 )
{
painter->drawEllipse( QRectF( -radius_ / 2, -radius_ / 2, radius_, radius_ ) );
}
QRectF boundingRect() const
{
return QRectF( -radius_ / 2, -radius_ / 2, radius_, radius_ );
}
private:
qreal radius_;
};
 
class GraphicsView : public QGraphicsView
{
public:
GraphicsView( QWidget* p = 0 ) : QGraphicsView( p ) {}
void resizeEvent( QResizeEvent* e )
{
fitInView( scene()->sceneRect() );
}
};
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
 
GraphicsView gv;
QGraphicsScene scene( -150, -150, 300, 300 );
 
gv.setScene( &scene );
gv.setRenderHint( QPainter::Antialiasing );
 
for( qreal r = 20; r < 300; r += 10 )
scene.addItem( new CircleItem( r ) );
 
gv.show();
 
return app.exec();
}
 
« Последнее редактирование: Май 03, 2011, 16:10 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Lunex.08
Гость
« Ответ #10 : Май 04, 2011, 12:40 »

meego_man, GreatSnake, большое спасибо за помощь!
В resizeEvent() я сделал fitInView(размеры окна); Все работает на ура! Еще раз спасибо!
И еще вопрос не по теме: чтоб определять столкновения, обязательно переопределять shape у итема?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Май 04, 2011, 12:47 »

Цитировать
И еще вопрос не по теме: чтоб определять столкновения, обязательно переопределять shape у итема?
Если элемент не прямоугольный, то да.
Записан

Qt 5.11/4.8.7 (X11/Win)
Lunex.08
Гость
« Ответ #12 : Май 04, 2011, 12:56 »

И вытекает вопрос: переопределив shape у итема, получение списка объектов должно производиться в системе координат сцены?
Если у меня к примеру прямоугольный объект размеров 0, 0, 20, 20 находится на позиции 20, 20, то и список объектов ниже к примеру от объекта надо так: scene()->items(QPolygonF() << mapToScene(20, 20) << mapToScene(40, 40))?
« Последнее редактирование: Май 04, 2011, 13:00 от Lunex.08 » Записан
Lunex.08
Гость
« Ответ #13 : Май 07, 2011, 18:01 »

Вопрос снят, спасибо за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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