есть общий лончер, куда я подключаю формы класса Qt widget. Достигаю я этого следующим образом: Подключаю формы к главному окну и добавляю в центральный виджет с помощью setCentralWidget(). Далее если пользователь вызывает другое окно, то происходит все тоже самое. (Через switch).
Вопрос: могу ли я как-то сделать этот процесс динамическим. Через цикл или еще как-нибудь?
непонятен смысл всего этого действа. Во-первых, то, что вы называете "добавляю в центральный виджет" это не добавление, а установка этого виджета в качестве центрального. Я даже не представляю что происходит в этом случае с виджетом, который был центральным до этого, просто потому, что так никто никогда не делал. Причем здесь "система авторизации" и что такое "общий лончер" вообще непонятно. Надо бы как-то детальней раскрыть задачу. Начнём с вопроса: для чего это вообще?
Спасибо за ответ! Идея: Попытаюсь объяснить. Пытаюсь создать систему, которая проверяет данные пользователя (при авторизации) и предоставляет доступ к определенным приложениям. Причем приложения должны представлять из себя отдельную форму (которую мог создать другой человек, т.е. каждая форма представляет из себя отдельный модуль), которую подключаю в зависимости от прав пользователя. Реализация: Создаю главное окно. Изначально в центральном виджете находится необходимые элементы для проведения авторизации: два QLineEdit, и QPushButton. При нажатии на кнопку я обращаюсь к БД и получаю список доступных приложений для пользователя. Делаю это в цикле и закидываю в QMenuBar: QSqlQuery query = QSqlQuery(db); query.exec("select * from Application"); while(query.next()) { if (query.value(access) == "1") { auto *point = new QAction(query.value(0).toString()); point -> setObjectName(query.value(0).toString()); connect(point, SIGNAL(triggered()), this, SLOT(open())); ui -> menu_apps -> addAction(point); } } В слоте у меня имеется функция open(), при вызове которой в центральный виджет загружается выбранное приложение. Функцию open() я показывал ранее. Примерно как-то так )
самый главный вопрос - почему у вас всё происходит в одном окне? Обычно для авторизации делается отдельный диалог, а затем уже создавайте любое окно. Почему нужно в одном окно что-то на что-то менять то? Почему просто не создавать разные окна для разных задач?
Честно говоря в этом суть поставленной задачи ) Не я ее придумал. Что касательно авторизации, решил тоже вынести в отдельную форму, так как при смене виджета через setCentralWidget() предыдущий просто удаляется.
ну я лично вижу так задачу. Диалог авторизации - отдельное окно. Затем создаётся главное окно с передачей в параметре некоей переменной, которая обозначает роль пользователя. В конструкторе главное окно просто создаёт соответствующий роли виджет и устанавливает его в качестве центрального
Все верно. Только виджет должен быть отдельной формой, которую мог бы разрабатывать другой человек, не вдаваясь в подробности как он будет подключаться в центральное окно. Я сделал, но каждую форму подключаю отдельно через (switch или if / if else). А хотелось бы как-то сделать динамически. Так как форм может быть много. Я думал может быть их засунуть в какой-либо контейнер (вектор например), но они являются разными классами...
QVector<QWidget*>
В кьюте нет понятия "форма" там всё виджеты. И то, что вы называете формой это и есть виджет. И да, он может отдельно разрабатываться в дизайнере и храниться в файле ui. И да, его можно установить в качестве центрального виджета
что значит "динамически"? Вы когда в конструкторе создаете вашу форму (виджет) и устанавливаете его в качестве центрального - это разве не "динамическое" создание?
про "форм может быть много" не очень понятно. Одновременно? Так одновременно они все не могут быть центральными виджетами. Если же много отдельных окон, то в чём вообще проблема? Создавайте столько окон сколько нужно
Спасибо за объяснения! Я имею ввиду, чтобы не подключать через бесконечные if, а допустим в цикле
что в цикле то? цикл то что должен делать?
Нет. В программе может быть много. А от этого растут количество if
Обсуждают сегодня