Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
CheBurashka21
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 5
#1

QGraphicsScene/View - пробелмы при запуске приложения - C++ Qt

24.05.2016, 16:24. Просмотров 367. Ответов 8
Метки нет (Все метки)

Всем привет.

В кратце о приложении - одна экранная форма, на которой отображается карта местности с координатной сеткой, пользователь имеет возможность добавлять/удалять объекты на карте.

Карта реализована с помощью QGraphicsScene ( в коде называется scene) и отображение с помощью QGraphicsView, который собственно и лежит в ui'шке (ui->graphicsView). Размеры сцены, фон определяется в конструкторе окна.

Затем graphicsView назначается сцена, центр, масштаб, координатная сетка:

C++ (Qt)
1
2
3
4
ui->graphicsView->setScene(&scene);
ui->graphicsView->centerOn(0,0);
ui->graphicsView->fitInView(scene.sceneRect(), Qt::KeepAspectRatio);
mapnet();

Координатная сетка наносится c помощью функции mapnet():
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mapnet()
{   //удаляем старую сетку
    for (int i=scene.items().count()-1; i>-1; i--)
    {
        if(scene.items().at(i)->type()==6)
                scene.removeItem(scene.items().at(i));
    }
    //рисуем новую
    int boldness=6;
    if (1000/scale<500)
    {boldness=3;}
    if (1000/scale<250)
    {boldness=2;}
    if (1000/scale<100)
    {boldness=1;}
 
    for(int i=-3000; i<3001; i+=1000/scale)
    {
        scene.addLine(i,-3000,i,3000,QPen(QBrush(Qt::white),boldness));
    }
    for(int i=-3000; i<3001; i+=1000/scale)
    {
        scene.addLine(-3000,i,3000,i,QPen(QBrush(Qt::white),boldness));
    }
        ui->graphicsView->ensureVisible(-3000, -3000, 6000, 6000, 0 ,0);
}
При запуске приложения на форме я вижу свою сцену с правильным фоном и отсутствием каких-либо объектов, хотя должна быть как минимум сетка. При этом при отладке явно видно, что программа заходит в mapnet() и она выполняется.
Если инициировать изменение масштаба карты, то сразу отобразится сетка, которая и должна была быть.
Изменение масштаба карты:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
resizemap()
{
    ui->graphicsView->fitInView(scene.sceneRect(),Qt::KeepAspectRatio);
 
    ui->scale->setText("Масштаб: "+QString::number(1000/scale)+"м");
    ui->graphicsView->scale(scale, scale);
    double scl = 1./qSqrt(ui->graphicsView->transform().determinant());
 
    if(MDS::count>0)
    {
    mds_pointer->mds_pic->setScale(scl);
    }
 
    if(TNPA::count>0)
    {
    tnpa_pointer->tnpa_pic->setScale(scl);
    }
 
    if (NOSITEL::count>0)
    {
    nositel_pointer->nos_pic->setScale(scl);
    }
 
    if (centerobj!=0)
    {ui->graphicsView->centerOn(centerobj);}
    else
    {ui->graphicsView->centerOn(0,0);}
    mapnet();
При попытке добавить объекты на карту пользователем объект добавляется, ставится в точку (0;0), хотя координаты ему задаются другие, координатная сетка при этом также появляется после первого изменения масштаба. Если изменение масштаба вызвать в конструкторе формы - это не дает никаких изменений. Если объект был добавлен, то он окажется в точке (0;0), а не там, куда его добавляли. Если при этом пользователь изменит масштаб - карта перерисуется, появится сетка и объекты расставятся по тем координатам, которые им были заданы.

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

Собственно вопрос - как заставить корректно работать сцену и графиксвью сразу после запуска программы, ведь файла для загрузки может и не быть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2016, 16:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос QGraphicsScene/View - пробелмы при запуске приложения (C++ Qt):

Ошибка при запуске приложения
Я скачал QT creator на Windows 10,попробовал запустить,для теста,программу,и...

Warning при запуске приложения
Когда я запускаю свое приложение, в консоль выводится &quot;Qt Warning - invalid...

Задержка при запуске приложения
Надо выставить задержку при запуске приложения, есть такая функция main: ...

При запуске приложения ничего не происходит
Делаю парсер Excel файлов, все было нормально, но сегодня открываю Qt Creator,...

Спрятать окно при запуске приложения
Необходимо запустить программу, но, чтобы главная форма находилась в скрытом...

Передать класс в QML при запуске приложения
Здравствуйте. Мне нужно передать в QML класс (в моем случае с настройками), до...

8
mevn
136 / 103 / 23
Регистрация: 06.10.2008
Сообщений: 451
25.05.2016, 07:16 #2
А переменная scale - при первом вызове чему равна?
0
CheBurashka21
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 5
25.05.2016, 07:44  [ТС] #3
Цитата Сообщение от mevn Посмотреть сообщение
А переменная scale - при первом вызове чему равна?
scale = 1, инициализирована в другом месте.
0
mevn
136 / 103 / 23
Регистрация: 06.10.2008
Сообщений: 451
25.05.2016, 08:13 #4
Ну тогда конструктор покажите
0
alexu_007
142 / 153 / 34
Регистрация: 29.05.2015
Сообщений: 1,094
25.05.2016, 08:24 #5
Таймер, чтобы сработал 1 раз при запуске программы - вывел сетку и объекты, и потом отключился. У меня что-то было похожее - в конструкторе рисовалось не по тем координатам, что по нажатию кнопки. Помог костыль с таймером.
0
CheBurashka21
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 5
25.05.2016, 09:59  [ТС] #6
Цитата Сообщение от alexu_007 Посмотреть сообщение
Таймер, чтобы сработал 1 раз при запуске программы - вывел сетку и объекты, и потом отключился. У меня что-то было похожее - в конструкторе рисовалось не по тем координатам, что по нажатию кнопки. Помог костыль с таймером.
Вставил singleShot-таймер, не помогло. Конструктор формы ниже.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    ui->setupUi(this);
    scale = 1;
    whatigettimer = new QTimer(this);
    whatigettimer->setInterval(20);
    whatigettimer->start();
    connect(whatigettimer, SIGNAL(timeout()),SLOT(whatiget()));
    connect(qApp, SIGNAL(aboutToQuit()), SLOT(killapp()));
    scene.setSceneRect(-3000,-3000, 6000,6000);
    scene.setBackgroundBrush(QColor(70,180,230));
    centerobj = 0;
    ui->graphicsView->setScene(&scene);
    ui->graphicsView->centerOn(0,0);
    ui->graphicsView->viewport()->installEventFilter(this);
    ui->graphicsView->fitInView(scene.sceneRect(),Qt::KeepAspectRatio);
    command.param.bottom=0;
    connect(ui->quit, &QAction::triggered, qApp, QApplication::quit);
    connect(ui->savegame, SIGNAL(triggered()), SLOT(savegame()));
    connect(ui->loadgame, SIGNAL(triggered()), SLOT(loadgame()));
    connect(qApp, SIGNAL(aboutToQuit()), SLOT(instrclose()));
    ui->graphicsView->ensureVisible(-3000, -3000, 6000, 6000, 0 ,0);
    ui->graphicsView->update();
    QTimer::singleShot(1, this, SLOT(mapnet()));
mapnet() успешно вызывается, но ничего не происходит, сетки нет, до первого масштабирования объекты по прежнему расставляются неверно.
0
mevn
136 / 103 / 23
Регистрация: 06.10.2008
Сообщений: 451
25.05.2016, 10:09 #7
А если добавить в конструктор
ui->graphicsView->scale(scale, scale);
Не поможет?
0
CheBurashka21
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 5
25.05.2016, 13:26  [ТС] #8
Цитата Сообщение от mevn Посмотреть сообщение
А если добавить в конструктор
ui->graphicsView->scale(scale, scale);
Не поможет?
Попробовал, не помогло. Эффект все тот же.

Добавлено через 3 часа 2 минуты
Небольшое дополнение - если сразу после запуска программы попробовать изменить размер экранной формы - все отрисуется при изменении размеров формы.

Если попробовать в конструкторе загрузить заранее подготовленное положение объектов из файла - объекты расставятся неверно, координатной сетки не будет. При масштабировании карты/изменении размеров формы - отрисуется координатная сетка, при УВЕЛИЧЕНИИ масштаба (scale+1) объекты расставятся верно.
0
CheBurashka21
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 5
31.05.2016, 15:03  [ТС] #9
Проблема решена.

Жестко задал размеры viewport у ui->graphicsview по размерам все того же graphicsview:

C++ (Qt)
1
ui->graphicsview->viewport()->setFixedSize(800,800)
При масштабировании уменьшаю размеры viewport'a под размеры со скорллбарами.
0
31.05.2016, 15:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2016, 15:03
Привет! Вот еще темы с решениями:

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

Code::Blocks 16.01, wxWidgets 3.0.3, TDM-GCC. Что не так при запуске exe-файла полученного приложения? (+)
Долго бился над связкой Code::Blocks и wxWidgets. Наконец добился, получил...

Автоматическое преобразование приложения в Graphics View
Здравствуйте. Я нарисовал интерфейс приложения в дизайнере. При этом в...

QGraphicsScene - addRect не рисует при изменении ширины линии
Хочу перекрасить рамку прямоугольника в другой цвет. Делаю это так: void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru