Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73

Qt C++, QPointF

28.11.2019, 02:11. Показов 4377. Ответов 71

Студворк — интернет-сервис помощи студентам
Всем добрый вечер.
Вопрос такой.

Есть кусок функции.

C++ (Qt)
1
2
3
4
5
6
7
8
9
void Citymap::func1(int a, int b)
{
    int y = a + b;
    qDebug() << "Result" << y;
    reloadmap();
    double x = 37.775631;
    mc->setView(QPointF(x,55.787710)); //первоначальная точка
    mc->setZoom(17);
}

Когда вызываю напрямую из этой же формы - все работает. (карта перемещается на нужную точку)

Но стоит мне вызвать из другой формы...

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
    do_calc = new Citymap;
    connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(prepare_data()));
    connect(this, SIGNAL(send_data_for_calc(int,int)), do_calc, SLOT(func1(int,int)));
 
void regi::prepare_data()
{
    int a = 0;
    int b = 5;
    emit send_data_for_calc(a, b);
}
как дебаг по прежнему отображается, а вот переход на карте не происходит.

Помогите, пожалуйста разобраться в чем причина. Мучаюсь неделю уже.

Планировал передавать координаты из другой формы, но он даже с заданными координатами не хочет работать.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2019, 02:11
Ответы с готовыми решениями:

Нелады с void QGraphicsView::centerOn ( const QPointF & pos )
есть scene, view. Нажимая на кнопку на форме добавляются точки в scene, причем координаты по х монотонно возрастают, т.е....

Класс QPointF: name 'QPointF' is not defined
Вылетает ошибка NameError: name 'QPointF' is not defined Что не так? import sys, random class Top: top = QPointF(2.0,5.0)...


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

Или воспользуйтесь поиском по форуму:
71
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73
02.12.2019, 15:52  [ТС]
Студворк — интернет-сервис помощи студентам
Байт,

Спасибо огромное, а можно ссылочку/ литературу?
И что именно поможет в решении данной задачи?
Познавать новое очень люблю, но курсач горит(

Добавлено через 3 часа 21 минуту
Но система свойств обладает еще одним замечательным свойством. Не имеющим отношения к Q_PROPERTY и всей лабуды с ним связанной. Это просто возможность экземпляру уже существующего класса давать новые поля. Без создания своего класса-наследника.
В вашем случае это поле - просто уникальный номер. Могут быть и другие привязки. Например, у меня виджет был связан с неким текстом. Виджеты все одинаковые, а тексты разные. Неужто новый класс-наследник создавать? Не надо! Добавил свойство и все дела. Или каким-то виджетам одного класса что-то разрешается (по логике моей программы), а другим нет. Добавил булевое свойство - и нет забот.
Когда я этот механизм открыл (не так давно) - жить стало много веселей.

Можете подробнее об этом рассказать, очень многое из этого непонятно.
Как можно добавить свойство?

Добавлено через 2 часа 3 минуты
Случайно попалась эта ссылка. Буду разбираться.

Как вычисленное значение с одной формы передать на другую?

Добавлено через 35 минут
Алексей1153,

Можете помочь с коннектом сигнала?
Знаю, что не самое лучшее решение, но осталось неделя до сдачи(
С property не смог разобраться(
0
фрилансер
 Аватар для Алексей1153
6501 / 5734 / 1134
Регистрация: 11.10.2019
Сообщений: 15,352
02.12.2019, 16:00
Цитата Сообщение от ivankillerg Посмотреть сообщение
Можете помочь с коннектом сигнала?
я за темой сильно не следил, в чём именно сложность осталась, вкратце?
0
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73
02.12.2019, 16:02  [ТС]
Алексей1153,

Байт посоветовал использовать property и QVariant, однако у меня не хватило уровня знаний, чтобы в этом разобраться.

Поэтому решил как временный вариант использовать Ваше решение, однако не совсем понимаю как правильно его подключить.
0
фрилансер
 Аватар для Алексей1153
6501 / 5734 / 1134
Регистрация: 11.10.2019
Сообщений: 15,352
02.12.2019, 16:11
как пользоваться свойствами - да элементарно.
C++ (Qt)
1
2
3
4
5
6
7
    QObject o;//тут любой класс, производный от QObject
    
    o.setProperty("abcd",10);
    o.setProperty("ой ой","да да");
    
    int val1=o.property("abcd").toInt();
    QString val2=o.property("ой ой").toString();
Насчёт коннекта.
Как бы я поступил, ковыряясь в чужом проекте и имея немного времени. Нелюбителям глобальных переменных просьба закрыть глаза

Делаю класс CMySignals, производный от QObject. У него сигнал Update.
Объявляю глобальный объект
CMySignals global_MyUpdater;

Где-то в глубинах проекта создался mc = new MapControl(QSize(380,540)); , его слот update соединяем с сигналом global_MyUpdater.

Как известно, сигнал можно соединять с сигналом, получаем этакий каскад.

Сигнал от кнопки можно соединить с сигналом global_MyUpdater.
В общем, любым способом срабатываем сигнал global_MyUpdater, он пинает все объекты, связанные с ним.
0
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73
02.12.2019, 19:30  [ТС]
Алексей1153,

Все элементарно, даже завидно)
А можете книжечку посоветовать?) Чтобы тоже элементарно было
0
фрилансер
 Аватар для Алексей1153
6501 / 5734 / 1134
Регистрация: 11.10.2019
Сообщений: 15,352
02.12.2019, 19:39
ivankillerg, книжки не знаю, постепенно само узнавалось по интернету
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
02.12.2019, 21:22
Цитата Сообщение от ivankillerg Посмотреть сообщение
А можете книжечку посоветовать?)
Книжек на русском есть всего две. Шлее да Бланшет с Саммерфилдом. Для продвижения - Саммерфилд в одиночку. Это вводная. Далее - Ассистент, Дока и своя Голова. И интернет, конечно. Знающим Englllish много проще. Я, к сожалению, к таким не отношусь.
Но имхо, важнее всех именно Голова.
0
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73
02.12.2019, 22:44  [ТС]
Делаю класс CMySignals, производный от QObject. У него сигнал Update.

Уже на этом этапе вопрос.
Делать класс это как ? Еще и производный от qobject...

Можете помочь? Тоже по интернету учусь и на основе текущих задач, тк с теорией все плохо, увы.

Это вот так?

C++ (Qt)
1
2
3
4
5
6
7
class CMySignals : public QMainWindow
{
    Q_OBJECT
 
signals:
    void update();
};
0
фрилансер
 Аватар для Алексей1153
6501 / 5734 / 1134
Регистрация: 11.10.2019
Сообщений: 15,352
02.12.2019, 22:49
ivankillerg,
C++ (Qt)
1
2
3
4
5
6
class CMySignals : public QObject
{
    Q_OBJECT
signals:
    void Update();
};
0
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73
02.12.2019, 22:52  [ТС]
Алексей1153,

Благодарю за поправку.

Вот с этим что делать?
Объявляю глобальный объект
CMySignals global_MyUpdater;

Не совсем понял где это обьявить/
как я понял этот обьект создается и в cpp и в h файлах?


Взято из интернета

Существует масса способов создать глобальный объект. Самый простой — объявить extern-переменную в заголовочном файле и создать её экземпляр в cpp:

C++ (Qt)
1
2
3
4
// header file
extern Foo g_foo;
// cpp file
Foo g_foo;
0
фрилансер
 Аватар для Алексей1153
6501 / 5734 / 1134
Регистрация: 11.10.2019
Сообщений: 15,352
02.12.2019, 22:56
ivankillerg, почитай теорию, чтобы знать преимущества и опасности глобальных переменных
(это первые попавшиеся ссылки из интернета)
https://ravesli.com/urok-49-globalnye-peremennye/
Глобальные переменные
0
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73
02.12.2019, 22:59  [ТС]
Алексей1153,


получается должен примерно такое сделать.

C++ (Qt)
1
2
3
4
5
6
7
8
9
class CMySignals : public QObject
{
    Q_OBJECT
extern  CMySignals global_MyUpdate;
    
    
signals:
    void update();
};
Но компилятор выдает ошибку

Добавлено через 50 секунд
Алексей1153,

Благодарю, ушел читать.
0
фрилансер
 Аватар для Алексей1153
6501 / 5734 / 1134
Регистрация: 11.10.2019
Сообщений: 15,352
02.12.2019, 23:00
ivankillerg, внимательно по первой ссылке читай. Там и примеры есть
0
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73
02.12.2019, 23:28  [ТС]
?Алексей1153,


Аналогично, если вы хотите сделать глобальную переменную внешней (которую можно использовать в любом файле программы) — используйте ключевое слово extern:


#include <iostream>

extern double g_y(9.8); // g_y - это внешняя глобальная переменная и её можно использовать и в других файлах программы

int main()
{
return 0;
}

#include <iostream>

extern double g_y(9.8); // g_y - это внешняя глобальная переменная и её можно использовать и в других файлах программы

int main()
{
return 0;
}

Так понимаю мне что-то вроде этого нужно
0
фрилансер
 Аватар для Алексей1153
6501 / 5734 / 1134
Регистрация: 11.10.2019
Сообщений: 15,352
02.12.2019, 23:42
ivankillerg, вот там, где у тебя extern double g_y(9.8); - там объявляешь (без extern)

C++
1
CMySignals global_MyUpdate;
а в других cpp-файлах, где хочешь видеть данную переменную, так же в глобальной области объявляешь

C++
1
extern CMySignals global_MyUpdate;
0
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73
03.12.2019, 10:11  [ТС]
Алексей1153,

Такой вопрос, сейчас залез в фаил

citymap.h (где находится mc )
и увидел вот такую вещь

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
29
30
class QLabel;
 
using namespace qmapcontrol;
class Citymap: public QMainWindow
{
        Q_OBJECT
        public:
                Citymap(QWidget* parent = 0);
                ~Citymap();
                QMessageBox*mesbd;
                MapControl* mc;
                int x, y;
 
        private:
                QSqlDatabase db;
 
 
                MapAdapter* mapadapter;
                QPixmap* notepixmap;
                Layer* sights;
                Layer* museum;
                Layer* pubs;
                Layer* notes;
 
                void addZoomButtons();
                void reloadmap();
                void createTours();
                void createActions();
                void createMenus();
                //void addNote();
Это получается и есть те самые глобальные переменные?

Просто до этого не обращал внимания на using naespace тк не знал что это

Добавлено через 33 минуты
C глобальными переменными разобрался, вроде все легко.

citymap.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
namespace Coordinates
{
    // Фактические глобальные переменные
    extern  double pi(3.14159);
    extern  double avogadro(6.0221413e23);
    extern  double my_gravity(9.2);
    extern  double g_x(5.1);
}
citymap.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
namespace Coordinates
{
 
    extern double pi;
    extern double avogadro;
    extern double my_gravity;
    extern double g_x;
    // ... другие константы
}
regi.cpp

C++ (Qt)
1
qDebug() << "Result" << Coordinates::g_x;
А вот с сигналами не получается.
0
фрилансер
 Аватар для Алексей1153
6501 / 5734 / 1134
Регистрация: 11.10.2019
Сообщений: 15,352
03.12.2019, 10:37
ivankillerg, нет, в первом файле нет глобальных переменных.

В citymap.cpp - это у тебя константы, их не надо делать глобальными переменными. Вообще, не увлекайся глобальными переменными, это должен быть очень нечастый костыль! В идеале - вообще без глобальных переменных лучше.

namespace - это область видимости

Пример сейчас нарисовать не могу, занят немножко. Может, кто другой пока поможет
0
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73
03.12.2019, 11:52  [ТС]
Алексей1153,

У меня mc связано с пространством имен файлов qmapcontrol...

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

Базу данных написал. Карта готова, а связать их уже 3 недели не могу..
0
фрилансер
 Аватар для Алексей1153
6501 / 5734 / 1134
Регистрация: 11.10.2019
Сообщений: 15,352
03.12.2019, 12:29
ivankillerg,

1) пост №29 - класс CMySignals. Оформляешь в отдельном "CMySignals.h" файле.
2) в файле, где у тебя main(), после всех инклудов добавляешь объявление переменной

C++
1
2
3
#include "CMySignals.h"
...
CMySignals global_MyUpdater;
4) в файле, где ты хочешь видеть эту переменную после всех инклудов добавляешь

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "citymap.h"
#include <QTextEdit>
#include <QVBoxLayout>
#include <QApplication>
#include <QPushButton>
#include <QAction>
#include <QMenuBar>
#include <QStatusBar>
#include <QLabel>
#include <QTimer>
 
#include "CMySignals.h"
 
extern CMySignals global_MyUpdater;
 
Citymap::Citymap(QWidget*)
{
    mc = new MapControl(QSize(380,540));
    mc->showScale(true);
 
    connect(&global_MyUpdater, global_MyUpdater->Update, mc, mc->update);
...
а где-то в конструкторе твоего MainWindow соединяешь с кнопкой (или от чего там должен срабатывать сигнал)

C++
1
2
3
4
5
6
7
8
9
#include "CMySignals.h"
 
extern CMySignals global_MyUpdater;
 
...конструктор...
{
    ...
    connect(ui->my_bytton, ui->my_bytton->clicked, &global_MyUpdater, global_MyUpdater->Update);
    ...
всё. При нажатии на кнопку сигнал clicked улетит в global_MyUpdater, тот испустит Update, который попадёт в mc
0
0 / 0 / 1
Регистрация: 30.04.2015
Сообщений: 73
03.12.2019, 15:55  [ТС]
Алексей1153,
1. Пост 29 сделал

2. В фаил main.cpp добавил

3.пункт - долго искал так и не нашел.

4пункт - при попытке ввести -> Update каждый раз "->" заменяется на точку
connect не подсвечивается, выводит ошибку(

member reference type "CMySignals" is not a pointer
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru