Russian Qt Forum
Июля 02, 2025, 10:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с несколькими немодальными диалогами  (Прочитано 6220 раз)
zauzza
Гость
« : Июня 12, 2011, 23:49 »

Имеется список объектов. Для каждого по сигналу interact(int id) можен быть вызван немодальный диалог. Вопросы:
1) Как после завершения диалога узнать, к какому объекту он относился?
2) Нужно чтобы если диалог для какого-то объекта открыт, то новый не открывался.

Код примерно такой:
Код:
class A: public QObject
{
    Q_OBJECT

public:
    A() { /* populating m_objects */ }

public slots:
    void interact(int id)
    {
        Dialog dlg = new Dialog(...);
        connect(dlg, SIGNAL(finished(int)), this, SLOT(dialogFinished(int)));
        dlg.show();
    }

    void dialogFinished(int result)
    {
        // How to find out to what object this result is related?
    }

private:
    QList<B> m_objects;
 };
« Последнее редактирование: Июня 13, 2011, 00:20 от zauzza » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июня 13, 2011, 00:06 »

1) ну так считать id диалога, отправившего сигнал (sender()) - этот параметр же для этого предназначен?
2) findChildren<Dialog>() и пройтись по этому списку поискать существующий id (он хранится для открытых объектов в m_objects я так понимаю)

з.ы. при использовании макросов SIGNAL и SLOT имена параметров писать не нужно - только их типы
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
zauzza
Гость
« Ответ #2 : Июня 13, 2011, 00:19 »

Да, по поводу второго, я действительно затупил. Всё очень просто.

А вот насчет sender()... Насколько я понимаю, его вообще не рекомендуется использовать. Может есть какой-то другой, более правильный способ?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июня 13, 2011, 00:30 »

Цитата: assistant
Warning: This function violates the object-oriented principle of modularity. However, getting access to the sender might be useful when many signals are connected to a single slot.
вторая часть утверждения как раз для твоего случая

не нравится sender() - храни список указателей на открытые диалоги в классе (хотя опять же можно воспользоваться findChildren<Dialog>() вместо этого) и для каждого элемента считывай свойство закрылся ли диалог чтоб найти нужный
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
zauzza
Гость
« Ответ #4 : Июня 13, 2011, 01:09 »

А нормально будет так подредактировать диалог: соединить сигнал finished(int result ) с каким-нибудь слотом и отправить оттуда сигнал finished(int result, int id)? Тогда вообще никаких дополнительных данных хранить не придется.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Июня 13, 2011, 03:13 »

у слота не может быть параметров больше, чем у сигнала. можешь соединить finished(int) с каким-то приватным слотом, который будет отправлять другой сигнал mySignal(result, id)
« Последнее редактирование: Июня 13, 2011, 03:14 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июня 13, 2011, 08:27 »

Имеется список объектов. Для каждого по сигналу interact(int id) можен быть вызван немодальный диалог. Вопросы:
1) Как после завершения диалога узнать, к какому объекту он относился?
Конечно так делать не запрещено, но смысл "немодальности" в том что ввод одного параметра принимается/отрабатывается приложением сразу (ну возможно с задержкой для текста). Обычно немодальный диалог создается для каждого типа объекта (а не экземпляра объекта), и когда пользователь сменил объект (на др. того же типа) диалог заряжается новыми данными. А иначе - если пользователь что-то ввел и переключился на др. окно - ситуация тупиковая
Записан
zauzza
Гость
« Ответ #7 : Июня 13, 2011, 09:57 »

у слота не может быть параметров больше, чем у сигнала. можешь соединить finished(int) с каким-то приватным слотом, который будет отправлять другой сигнал mySignal(result, id)
Да, я это и имел в виду. Спасибо большое за ответы Улыбающийся

Конечно так делать не запрещено, но смысл "немодальности" в том что ввод одного параметра принимается/отрабатывается приложением сразу (ну возможно с задержкой для текста). Обычно немодальный диалог создается для каждого типа объекта (а не экземпляра объекта), и когда пользователь сменил объект (на др. того же типа) диалог заряжается новыми данными. А иначе - если пользователь что-то ввел и переключился на др. окно - ситуация тупиковая
Возможно я что-то неверно понял... Ну вот, допустим, мой список объектов - это список файлов. И по сигналу interact(int id) я хочу показать диалог свойств для файла my_objects[id]. Блокировать основную программму мне не зачем.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июня 13, 2011, 10:19 »

Возможно я что-то неверно понял... Ну вот, допустим, мой список объектов - это список файлов. И по сигналу interact(int id) я хочу показать диалог свойств для файла my_objects[id]. Блокировать основную программму мне не зачем.
Стоит подумать нужно ли каждому файлу свое окно, гораздо чаще проще и лучше использовать одно (которое заряжается при выборе файла). В любом случае изменения сделанные в немодальном окне должны приниматься сразу. а не при его закрытии
Записан
zauzza
Гость
« Ответ #9 : Июня 13, 2011, 10:29 »

Ну а что плохого в том, что мы, например, из файлового менеджера можем открыть несколько диалогов свойств для нескольких файлов? Например пользователь открывает диалог, чтобы поменять права доступа файла, но потом решает проверить для начала права доступа какого-то другого файла. Не терять же ему теперь первый диалог.
« Последнее редактирование: Июня 13, 2011, 11:28 от zauzza » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июня 13, 2011, 19:42 »

Ну а что плохого в том, что мы, например, из файлового менеджера можем открыть несколько диалогов свойств для нескольких файлов? Например пользователь открывает диалог, чтобы поменять права доступа файла, но потом решает проверить для начала права доступа какого-то другого файла. Не терять же ему теперь первый диалог.
Ничего плохого, напр так делает Finder. Просто есть вероятность что разрешая пользователю открыть N окон, Вы, возможно, усложняете задачу без необходимости. Напр. а как выбрать 1 окно из 10 открытых - нужно добавлять их в меню Window или что-то еще. Нужен inline-editor для ввода строк, сброс его фокуса при переключении и.т.п. Если Вы все это обдумали и учли - на здоровье. А если "просто так" - то может лучше пойти более простым/стандартным путем
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Июня 13, 2011, 21:00 »

Цитата: Igors
Просто есть вероятность что разрешая пользователю открыть N окон, Вы, возможно, усложняете задачу без необходимости. Напр. а как выбрать 1 окно из 10 открытых - нужно добавлять их в меню Window или что-то еще.
Обычно для диалогов, а не "top-level windows" так не делается. Finder-а под рукой нет, но в том же Проводнике можно открыть несколько диалогов без всякого списка.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июня 14, 2011, 00:03 »

Finder-а под рукой нет, но в том же Проводнике ...
Finder и есть Проводник (Explorer) на Mac  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.022 секунд. Запросов: 19.