Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
 Аватар для Ender Che
521 / 411 / 77
Регистрация: 29.05.2018
Сообщений: 1,366

Как передавать массивы данных в QWizard между страницами?

07.10.2025, 21:59. Показов 2212. Ответов 29
Метки нет (Все метки)

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

Собственно, сабж.

У меня на одной из страниц заполняется QTableView на один столбец (так удобнее, чем QListView, так как есть по дефолту разметка ячеек линиями). Таких вьюх пять штук. Хотелось бы это всё где-то на следующих шагах использовать. Но как? Передать дальше можно только простые поля типа текстового поля ввода или чекбокса. А мне нужно массив моделей с данными (или что?) передать. Внятного механизма в примерах нет.

Можно, конечно, воспользоваться глобальными переменными. Но это, имхо, как-то топорно.

Или вообще отказаться отказаться от визарда и пилить свой "визард" на подчинённых виджетах главному виджету, заменяя их по очереди по кнопке? Там, по крайней мере, спокойно можно будет использовать геттеры любых структур данных.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.10.2025, 21:59
Ответы с готовыми решениями:

Как перерисовать рамку в QWizard
Хочу перерисовать рамку в QWizard, но столкнулся с проблемой... Вот как сейчас выглядит мой...

QWizard кнопка "Finish"
Здравствуйте уважаемые знатоки, изучаю класс QWizard и не могу понять как отследить нажатие кнопки...

QWizard flags
Привет! Возникла проблема со скрытием области вокруг окна мастера (QWizard) и заголовки окна,...

29
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
11.10.2025, 00:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Ender Che Посмотреть сообщение
попробую пока свой, со статикой
Раз уж так, то можно сделать свой кастомный класс от QWizard и разместить там свое хранилище данных и типы, а так как страница может получить доступ к своему визарду- то любая из них сможет читать/писать централизованные данные и знать типы.
схематично
Кликните здесь для просмотра всего текста

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
class Wizard : public QWizard
{
     private:
         QVariantMap ndata;
     public:
         using QWizard::QWizard;
         QVariantMap& data()const{return ndata;}         
};
 
 
class Page : public QWizardPage
{
public:
    using QWizardPage::QWizardPage;
 
    void sendData(){
        if(auto wiz=wizard()){
             wiz->data().insert("some", someValue);
        }
    }
 
    void initializePage(){
        if(auto wiz=wizard()){
             for(auto &val : wiz->data()){
                 ...
             }
        }
    }
};
2
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
11.10.2025, 01:11
Цитата Сообщение от Ender Che Посмотреть сообщение
Только я не врубаюсь, как правильно с областью видимости работать, чтобы объявленная структура везде была видна.
Нет, нет. нет. Я не донес свою позицию ясно, моя вина.
Это только на самый крайний случай и то, если уже пришлось, значит проектирование было не самым удачным.
Я про разделение ответственности и декомпозиции.
Вот например все страницы визарда должны с данными из других.
Значит эти данные должны бить не в них, а извне. Даже если они формируются в них, данные отдаются ответственному за это объекту. Другие страницы визарда запрашивают эти данные у того самого ответственного объекта, или ещё лучше, он их заполняет при открытии страницы.
Чем больше виджеты(особенно подчиненные) будут знать про других, тем теснее будет связь и тем сложнее будет поддержка, модификация и масштабируемость кода(и отладка тоже).

Нужно взять карандаш(или спец инструмент построения диаграмм) и разделить ответственности.
Кто за что будет отвечать.

И классика, данные отдельно - виджеты отдельно. Чем дальше они друг от друга, тем лучше.

Это вопрос проектирования, но никак не конкретный для текущего обсуждаемого виджета.

Добавлено через 1 минуту
p.s. QWizard мне не нравится вообще, ни одна из его реализаций... Что это, для чего....

Добавлено через 2 минуты
Цитата Сообщение от sdf45 Посмотреть сообщение
Раз уж так, то можно сделать свой кастомный класс от QWizard
Так часто делается для виджетов. Если всё это используется и создается только в нем, то это самый правильный путь.
1
 Аватар для Ender Che
521 / 411 / 77
Регистрация: 29.05.2018
Сообщений: 1,366
11.10.2025, 06:36  [ТС]
Цитата Сообщение от sdf45 Посмотреть сообщение
так как страница может получить доступ к своему визарду
А она правда может?
Цитата Сообщение от SmallEvil Посмотреть сообщение
все страницы визарда должны с данными из других
Не все, только некоторые.
Цитата Сообщение от sdf45 Посмотреть сообщение
Раз уж так, то можно сделать свой кастомный класс от QWizard и разместить там свое хранилище данных и типы
У меня, собственно, и так кастомный класс от визарда есть. Всё по примеру из доки лепил. Ну, тогда жизнь налаживается.))

Annemesski, SmallEvil, sdf45, перефразируя Холмса из известной ленты Масленникова про собаку Баскервилей: вот так начнёшь хотеть странного от кода, и уверуешь в паттерны программирования.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
11.10.2025, 14:21
Цитата Сообщение от Ender Che Посмотреть сообщение
Не все, только некоторые.
Не воспринимай всё так буквально.
Страницы визарда по прежнему могут отдавать данные извне и заполняться. Этого никто не отменял.

Добавлено через 1 минуту
Вот в этом и вопрос. Общие данные для Визарда - обычное дело.
Почему это нигде(ни в одном фреймворке) не прикручен для этого механизм.
Но в Qt, кажется нашел.


Добавлено через 1 минуту
А вот это не подойдет?
QVariant QWizard::field(const QString &name) const
Returns the value of the field called name.

This function can be used to access fields on any page of the wizard.

See also QWizardPage::registerField(), QWizardPage::field(), and setField().
Добавлено через 3 минуты
Цитата Сообщение от Ender Che Посмотреть сообщение
так как страница может получить доступ к своему визарду
А она правда может?
Да.
QWizard * wizard() const
2
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
11.10.2025, 14:40
Цитата Сообщение от Ender Che Посмотреть сообщение
А она правда может?
Цитата Сообщение от sdf45 Посмотреть сообщение
получать на странице указатель визарда, к которому она подключена QWizardPage::wizard()


Цитата Сообщение от SmallEvil Посмотреть сообщение
QVariant QWizard::field(const QString &name) const
я в 5м посте выложил пример с ним. Проблема тут в том, что поле регистрируется от свойства виджета, а если надо передать например, все итемы QTableView, то свойства items() нет у представления или его модели, поэтому приходится добавить его через Q_PROPERTY - что вроде как не особо сложно, но Ender Che не зашло почему-то.

Переписал свой пример в варианте 21-го поста - выглядит более громоздко, надо подключать для каждой страницы заголовочник кастомного визарда, данные еще ж дублируются... Если надо-выложу, но я все же работал бы через поля визарда, раз они есть.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
11.10.2025, 15:00

Не по теме:

Цитата Сообщение от sdf45 Посмотреть сообщение
я в 5м посте выложил пример с ним.
Значит я был невнимателен. Там много текста. (Много букавок!)


Цитата Сообщение от sdf45 Посмотреть сообщение
все итемы QTableView, то свойства items() нет у представления или его модели
Можно передать указатель на модель?
Сформировать любой другой тип?
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
11.10.2025, 15:37
SmallEvil, наверное, тут может быть 100500 вариантов...
Вот еще раньше Annemesski написал:
Цитата Сообщение от Annemesski Посмотреть сообщение
так почему бы вашему визарду не завладеть указателями на эти модели и не тянуть данные собственно через них хоть откуда угодно?
по сути, вариант 21-го поста - эти же фаберже.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Сформировать любой другой тип?
Вот кстати, как еще один из вариантов, в Qt есть Q_DECLARE_METATYPE и qRegisterMetaType(), видимо альтернатива или дополнение к Q_PROPERTY, но я в это не вникал и не юзал.
0
 Аватар для peter_irich
371 / 227 / 53
Регистрация: 18.10.2017
Сообщений: 2,437
11.10.2025, 16:47
sdf45, сейчас посмотрел в старой программе: там в meta.h есть строка
C++
1
Q_DECLARE_METATYPE(QAbstractSocket::SocketError)
в cpp-файле строка
C++
1
qRegisterMetaType < QAbstractSocket::SocketError > ();
в более новой программе только 2-я из этих строк.
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
11.10.2025, 18:07
peter_irich, не разбирался, не юзал. Может, неправильно понял назначение. Во всяком случае, насколько я понял при беглом просмотре доки-позволяет кастовать в/из QVariant свои типы, что уже полезно. Во всяком случае - это для данной темы оффтоп, наверное я зря упомянул, не зная контекста.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
22.10.2025, 15:40
Не знаю актуальна ли тема, но рискну предложить свой вариант (надеюсь я правильно понял суть проблемы), хотя он частично уже высказан другими форумитами. И так я бы отнаследовался от QWizard, включил в него все данные и модели, а классы наследники QWizardPage объявил бы его друзьями. Указатель на QWizard по хорошему должен передаваться в конструктор QWizardPage как parent, но это надо проверить. В любом случае этот указатель можно передать явно и любая страница будет иметь доступ к общим данным QWizard в любом месте и в любой момент.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.10.2025, 15:40

QWizard
Всем добрый день. Задание: есть 3 окна : в 1 вводиться имя, в 2 ставим значок(что выбрали) и в 3...

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

Как лучше передавать данные в сервер базы данных
Добрый день. Есть приложение по управлению проектами aka сервер базы данных проектов. Есть сами...

Как правильно передавать массив через сигнал-слот
Перепробовал много разных форм, но так и не смог осилить и вернул к тому, с чего начал. В...

Форматированный вывод данных типа float, передаваемых в QML через сигнал?
Приветствую. Имеется форма, написанная на QML, которая принимает некое значение 'X' и отсылает...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru