Qt5 | Переходы между формами

238
19 апреля 2017, 13:43

Есть два класса, пусть будет Форма 1 и Форма 2, который созданы в Qt desinger. Я хочу их завязать между собой. в заголовочный файл Формы 1 подключаю заголовок формы 2, делаю указатель Form2 *test; в самой же форме создаю test = new Form2(); Всё работает, теперь можно добавить кнопку и переходить на Форму 2 или передавать какие либо данные из Формы 1 в Форму 2. НО! Если я хочу подключить Форму 3 и добавить в заголовок форму 2 и попытаться сделать вызов Формы 2, то получаю ошибки "непонятный тип". Добавлял в заголовочные файлы дополнительные строки class Form2; Всё компилируется, но при этом программа просто выдает критическую ошибку.

Схема такая, если я двигаюсь по формам в одном направлении, то все работает.

1->2->3->..->10

Если, я пытаюсь двигаться в разных направлениях.

1->2->3->4->2 = Не работает.

1->2->3->1 = Не работает.

1->2->3->4->1 = Не работает.

Answer 1

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

Допустим, мы имеем две формы - Form1 и Form2. В обоих классах описываем сигналы для отправки данных:

signals:
    void sendData(QVariant variant);

и слоты для получения данных:

public slots:
    voiв recieveData(QVariant variant);

В конструкторе Form1 соединяем сигналы отправки данных со слотами получения (допустим, что объект класса Form2 объявлен в классе Form1 и называется form2):

connect(this, SIGNAL(sendData(QVariant), form2, SLOT(recieveData(QVariant));  //отправка данных из Form1 в Form2
connect(form2, SIGNAL(sendData(QVariant), this, SLOT(recieveData(QVariant));  //отправка данных обратно из Form2 в Form1

Теперь если мы в Form1 испустим сигнал с какими-то данными, в Form2 будет вызывана функция получения данных: emit sendData(QVariant("MyCoolData");

И наоборот, для пересылки данных из Form2 в Form1 испускаем сигнал из Form2 аналогичным способом.

Будьте внимательны, чтобы испускание сигналов не привело к бесконечному цикличному вызову слотов.

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

READ ALSO
Разбиение кода на функции. С++

Разбиение кода на функции. С++

Есть код программы, которая позволяет ввести динамический массив, а затем 1Упорядочивает элементы массива по возрастанию

258
Возвращение значения

Возвращение значения

Мне нужно, чтобы в случае неверного ввода password запрашивало password до тех пор пока не будет password верен

160
Рекурсивная функция - C++ [требует правки]

Рекурсивная функция - C++ [требует правки]

Нужно написать функцию, которая с помощью рекурсии могла бы найти введенное значение, без рекурсии вроде бы как сделалВот код

243
Создание АТД “Стек” на основе массива - C++

Создание АТД “Стек” на основе массива - C++

"Реализуйте АТД “стек” на основе массива фиксированного размера для элементов, являющихся односвязными списками целых чисел (те

203